青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

      遠(yuǎn)程線程作為一項"合法"的代碼注入技術(shù),在windows上被大量使用, 它的本質(zhì)就是把一塊可執(zhí)行代碼寫入到對方進程,然后讓其起運行起來。

      一般它的實現(xiàn)過程是這樣的, 通過VirtualAllocEx在目標(biāo)進程分配內(nèi)存空間,然后通過WriteProcessMemory將我們的可執(zhí)行代碼寫入到目標(biāo)進程,最后通過CreateRemoteThread讓我們的可執(zhí)行代碼在目標(biāo)進程里運行起來。

     一般實現(xiàn)遠(yuǎn)程線程有2種方法, 一種是《windows核心編程》里介紹的,通過線程函數(shù)和LoadLibrary API函數(shù)申明的相似性, 直接在目標(biāo)進程里調(diào)用LoadLibrary加載我們DLL,這樣我們只要在DLL_PROCESS_ATTACH里執(zhí)行我們的代碼就可以了。代碼如下, 通過InjectLib在目標(biāo)進程加載我們的DLL, 通過EjectLib卸載我們的DLL:
///////////////////////////////////////////////////////////////////////////////
BOOL WINAPI InjectLibW(DWORD dwProcessId, PCWSTR pszLibFile) 
{

   BOOL fOk = FALSE; // Assume that the function fails
   HANDLE hProcess = NULL, hThread = NULL;
   PWSTR pszLibFileRemote = NULL;

   __try {
      // Get a handle for the target process.
      hProcess = OpenProcess(
         PROCESS_QUERY_INFORMATION |   // Required by Alpha
         PROCESS_CREATE_THREAD     |   // For CreateRemoteThread
         PROCESS_VM_OPERATION      |   // For VirtualAllocEx/VirtualFreeEx
         PROCESS_VM_WRITE,             // For WriteProcessMemory
         FALSE, dwProcessId);
      if (hProcess == NULL)
      {
          __leave;
      }

      // Calculate the number of bytes needed for the DLL's pathname
      int cch = 1 + lstrlenW(pszLibFile);
      int cb  = cch * sizeof(WCHAR);

      // Allocate space in the remote process for the pathname
      pszLibFileRemote = (PWSTR) 
         VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
      if (pszLibFileRemote == NULL)
      {      
         __leave;
      }

      // Copy the DLL's pathname to the remote process's address space
      if (!WriteProcessMemory(hProcess, pszLibFileRemote, 
         (PVOID) pszLibFile, cb, NULL))
      {      
         __leave;
      }

      // Get the real address of LoadLibraryW in Kernel32.dll
      PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
         GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
      if (pfnThreadRtn == NULL)
      {
          __leave;
      }


      // Create a remote thread that calls LoadLibraryW(DLLPathname)
      hThread = CreateRemoteThread(hProcess, NULL, 0, 
         pfnThreadRtn, pszLibFileRemote, 0, NULL);
      if (hThread == NULL)
      {
         __leave;
      }

      // Wait for the remote thread to terminate
      WaitForSingleObject(hThread, INFINITE);

      fOk = TRUE; // Everything executed successfully
   }
   __finally { // Now, we can clean everthing up

      
// Free the remote memory that contained the DLL's pathname
      if (pszLibFileRemote != NULL) 
         VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);

      if (hThread  != NULL) 
         CloseHandle(hThread);

      if (hProcess != NULL) 
         CloseHandle(hProcess);
   }

   return(fOk);
}


///////////////////////////////////////////////////////////////////////////////


BOOL WINAPI InjectLibA(DWORD dwProcessId, PCSTR pszLibFile) 
{

   // Allocate a (stack) buffer for the Unicode version of the pathname
   PWSTR pszLibFileW = (PWSTR) 
      _alloca((lstrlenA(pszLibFile) + 1) * sizeof(WCHAR));

   // Convert the ANSI pathname to its Unicode equivalent
   wsprintfW(pszLibFileW, L"%S", pszLibFile);

   // Call the Unicode version of the function to actually do the work.
   return(InjectLibW(dwProcessId, pszLibFileW));
}


///////////////////////////////////////////////////////////////////////////////


BOOL WINAPI EjectLibW(DWORD dwProcessId, PCWSTR pszLibFile) 
{

   BOOL fOk = FALSE; // Assume that the function fails
   HANDLE hthSnapshot = NULL;
   HANDLE hProcess = NULL, hThread = NULL;

   __try {
      // Grab a new snapshot of the process
      hthSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);
      if (hthSnapshot == INVALID_HANDLE_VALUE)
      {
         __leave;
      }

      // Get the HMODULE of the desired library
      MODULEENTRY32W me = { sizeof(me) };
      BOOL fFound = FALSE;
      BOOL fMoreMods = Module32FirstW(hthSnapshot, &me);
      for (; fMoreMods; fMoreMods = Module32NextW(hthSnapshot, &me)) {
         fFound = (lstrcmpiW(me.szModule,  pszLibFile) == 0) || 
                  (lstrcmpiW(me.szExePath, pszLibFile) == 0);
         if (fFound) break;
      }
      if (!fFound)
      {
         __leave;
      }

      // Get a handle for the target process.
      hProcess = OpenProcess(
         PROCESS_QUERY_INFORMATION |   // Required by Alpha
         PROCESS_CREATE_THREAD     | 
         PROCESS_VM_OPERATION,  // For CreateRemoteThread
         FALSE, dwProcessId);
      if (hProcess == NULL)
      {    
         __leave;
      }

      // Get the real address of LoadLibraryW in Kernel32.dll
      PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
         GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "FreeLibrary");
      if (pfnThreadRtn == NULL)
      {
         __leave;
      }

      // Create a remote thread that calls LoadLibraryW(DLLPathname)
      hThread = CreateRemoteThread(hProcess, NULL, 0, 
         pfnThreadRtn, me.modBaseAddr, 0, NULL);
      if (hThread == NULL)
      {
         __leave;
      }

      // Wait for the remote thread to terminate
      WaitForSingleObject(hThread, INFINITE);

      fOk = TRUE; // Everything executed successfully
   }
   __finally { // Now we can clean everything up

      if (hthSnapshot != NULL) 
         CloseHandle(hthSnapshot);

      if (hThread     != NULL) 
         CloseHandle(hThread);

      if (hProcess    != NULL) 
         CloseHandle(hProcess);
   }

   return(fOk);
}


///////////////////////////////////////////////////////////////////////////////


BOOL WINAPI EjectLibA(DWORD dwProcessId, PCSTR pszLibFile)
{

   // Allocate a (stack) buffer for the Unicode version of the pathname
   PWSTR pszLibFileW = (PWSTR) 
      _alloca((lstrlenA(pszLibFile) + 1) * sizeof(WCHAR));

   // Convert the ANSI pathname to its Unicode equivalent
   wsprintfW(pszLibFileW, L"%S", pszLibFile);

   // Call the Unicode version of the function to actually do the work.
   return(EjectLibW(dwProcessId, pszLibFileW));
}


///////////////////////////////////////////////////////////////////////////////
     上面這種方法注入的代碼它的優(yōu)點是開發(fā)比較簡單,我們只要用C++寫一個DLL,然后調(diào)用InjectLibW(processID, dllName)就可以了,但是因為代碼是運行在一個DLL里,別人可以通過一些枚舉模塊的工具看到我們的DLL,所以隱蔽性不是很好。

      還有一種遠(yuǎn)程線程的實現(xiàn)方法是羅云彬Windows環(huán)境下32位匯編語言程序設(shè)計》里介紹的, 我們不通過DLL,而是直接把可執(zhí)行代碼拷貝到目標(biāo)進程后運行,所以它是真正的遠(yuǎn)程線程,通過這種方法,我們的代碼和目標(biāo)進程已經(jīng)完全融為一體,其他人根本無法察覺。

      用這種方法實現(xiàn), 它的要點是:

      (1) Kernel32.DLL加載的基址在任何進程里都是一樣的(其實上一種LoadLibrary方法也用到了這點), 所以
GetProcAddress,GetModuleHandleA(W), LoadLibraryA(W)這些API的地址在任何進程里都是一樣的, 所以我們在其他進程中用和本進程相同的地址調(diào)用這些API。

    (2) 因為涉及到全局變量的重定位問題, 所以注入的代碼需要用匯編編寫, 并用以下匯編解決重定位問題
call @F
@@:
pop ebx
sub ebx, offset @B

     下面寫了一個無DLL實現(xiàn)遠(yuǎn)程線程的測試代碼,他會在桌面Shell進程(explorer.exe)里彈一個MessageBox,按照這個例子,我們已經(jīng)可以通過調(diào)用LoadLibraryA(W)和GetProcAddress來調(diào)用任何API了, 所以要實現(xiàn)一些復(fù)雜的功能也不是難事。

      如果要避免用匯編來重定位,可以把全局變量都打包放在線程參數(shù)里,這樣單用C++就可以完全實現(xiàn)無DLL的遠(yuǎn)程線程了,當(dāng)然我們只能用Release版本(Debug版加了一些用到全局變量的調(diào)試信息, 堆棧檢測等)。

     還有一個問題是遠(yuǎn)程線程很難調(diào)試, 很多時候你在目標(biāo)進程里注入代碼后可能就只會看到一個Crash的窗口,也不知道哪里代碼有問題。如何才能單步調(diào)試呢? 我的方法是在CreateRemoteThread之前把線程的入口地址用MessageBox打印出來,然后用Windbg  Attach到目標(biāo)進程,在該地址上設(shè)置斷點,這樣繼續(xù)運行就可以用Windbg單步調(diào)試了(當(dāng)然只能以匯編的形式)。

遠(yuǎn)程線程測試代碼下載(Asm): RemoteThreadTest
遠(yuǎn)程線程測試代碼下載(C++): RemoteThreadTest_New
posted on 2012-06-20 15:38 Richard Wei 閱讀(4015) 評論(5)  編輯 收藏 引用 所屬分類: windows desktop

FeedBack:
# re: 遠(yuǎn)程線程入門
2012-06-20 21:06 | 飯中淹
注入代碼其實無所謂用什么寫,線程有個LPVOID的參數(shù),把需要的數(shù)據(jù)全部事先寫入遠(yuǎn)程進程,然后把數(shù)據(jù)地址作為參數(shù)傳給遠(yuǎn)程線程就可以了。這樣無需訪問全局變量。  回復(fù)  更多評論
  
# re: 遠(yuǎn)程線程入門
2012-06-20 21:30 | Richard Wei
@飯中淹
是的,我們可以先在目標(biāo)進程中把需要的數(shù)據(jù)分配好,然后通過線程參數(shù)把地址傳進去,這樣可以避免全局變量。
關(guān)于代碼注入,這篇文章不錯:http://www.vckbase.com/index.php/wv/1580  回復(fù)  更多評論
  
# re: 遠(yuǎn)程線程入門
2012-06-20 23:53 | Richard Wei
@飯中淹
不依賴匯編重定位的代碼注入也做了下嘗試,發(fā)現(xiàn)挺好用的,測試代代碼也放上去了,單純用C++就可以了,就是注入代碼大小不太好算。  回復(fù)  更多評論
  
# re: 遠(yuǎn)程線程入門
2013-10-20 12:53 | flighta
Dear,

我碰到一種情況,需要將系統(tǒng)正在調(diào)用的dll文件,替換成新的dll文件. 它問題的起因是我們在做系統(tǒng)開發(fā)時,我是負(fù)責(zé)其中的一個dll文件,開發(fā)需要不斷調(diào)試.但是每次打開整個軟件需要比較長的時間.我是想能否直接在軟件中將這個dll熱替換,避免重起開啟整個軟件. (新舊兩個dll的接口完全相同)

Best regards,
Flighta  回復(fù)  更多評論
  
# re: 遠(yuǎn)程線程入門
2013-10-24 19:45 | Richard Wei
@flighta
如果別人已經(jīng)保存了你這個DLL的HINSTANCE,你想熱替換它,這個恐怕不好弄, 只能讓別人Free后再Load。  回復(fù)  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            精品动漫3d一区二区三区| 亚洲婷婷综合久久一本伊一区| 久久9热精品视频| 亚洲网站在线| 一区二区三区欧美亚洲| 国产曰批免费观看久久久| 欧美一区二区三区在线观看视频| 久久久不卡网国产精品一区| 亚洲日本视频| 亚洲伦理自拍| 一区二区三区www| 亚洲一区二区网站| 久久精品人人爽| 老牛影视一区二区三区| 欧美成人在线免费视频| 亚洲人被黑人高潮完整版| 免费久久99精品国产自在现线| 亚洲国产日韩一区二区| 9i看片成人免费高清| 欧美一级欧美一级在线播放| 欧美电影免费观看高清完整版| 欧美69视频| 国产精品免费观看视频| 亚洲国产mv| 亚洲天堂av在线免费| 久久精品中文字幕一区二区三区| 欧美激情一区二区三区高清视频 | 久久免费国产| 亚洲精品免费网站| 欧美中文字幕在线观看| 欧美精品一线| 黄色成人在线观看| 亚洲午夜成aⅴ人片| 亚洲电影av| 午夜影院日韩| 亚洲视频免费在线| 欧美成人一品| 亚洲私人影吧| 欧美另类极品videosbest最新版本| 国产精品久久久久婷婷| 亚洲清纯自拍| 欧美韩日亚洲| 欧美一区二视频| 欧美午夜久久久| 亚洲人成小说网站色在线 | 欧美福利网址| 先锋影音久久久| 欧美日韩亚洲视频一区| 亚洲欧洲一区二区三区久久| 性色av一区二区三区红粉影视| 亚洲人成人99网站| 久久在线观看视频| 国产一区二区欧美| 欧美诱惑福利视频| 宅男精品视频| 国产精品久久久久一区二区| 亚洲视频一区在线| 亚洲欧洲日本一区二区三区| 欧美精品v日韩精品v国产精品| 亚洲高清视频在线| 一区二区亚洲| 久久综合久久综合这里只有精品| 在线视频亚洲一区| 国产精品欧美日韩久久| 亚洲一区二区三区色| 亚洲美女免费视频| 欧美日韩国产精品一区| 亚洲精品久久久久久久久久久久 | 国产精品久久久久国产a级| 99天天综合性| 亚洲精品欧美极品| 亚洲精品在线视频观看| 欧美国产三区| 亚洲男人第一网站| 亚洲女性裸体视频| 国产精品资源在线观看| 欧美综合国产精品久久丁香| 午夜精品理论片| 亚洲韩国一区二区三区| 91久久精品美女高潮| 欧美成人精品h版在线观看| 99国产一区二区三精品乱码| 99re6这里只有精品| 国产精品中文在线| 麻豆freexxxx性91精品| 欧美国产精品| 久久精品中文| 欧美国产精品v| 亚洲欧美日韩成人高清在线一区| 欧美一区亚洲| 亚洲精品网站在线播放gif| 亚洲婷婷在线| 狠狠噜噜久久| 亚洲二区在线| 国产精品毛片va一区二区三区 | 免费永久网站黄欧美| 老司机精品视频一区二区三区| 亚洲日韩成人| 午夜精品久久久久久久99樱桃| 在线日本欧美| 亚洲香蕉成视频在线观看| 亚洲国产成人午夜在线一区| 一区电影在线观看| 在线观看亚洲视频| 亚洲一区二区三区久久| 欧美国产亚洲视频| 国产亚洲综合在线| 亚洲美女精品一区| 一区在线视频观看| 亚洲午夜精品福利| 亚洲国产婷婷香蕉久久久久久| 在线一区二区三区四区五区| 亚洲第一伊人| 欧美亚洲一区二区在线| 在线一区观看| 久久亚洲春色中文字幕| 国产自产2019最新不卡| 亚洲激情视频| 国产综合色产| 亚洲男女毛片无遮挡| 日韩亚洲综合在线| 免费观看成人| 美日韩免费视频| 国产自产2019最新不卡| 欧美在线观看视频一区二区三区| 亚洲午夜视频| 欧美视频二区| 一本色道久久99精品综合| 亚洲美女中出| 欧美极品一区| 亚洲电影免费在线观看| 在线免费不卡视频| 欧美一区二区三区免费看| 亚洲特级片在线| 国产精品扒开腿爽爽爽视频 | 先锋亚洲精品| 欧美资源在线| 国产精品日韩精品| 亚洲视频第一页| 亚洲欧美韩国| 国产欧美日韩综合一区在线播放| 在线视频你懂得一区| 一本一本久久| 国产精品二区影院| 亚洲午夜精品| 久久精品国产77777蜜臀| 国产一区二区三区直播精品电影 | 欧美一级久久| 久久男女视频| 极品中文字幕一区| 农村妇女精品| 亚洲免费观看高清在线观看 | 久久久亚洲一区| 久久一区二区三区av| 精品99视频| 欧美电影在线| 亚洲理伦电影| 欧美一区二区三区四区高清| 国产日韩欧美精品| 久久精品视频在线播放| 欧美成年人视频网站欧美| 亚洲激情成人| 欧美人与性动交a欧美精品| 亚洲一区中文| 久久综合狠狠| 日韩亚洲欧美在线观看| 国产精品亚洲一区| 久久九九久久九九| 99精品国产99久久久久久福利| 亚洲一区二区在线免费观看视频| 国产日韩一区二区三区在线播放| 久久婷婷蜜乳一本欲蜜臀| 欧美黑人国产人伦爽爽爽| 99在线热播精品免费| 国产精品久线观看视频| 久久国产综合精品| 亚洲精品美女91| 国产精品久久久久久久久久三级| 久久精品九九| 亚洲国产精品成人| 亚洲综合色噜噜狠狠| 在线国产日韩| 欧美午夜欧美| 六月婷婷久久| 小处雏高清一区二区三区| 欧美另类综合| 久久亚洲春色中文字幕| 亚洲一区二区免费| 亚洲成色最大综合在线| 久久aⅴ国产欧美74aaa| 亚洲另类黄色| 亚洲成在人线av| 国产精品一区二区三区观看| 美国成人直播| 欧美在线影院在线视频| 夜夜精品视频| 亚洲免费黄色| 亚洲国产精品第一区二区三区| 午夜在线视频一区二区区别| 免费观看国产成人|