CreateRemoteThread和WriteProcessMemory技術
示例程序:WinSpy
另一種注入代碼到其他進程地址空間的方法是使用WriteProcessMemory API。這次你不用編寫一個獨立的DLL而是直接復制你的代碼到遠程進程(WriteProcessMemory)并用CreateRemoteThread執行之。
讓我們看一下CreateRemoteThread的聲明:
HANDLECreateRemoteThread(和CreateThread相比,有一下不同:
●增加了hProcess參數。這是要在其中創建線程的進程的句柄。
●CreateRemoteThread的lpStartAddress參數必須指向遠程進程的地址空間中的函數。這個函數必須存在于遠程進程中,所以我們不能簡單地傳遞一個本地ThreadFucn的地址,我們必須把代碼復制到遠程進程。
●同樣,lpParameter參數指向的數據也必須存在于遠程進程中,我們也必須復制它。
現在,我們總結一下使用該技術的步驟:
1. 得到遠程進程的HANDLE(OpenProcess)。
2. 在遠程進程中為要注入的數據分配內存(VirtualAllocEx)、
3. 把初始化后的INJDATA結構復制到分配的內存中(WriteProcessMemory)。
4. 在遠程進程中為要注入的數據分配內存(VirtualAllocEx)。
5. 把ThreadFunc復制到分配的內存中(WriteProcessMemory)。
6. 用CreateRemoteThread啟動遠程的ThreadFunc。
7. 等待遠程線程的結束(WaitForSingleObject)。
8. 從遠程進程取回指執行結果(ReadProcessMemory 或 GetExitCodeThread)。
9. 釋放第2、4步分配的內存(VirtualFreeEx)。
10. 關閉第6、1步打開打開的句柄。
另外,編寫ThreadFunc時必須遵守以下規則:
1. ThreadFunc不能調用除kernel32.dll和user32.dll之外動態庫中的API函數。只有kernel32.dll和user32.dll(如果被加載)可以保證在本地和目的進程中的加載地址是一樣的。(注意:user32并不一定被所有的Win32進程加載?。﹨⒖几戒汚。如果你需要調用其他庫中的函數,在注入的代碼中使用LoadLibrary和GetProcessAddress強制加載。如果由于某種原因,你需要的動態庫已經被映射進了目的進程,你也可以使用GetMoudleHandle代替LoadLibrary。同樣,如果你想在ThreadFunc中調用你自己的函數,那么就分別復制這些函數到遠程進程并通過INJDATA把地址提供給ThreadFunc。
2. 不要使用static字符串。把所有的字符串提供INJDATA傳遞。為什么?編譯器會把所有的靜態字符串放在可執行文件的“.data”段,而僅僅在代碼中保留它們的引用(即指針)。這樣,遠程進程中的ThreadFunc就會執行不存在的內存數據(至少沒有在它自己的內存空間中)。
3. 去掉編譯器的/GZ編譯選項。這個選項是默認的(看附錄B)。
4. 要么把ThreadFunc和AfterThreadFunc聲明為static,要么關閉編譯器的“增量連接(incremental linking)”(看附錄C)。
5. ThreadFunc中的局部變量總大小必須小于4k字節(看附錄D)。注意,當degug編譯時,這4k中大約有10個字節會被事先占用。
6. 如果有多于3tch分支的case語句,必須像下面這樣分割開,或用if-else if代替.
case constant1: statement1; goto END;
case constant2: statement2; goto END;
case constant3: statement2; goto END;
}
case constant4: statement4; goto END;
case constant5: statement5; goto END;
case constant6: statement6; goto END;
}
END:
=====簡單的CreateRemoteThread例程-初學者必看
//
//
==========定義一個代碼結構,本例為一個對話框============
struct
MyData
{
char
sz[
64
];
//
對話框顯示內容
DWORDdwMessageBox;
//
對話框的地址
};
//
==========遠程線程的函數==============================
DWORD__stdcallRMTFunc(MyData
*
pData)
{
typedef
int
(__stdcall
*
MMessageBox)(HWND,LPCTSTR,LPCTSTR,UINT);
MMessageBoxMsgBox
=
(MMessageBox)pData
->
dwMessageBox;
MsgBox(NULL,pData
->
sz,NULL,MB_OK);
return
0
;
}
int
main(
int
argc,
char
*
argv[])
{
//
=====獲得需要創建REMOTETHREAD的進程句柄===============================
HWNDhWnd
=
FindWindow(
“
notepad
“
,NULL);
//
以NOTEPAD為例
DWORDdwProcessId;
::GetWindowThreadProcessId(hWnd,
&
dwProcessId);
HANDLEhProcess
=
OpenProcess(
PROCESS_ALL_ACCESS,
FALSE,
dwProcessId);
//
=========代碼結構================================================
MyDatadata;
ZeroMemory(
&
data,
sizeof
(MyData));
strcat(data.sz,
“
對話框的內容.
“
);
HINSTANCEhUser
=
LoadLibrary(
“
user32.dll
“
);
if
(
!
hUser)
{
printf(
“
Cannotloadlibrary.
“
);
return
0
;
}
data.dwMessageBox
=
(DWORD)GetProcAddress(hUser,
“
MessageBoxA
“
);
FreeLibrary(hUser);
if
(
!
data.dwMessageBox)
return
0
;
//
=======分配空間===================================================
void
*
pRemoteThread
=
VirtualAllocEx(hProcess,
0
,
1024
*
4
,MEM_COMMIT
|
MEM_RESERVE,
PAGE_EXECUTE_READWRITE);
if
(
!
pRemoteThread)
return
0
;
if
(
!
WriteProcessMemory(hProcess,pRemoteThread,
&
RMTFunc,
1024
*
4
,
0
))
return
0
;
MyData
*
pData
=
(MyData
*
)VirtualAllocEx(hProcess,
0
,
sizeof
(MyData),MEM_COMMIT,
PAGE_READWRITE);
if
(
!
pData)
return
0
;
if
(
!
WriteProcessMemory(hProcess,pData,
&
data,
sizeof
(MyData),
0
))
return
0
;
//
===========創建遠程線程===========================================
HANDLEhThread
=
CreateRemoteThread(hProcess,
0
,
0
,(LPTHREAD_START_ROUTINE)pRemoteThread,
pData,
0
,
0
);
if
(
!
hThread)
{
printf(
“
遠程線程創建失敗
“
);
return
0
;
}
CloseHandle(hThread);
VirtualFreeEx(hProcess,pRemoteThread,
1024
*
3
,MEM_RELEASE);
VirtualFreeEx(hProcess,pData,
sizeof
(MyData),MEM_RELEASE);
CloseHandle(hProcess);
printf(
“
HelloWorld!
“
);
return
0
;
}
zhuangyu1982@hotmail.com:我用你的程序在windowsxp下運行,彈出messagebox之后,只要點擊確定宿主進程就會崩潰。
而且不止是messagebox,調用其它的api函數也是一樣,請問這是什么原因?有什么辦法可以解決嗎?
——————————————————–
編譯成RELEASE版本就不會出錯了,主要是DEBUG版本加了一個__chkesp的函數導致調用了非法地址
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
石家莊經貿大學屬于哪個區?石家莊經貿大學屬于新華區。位于學院路的經貿大學創建于1982年,占地268畝。有16個學院(系),76個本科專業,21580名學生。石家莊經貿大學屬于哪個區?河北經貿大學新華區是新華區學府路上的第二所學校。學校環境不錯,學校坐北朝南,師資力量雄厚,培養了很多金融人才!河北石家莊經貿大學是985還是211?石家莊經貿大學既不是985也不是211。是一所普通大學。河北經貿大學...
OPPOa115與a115k的區別?A115K是A115的升級版,功能和java運行能力都強很多。比如火星文的輸入和顯示,手機內置的QQ2010*/QQ瀏覽器,圖片編輯器,后臺運行Java時支持播放音樂,軟件在線升級,最新固件和搜狗輸入法的集成等等都是A115沒有的。如何區分A115和A115K:手機型號一般會在電池倉或者后蓋上注明。去看看吧。此外,還可以在待機狀態下輸入*#6776#查看手機的所...
電影《不明身份》到底男主角是什么身份?馬丁哈里斯根本不存在。利亞姆·尼森扮演的那個人是一個殺手組織的成員。為了讓生命科學家掌握這些信息,殺手組織安排了一個計劃:編造一個名叫馬丁·哈里斯的科學家,他與塞巴斯蒂安·科奇扮演的生命科學家關系密切(對不起,我記不起名字)。艾丹·奎恩飾演的馬丁·哈里斯2號原本是一個后備計劃,以防止利亞姆·尼森發生任何事情。但是利亞姆·尼森出了車禍,完全忘記了自己的真實身份,...