簡體   English   中英

C ++:從64位進程注入32位目標

[英]C++: Injecting 32 bit targets from 64 bit process

我最近用C ++編寫了一個DLL-Injector,對此的要求如下

  • 注入過程 (我們稱其為“注入器”)以及要注入的DLL (注入)有64位和32位變體。 根據目標,嘗試注入匹配版本的注入。
  • 即使注入器以64位運行,也必須能夠注入32位(WOW64)的目標進程

我很快注意到,在Injector中對GetProcAddress(“ LoadLibraryA”)的調用返回了“無法使用”的句柄,因為32位目標已加載了另一個kernel32.dll,並且該函數的地址不同,因此注入失敗(無法使用返回的地址/句柄啟動遠程線程)。 此外,該32位進程在不同的基址上加載了kernel32.dll,這使得創建遠程線程變得更加不可能。

為了弄清楚我的意思,發生了以下情況:

  • 注入器具有0x12340000加載的64位版本的kernel32.dll
  • 注入器從該kernel32.dll中檢索LoadLibraryA 0x00005678的句柄
  • 目標具有0xABCD0000加載的32位版本的kernel32.dll
  • 此kernel32.dll的LoadLibrary的句柄應為0x0000EFAB
  • 注入器嘗試使用功能0x12345678啟動目標中的遠程線程,但預期為0xABCDEFAB

當從64位進程注入64位進程,從32位注入32位進程時,通常沒有問題,因為kernel32.dll(最有可能)被加載到相同的基地址並且可以使用相同的功能地址-到目前為止,這是我的理解。 但是,在這種情況下,條件有所不同。

為了解決該問題,我執行了以下步驟:

  • 64位注入器使用EnumProcessModulesEx()檢索由32位目標加載的kernel32.dll的地址(應為0xABCD000)
  • 獲取該kernel32.dll的文件名,解析PE標頭並獲取LoadLibraryA的RVA(應為0x000EFAB)
  • 至此,我們知道將kernel32.dll加載到32位目標中的位置以及該DLL中函數的地址。
  • 64位Injector使用ImageBase + Function RVA在32位目標中啟動遠程線程,在這種情況下是神奇的0xABCDEFAB

這種方法實際上效果很好,但是我無法擺脫這是總開銷的想法,必須有一個更簡單的解決方案才能從64位注入器注入32位目標。

我有兩個問題,如果能在這里回答,我非常感謝:

  1. 有沒有更簡單的方法來實現這種注射?
  2. 我一直在考慮的方法是否存在未曾想到的問題?

任何答案都非常感謝,謝謝!

編輯:哦,天哪...我剛剛意識到,我在最初的帖子中描述了錯誤的情況。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM