winnt/win2000/winxp中的遠執行緒技術之一--dll注入
什麼是遠執行緒?我們知道用createthread可以在當前程序裡建立乙個執行緒,遠執行緒與此類似,只不過是在其他程序中建立乙個執行緒,用api函式createremotethread。這個遠執行緒建立後就與建立它的程序無關了,而是進入了另外乙個程序。舉例說,程序a可以在程序b中建立乙個遠執行緒,這個遠執行緒就是程序b中的執行緒了,而此時如果程序a結束了,也不會影響到那個遠執行緒的執行,除非程序b也結束了,那個遠執行緒才會結束。怎麼樣,是不是很神奇啊?現在我們來看看怎麼建立遠執行緒。
最簡單的遠執行緒技術是dll注入。好,先從這個講起。所謂dll注入就是將乙個dll放進某個程序的位址空間裡,讓它成為那個程序的一部分。要實現dll注入,首先需要開啟目標程序。
hremoteprocess = openprocess( process_create_thread | //允許遠端建立執行緒
process_vm_operation | //允許遠端vm操作
process_vm_write, //允許遠端vm寫
false, dwremoteprocessid )
由於我們後面需要寫入遠端程序的記憶體位址空間並建立遠端執行緒,所以需要申請足夠的許可權(process_create_thread、vm_operation、vm_write)。
如果程序打不開,以後的操作就別想了。程序開啟後,就可以建立遠執行緒了,不過別急,先想想這個遠執行緒的執行緒函式是什麼?我們的目的是注入乙個dll。而且我們知道用loadlibrary可以載入乙個dll到本程序的位址空間。於是,自然會想到如果可以在目標程序中呼叫loadlibrary,不就可以把dll載入到目標程序的位址空間了嗎?對!就是這樣。遠執行緒就在這兒用了一次,建立的遠執行緒的執行緒函式就是loadlibrary,而引數就是要注入的dll的檔名。(這裡需要自己想一想,注意到了嗎,執行緒函式threadproc和loadlibrary函式非常相似,返回值,引數個數都一樣) 還有乙個問題,loadlibrary這個函式的位址在哪兒?也許你會說,這個簡單,getprocaddress就可以得出。於是**就出來了。
char *pszlibfileremote="my.dll";
pthread_start_routine pfnstartaddr = (pthread_start_routine)getprocaddress(getmodulehandle("kernel32"), "loadlibrarya");
createremotethread( hremoteprocess, null, 0, pfnstartaddr, pszlibfileremote, 0, null);
但是不對!不要忘了,這是遠執行緒,不是在你的程序裡,而pszlibfileremote指向的是你的程序裡的資料,到了目標程序,這個指標都不知道指向哪兒去了,同樣pfnstartaddr這個位址上的**到了目標程序裡也不知道是什麼了,不知道是不是你想要的loadlibrarya了。但是,問題總是可以解決的,windows有些很強大的api函式,他們可以在目標程序裡分配記憶體,可以將你的程序中的資料拷貝到目標程序中。因此pszlibfileremote的問題可以解決了。
char *pszlibfilename="my.dll";//注意,這個一定要是全路徑檔名,除非它在系統目錄裡;原因大家自己想想。
//計算dll路徑名需要的記憶體空間
int cb = (1 + lstrlena(pszlibfilename)) * sizeof(char);
//使用virtualallocex函式在遠端程序的記憶體位址空間分配dll檔名緩衝區
pszlibfileremote = (char *) virtualallocex( hremoteprocess, null, cb, mem_commit, page_readwrite);
//使用writeproces**emory函式將dll的路徑名複製到遠端程序的記憶體空間
ireturncode = writeproces**emory(hremoteprocess, pszlibfileremote, (pvoid) pszlibfilename, cb, null);
ok,現在目標程序也認識pszlibfileremote了,但是pfnstartaddr好像不好辦,我怎麼可能知道loadlibrarya在目標程序中的位址呢?其實windows為我們解決了這個問題,loadlibrarya這個函式是在kernel32.dll這個核心dll裡的,而這個dll很特殊,不管對於哪個程序,windows總是把它載入到相同的位址上去。因此你的程序中loadlibrarya的位址和目標程序中loadlibrarya的位址是相同的(其實,這個dll裡的所有函式都是如此)。至此,dll注入結束了。
DLL注入實驗 DLL訊息鉤取HOOK
修改dll實現功能 修改改hookdll.cpp,鉤取對notepad的輸入,使得 a 輸入文字仍能正常顯示 b 所有輸入文字能夠記錄到input.txt檔案中 include windows.h include tchar.h hinstance g hinstance null hhook g ...
用hook實現dll注入詳解
需要乙個用來注入的dll inject.dll 及乙個呼叫程式 caller.exe 流程 caller.exe procedure testhook var pwnd,hchild,hwndinject hwnd msg tmsg begin 通過視窗標題用findwindow找到要注入的程式的主...
用hook實現dll注入詳解
下面說明 inject.dll的setinjecthook的具體操作 在全域性定義以下變數 varg hhook hhook 0 g dwthreadidinject dword 0 g hinjectfrm hwnd function setinjecthook dwthreadid dword ...