一、遠端執行緒注入的原理
1、其基礎是在 windows 系統中,每個 .exe 檔案在雙擊開啟時都會載入 kernel32.dll 這個系統模組,該模組中有乙個 loadlibrary() 函式,可以將dll檔案載入到自身程序中。
2、這樣,就可以用 createremotethread() 函式建立乙個遠端執行緒,讓目標程序呼叫loadlibrary() 來載入我們自己寫的dll 。createremotethread() 有這幾個引數比較關鍵:a:想要注入的程序的控制代碼,這裡可以通過openprocess()得到; b:想要執行的函式,本例中當然是 loadlibrary() 啦; c: 所執行函式的引數,本例中是自己寫的dll的存放路徑。
3、那麼,怎麼讓 loadlibrary() 找到自己寫的dll的存放路徑呢?這就需要在記憶體中開闢一塊空間,把路徑寫入進去。這要先用 virtualallocex()開闢一塊空間,然後用writeprocessmemory() 函式把dll路徑寫進去。
4、小結:總的來說,就是:先在目標程序的記憶體空間裡開闢一塊新地方,往新地方裡面寫入dll的路徑,再建立遠端執行緒找到loadlibrary() 函式,並在剛才開闢的新地方中讀取dll路徑,進而載入我們自己寫的dll。
二、**實現(含詳細注釋)
複製**
1 #include
2 #include 「stdlib.h」
3 #include
4 #include
56 bool inject(dword dwid, wchar* szpath)//引數1:目標程序pid 引數2:dll路徑
7 {8 //一、在目標程序中申請乙個空間910
11 /*
12 【1.1 獲取目標程序控制代碼】
13 引數1:想要擁有的程序許可權(本例為所有能獲得的許可權)
14 引數2:表示所得到的程序控制代碼是否可以被繼承
15 引數3:被開啟程序的pid
16 返回值:指定程序的控制代碼
17 /
18 handle hprocess = openprocess(process_all_access, false, dwid);
1920
21 /
22 【1.2 在目標程序的記憶體裡開闢空間】
23 引數1:目標程序控制代碼
24 引數2:保留頁面的記憶體位址,一般用null自動分配
25 引數3:欲分配的記憶體大小,位元組單位
26 引數4:mem_commit:為特定的頁面區域分配記憶體中或磁碟的頁面檔案中的物理儲存
27 引數5:page_readwrite 區域可被應用程式讀寫
28 返回值:執行成功就返回分配記憶體的首位址,不成功就是null
29 /
30 lpvoid premoteaddress = virtualallocex(
31 hprocess,
32 null,
33 1,
34 mem_commit,
35 page_readwrite
36 );
3738 //二、 把dll的路徑寫入到目標程序的記憶體空間中
3940 dword dwwritesize = 0;
41 /
42 【寫一段資料到剛才給指定程序所開闢的記憶體空間裡】
43 引數1:openprocess返回的程序控制代碼
44 引數2:準備寫入的記憶體首位址
45 引數3:指向要寫的資料的指標(準備寫入的東西)
46 引數4:要寫入的位元組數(東西的長度+0/)
47 引數5: 返回值。返回實際寫入的位元組
48 /
49 writeprocessmemory(hprocess,premoteaddress, szpath, wcslen(szpath) * 2 + 2, &dwwritesize);
5051
52 //三、 建立乙個遠端執行緒,讓目標程序呼叫loadlibrary
5354 /
55 引數1:該遠端執行緒所屬程序的程序控制代碼
56 引數2:乙個指向 security_attributes 結構的指標, 該結構指定了執行緒的安全屬性
57 引數3:執行緒棧初始大小,以位元組為單位,如果該值設為0,那麼使用系統預設大小
58 引數4:在遠端程序的位址空間中,該執行緒的執行緒函式的起始位址(也就是這個執行緒具體要幹的活兒)
59 引數5:傳給執行緒函式的引數(剛才在記憶體裡開闢的空間裡面寫入的東西)
60 引數6:控制線程建立的標誌。0(null)表示該執行緒在建立後立即執行
61 引數7:指向接收執行緒識別符號的變數的指標。如果此引數為null,則不返回執行緒識別符號
62 返回值:如果函式成功,則返回值是新執行緒的控制代碼。如果函式失敗,則返回值為null
63 /
64 handle hthread = createremotethread(
65 hprocess,
66 null,
67 0,
68 (lpthread_start_routine)loadlibrary,
69 premoteaddress,
70 null,
71 null
72 );
73 waitforsingleobject(hthread, -1); //當控制代碼所指的執行緒有訊號的時候,才會返回
7475 /
遠端執行緒DLL注入
在其他程序中,建立乙個新的執行緒來loadlibrarya我們的dll。include include void main 給程序分配記憶體 lpvoid baseaddress char strdllname int len strlen strdllname 1 baseaddress virt...
DLL注入 遠端執行緒
dll include stdafx.h include include include bool apientry dllmain hmodule hmodule,dword ul reason for call,lpvoid lpreserved return true 注入器 include ...
DLL注入之遠端執行緒注入
wchar szdllname l 要注入的dll的路徑 if szdllname 0 null return 1 1 開啟程序 handle hprocess openprocess process all access,false,程序pid if hprocess invalid handle...