遠端執行緒注入DLL到PC版微信

2021-09-22 17:51:18 字數 2642 閱讀 4408

一、遠端執行緒注入的原理

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...