[英]C++: Injecting 32 bit targets from 64 bit process
我最近用C ++編寫了一個DLL-Injector,對此的要求如下
我很快注意到,在Injector中對GetProcAddress(“ LoadLibraryA”)的調用返回了“無法使用”的句柄,因為32位目標已加載了另一個kernel32.dll,並且該函數的地址不同,因此注入失敗(無法使用返回的地址/句柄啟動遠程線程)。 此外,該32位進程在不同的基址上加載了kernel32.dll,這使得創建遠程線程變得更加不可能。
為了弄清楚我的意思,發生了以下情況:
當從64位進程注入64位進程,從32位注入32位進程時,通常沒有問題,因為kernel32.dll(最有可能)被加載到相同的基地址並且可以使用相同的功能地址-到目前為止,這是我的理解。 但是,在這種情況下,條件有所不同。
為了解決該問題,我執行了以下步驟:
這種方法實際上效果很好,但是我無法擺脫這是總開銷的想法,必須有一個更簡單的解決方案才能從64位注入器注入32位目標。
我有兩個問題,如果能在這里回答,我非常感謝:
任何答案都非常感謝,謝謝!
編輯:哦,天哪...我剛剛意識到,我在最初的帖子中描述了錯誤的情況。 INJECTOR是64位,而TARGET是32位(最初是相反的,但是我已經糾正了)。 Ben Voigt在下面的評論完全正確,對EnumProcessModulesEx的調用將失敗。 非常感謝您的困惑:(
我偶然發現了該線程,希望為同一問題找到解決方案。
到目前為止,我傾向於使用另一個更簡單的解決方案。 要獲得32位內核proc地址,該64位進程只需執行一個32位程序即可為我們查找該proc地址:
#include <Windows.h>
int main(int argc, const char**)
{
if(argc > 1)
return (int) LoadLibraryA;
else
return (int) GetProcAddress;
}
該答案解決了該問題的早期版本,與64位注入器的情況基本無關。
您是說這種方法有效嗎? 因為根據文檔 ,您無法從WOW64獲取有關64位進程的信息:
如果該函數由在WOW64下運行的32位應用程序調用,則dwFilterFlag選項將被忽略,並且該函數提供的結果與EnumProcessModules函數相同。
( EnumProcessModules
進一步解釋了限制)
如果從在WOW64上運行的32位應用程序調用此函數,則它只能枚舉32位進程的模塊。 如果該進程是64位進程,則此函數將失敗,並且最后的錯誤代碼是ERROR_PARTIAL_COPY(299)。
但是由於ASLR ,您確實需要找到kernel32.dll
加載的基址。
我認為您可以使用調試符號API來節省解析PE標頭和導出表的時間。 此路由應為32位注入器提供所需的信息。 同樣以64位目標為例,盡管我仍然看不到如何將64位地址傳遞給CreateRemoteThread
。
通常,這些調試符號函數需要.pdb或.sym文件才能運行,但是我很確定它們也可以從DLL導出表中獲取信息(只是從調試器針對沒有符號的文件顯示的經驗中得出的信息)當下)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.