2009-07-21 44 views
1

好吧,我正在使用CreateRemoteThread/LoadLibrary「詭計」向另一個進程注入一些代碼。CreateRemoteThread,LoadLibrary和PostThreadMessage。什麼是適當的IPC方法?

我最終得到了一個線程ID,並帶有一個我選擇的DLL旋轉起來的進程。至少在理論上,DLL目前沒有做任何事情,所以驗證這是有點棘手的。就目前而言,我願意僅憑信心接受它。此外,在我朝這個方向努力之前,這個問題需要回答。

基本上,你不能阻止在DllMain。但是,我必須與遠程線程通信的是它的ID。這實際上乞討PostThreadMessage/GetMessage shenanigans哪個塊。我可以在DllMain中創建另一個線程,但是我無法將其id傳回到創建線程,也無法將另一個線程的id傳遞給遠程線程。

簡而言之,如果我在流程中創建遠程線程,我應該如何與原始進程進行通信?

回答

6

步驟零;注入的DLL應該有一個入口點,我們稱它爲Init(),它將LPCWSTR作爲其單個參數並返回int;即與LoadLibrary()相同的簽名,因此作爲線程起始函數地址同樣有效......

第一步;使用加載庫和遠程線程進行注入。在注入的DLL DLLMain()中做什麼都不聰明。存儲作爲注入線程退出代碼返回的HMODULE,這是注入DLL的HMODULE和返回值LoadLibrary()

注意,這已不再是在x64的可靠方法,如果/DYNAMICBASE和ASLR(地址空間佈局隨機化)爲HMODULE在x64上啓用比從GetThreadExitCode()返回DWORD值和地址空間變化意味着大它不再像HMODULE的值足夠小以適應DWORD。請參閱下面的註釋和鏈接問題(此處),以解決使用共享內存進行通信的問題HMODULE

第二步;使用LoadLibrary將注入的DLL加載到正在進行注入的進程中。然後在您的地址空間中找到您的Init()入口點的偏移量,並在您的地址空間中減去您注入的DLL的HMODULE。您現在具有Init()函數的相對偏移量。取目標進程中注入DLL的HMODULE(即您在第一步中保存的值),並向其添加相對地址Init()。您現在在目標進程中的地址爲Init()

第三步;在目標進程中使用您用來呼叫LoadLibrary()的相同「遠程線程」方法調用Init()。您可以將一個字符串傳遞給Init()調用,這可以是任何您喜歡的。

我傾向於做的是傳遞一個唯一的字符串鍵,作爲命名管道名稱的一部分。注入的DLL和注入過程現在都知道命名管道的名稱,並且可以在它們之間進行通信。 Init()函數不是DLLMain(),並且不受影響DLLMain()的限制(因爲它不在LoadLibrary等內部調用),因此您可以在其中執行常規任務。一旦注入的DLL和注入過程通過命名管道連接,您可以根據需要來回傳遞命令和數據結果。由於您將Init()函數傳遞給一個字符串,因此您可以確保命名管道對於注入過程的此特定實例以及此特定的注入DLL是唯一的,這意味着您可以同時運行多個注入過程實例,並且每個過程都可以注入到多個目標進程中,並且所有這些通信通道都是唯一可控的。

+0

我看不到如何將字符串傳遞給CreateRemoteThread(...,dllExportAddrInRemoteProcess,stringBuffer,...)可以工作(沒有WriteProcessMemory)。但是,這兩個進程都知道注入線程的進程標識和線程標識,因此您可以將這些標識用作與IPC一起使用的名稱的一部分 – Anders 2009-07-22 11:55:39

1

您沒有遠程進程中線程的線程ID,因爲當您的模塊成功加載到進程的地址空間時,用於加載DLL的線程將退出。

您可以很容易地使用正常的進程間通信方法,如命名部分/管道/創建命名窗口/等。與您的「注射」過程進行交流。

相關問題