漸漸的漸漸的,對於win32的程式設計有了一定的了解了,自己嘗試了一下遠端執行緒注入。
雖然說最後的結果沒有在我的機器上面實現(可能是作業系統的問題,畢竟我的實現思路沒有什麼問題)
首先了解一下什麼是遠端執行緒,這一切都由於win32提供了乙個函式,他叫createremotethread,它允許你在別的程序裡面建立乙個執行緒。
下面直接上函式文件,從中可以看到幾個比較重要的點,首先是第乙個引數,目的程序控制代碼,因為我們知道,每個程序的控制代碼表都是私有的,相應的控制代碼值在別的程序裡面是不適用的,所以給通過pid獲取作業系統全域性控制代碼表來在你的實現注入的程序裡面獲得目的程序的控制代碼(核心物件)。
那麼怎麼獲取目的程序控制代碼值呢?
openprocess函式,開啟已經建立的程序。
那麼這樣我們第乙個引數也就實現了。
下面我們看第四個引數,要執行的函式的位址。
注意這裡的函式是目的程序裡面的函式,因為你建立的遠端執行緒也是屬於目的程序的,所以你不可能讓乙個執行緒執行別的執行緒的函式去。
這個時候該想了,我想執行我自己定製的**,而我要注入的程序裡面並沒有我的定製**怎麼辦呢?
這個時候想一想動態鏈結庫裡面的dllmain函式。
首先loadlibrary函式是肯定存在於目標程序裡面的,因為它本身就屬於kernel32裡面的函式。
其次可以通過loadlibrary實現讓目標程序載入 你自己定製的dll,那麼這個時候可能提出乙個疑問。
我寫了dll之後,人家怎麼知道我的dll的路徑呢?
這個時候涉及到了同樣關鍵的乙個函式,叫virtualallocex。
它可以在目的程序裡面建立一塊位址,(注意是目的程序不是你當前的程序)。
建立了位址之後,還可以通過writeprocessmemory函式來進行寫入。
那麼目的程序就知道了要載入的dll的路徑了。
下面直接上**
#include
#include
#include
intmain()
//獲取dll路徑長度
char dllpath=
"a.dll"
;int length =
strlen
(dllpath)+1
;//在對應的目的程序裡面建立實體地址,並設定為可讀可寫。
lpvoid allocaddr =
virtualallocex
(hprocess,
null
, length, mem_commit, page_readwrite)
;//createremotethread(hprocess, null, 0, );
if(allocaddr ==
null
)//在分配的記憶體裡面寫入路徑名
bool write =
writeprocessmemory
(hprocess, allocaddr, dllpath, length,
null);
if(write ==
false
) dword runproc =
75752990
; hthread =
createremotethread
(hprocess,
null,0
,(lpthread_start_routine)runproc, allocaddr,0,
null);
getchar()
;return0;
}
VC DLL遠端程序注入
剛剛調好的dll遠端程序注入 備份一下 void cinjectprocessdlg onbtninject getwindowthreadprocessid hwnd,dwprocessid 開啟程序 hprocess openprocess process all access,false,dw...
注入系列 遠端執行緒注入
1.使用程序pid開啟程序,獲得控制代碼 2.使用程序控制代碼申請記憶體空間 3.把dll路徑寫入記憶體 4.建立遠端執行緒,呼叫loadlibrary 5.釋放收尾工作或者解除安裝dll 實現 bool cinjectdlg zwcreatethreadexinjectdll dword dwpr...
執行緒遠端注入
執行緒遠端注入的技術並不複雜,主要用到createremotethread這個api。難點有個地方,由於要注入其他程序的空間,因此,注入用的那個執行緒中的 必須使用和被注入程序的記憶體空間一致。換句話講,就是需要找到執行緒中使用的函式在遠端程序中的位址。明白這個,問題就沒有了。下面是乙個完整的執行緒...