最近在搞線程注入,其實這個流程也蠻簡單的。一些書上寫的線程注入,都是使用 call [ebx + XXXX]的形式來解決重定位。這樣的話,invoke偽指令就不能直接使用了。就像用偽指令調用messagebox,本來就是invoke MessageBox,NULL,addr szCaption,addr szTitle,MB_OK,遠程注入的話,代碼就要變動,寫成如下形式:
|
還挺麻煩的。我通過參考網絡上的一些資料,通過線程注入記事本、計算器,或者別的知道了窗口類的軟件進程。在他們的基礎上,線程注入,然后注入的代碼編寫成其他我需要體現的。例如,悄悄下載一些東西并且運行,刪除一些文件等,這個是個人愛好了。
下面是主要的注入記事本進程后運行的代碼:
|
這段代碼是插在記事本運行的,所以它自己要裝載API所需要的dll。比如URLDownloadToFile,是urlmon.dll里面的,所以,要用LoadLibrary裝載。
|
00403008H這個地址,是urlmon.dll的內存地址,在同一個exe文件的空間,內存地址是沒有改變,所以00403008H壓棧,然后call LoadLibrary調用,這樣我們就可以使用這個API下載文件了。ShellExecute是在shell32.dll里面,在遠程線程調用,自然也要。
|
|
使用了偽指令的方式注入。
怎么尋找到記事本的ID?Windows提供了FindWindow,只要知道記事本的窗口類,就可以GetWindowThreadProcessId找到了。知道記事本的窗口類很簡單,只要下載一些查看窗口類名的工具就可以了,然后你可以隨便注入一個知道窗口類的程序進程空間。
|
找到之后,調用GetWindowThreadProcessId可以從窗口類句柄找到PID。接著,OpenProcess找到句柄,其中,要以“允許創建遠程線程”,“允許使用進程的地址空間”,“ PROCESS_VM_WRITE”的權限打開。因為我們就是要對記事本的空間進行寫的操作,權限務必要足夠。如果記事本沒有內存空間給我們存放代碼,那么也枉然,然后要釋放和分配內存空間,VirtualFreeEx與VirtualAllocEx就可以做到,其中VirtualAllocEx返回的句柄保存在寄存器eax中,mov hWnd,eax傳送到hWnd做為操作的句柄,用WriteProcessMemory開始寫它的內存空間,CreateRemoteThread創建指定的線程目標進程句柄,也就是我們最后的注入代碼。
下面是完整代碼:
|
其實這段:
|
可以將它轉換成機器碼,這樣就不需要子程序了。直接“szShellcode db ............”,在寫入空間地址的時候,直接Wirte進去。
測試方法:
打開一個記事本后運行程序,就注入,然后運行你的寫字版。
BUG描述:
同樣一個編譯好的程序,在這個時候運行,測試成功。寫字版正常打開,過會就不知道為什么,記事本出現錯誤。郁悶了我,知道為什么的請支個招。
剛剛看了一個牛人的代碼,Copy了一部分并做了注釋,把它放到我的代碼中,就可以注入explorer.exe進程了,恭喜一下:
|
只是做了一點注釋,將一個DOS下PE文件的標識 MZ 加到寄存器edi。對于sizeof的用法,好像是在內存中的字節變量的大小,然后將編譯好的程序的內存尺寸SizeOfImage保存在eax。mov ShellSize, eax,將SizeOfImage存到了ShellSize。
修改過后的注入explorer.exe完整代碼,Windows XP SP2下測試通過:
|
責任編輯 趙毅 zhaoyi#51cto.com TEL:(010)68476636-8001


