簡體   English   中英

為什么要獲取導出函數的指針直接返回同一模塊中的地址?

[英]Why does getting an exported function's pointer directly return an address in the same module?

我正在使用經典的設置來掛接d3d9函數:注入DLL,然后獲取目標函數地址,並使用JMP指令對其進行修補。

但是我遇到了我不太了解的事情。 考慮以下我將注入到目標進程中的DLL的片段:

HMODULE ModuleBasedOnGetAPI = NULL;
HMODULE ModuleBasedOnAddress = NULL;

ModuleBasedOnGetAPI = GetModuleHandleA("d3d9.dll");
D3D9Create_Original = (t_D3D9Create)GetProcAddress(ModuleBasedOnGetAPI,
                      "Direct3DCreate9");

D3D9Create_Original2 = &Direct3DCreate9;
GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
                   GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
                   (LPCSTR)D3D9Create_Original2, &ModuleBasedOnAddress);

char ModuleBasedOnGetAPI_path[_MAX_PATH];
GetModuleFileNameA(ModuleBasedOnGetAPI, ModuleBasedOnGetAPI_path, _MAX_PATH);

char ModuleBasedOnAddress_path[_MAX_PATH];
GetModuleFileNameA(ModuleBasedOnAddress, ModuleBasedOnAddress_path,
                  _MAX_PATH);

其中D3D9Create_Original和D3D9Create_Original2是類型的函數指針:

IDirect3D9*(__stdcall *)(UINT)

基本上,我執行了通常的GetModuleHandle調用,並獲得了該文件的名稱。 然后,我得到了函數指針,並將GetModuleHandleExGET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS來基本上確定該地址來自哪個DLL。

因此, ModuleBasedOnGetAPI_pathModuleBasedOnGetAPI_path文件的實際路徑。 雖然ModuleBasedOnAddress_path似乎是從我的DLL提取此代碼段的路徑。

那為什么呢? 為什么Direct3DCreate9函數同時駐留在我的DLL和d3d9.dll中? 構建DLL時我鏈接了d3d9.lib是否與事實有關?

您的構建配置是什么(即Debug或Release)? 看起來編譯器的優化在這里也很重要。

對於發布版本,我無法重現該問題-兩個地址相同。

對於調試版本,您的假設是正確的。 這是因為當您直接在代碼中引用Direct3DCreate9時,您是在自己的模塊中調用存根代碼,這將進一步從Import Address Table中獲取真實的Direct3DCreate9地址。

為了更好地說明這個概念:

在此處輸入圖片說明

請注意,Visual Studio已經告訴您這兩個地址來自不同的模塊。

讓我們看一下地址0x008f1249

在此處輸入圖片說明

它不過是jmp而已。 進一步看一下0x08FCFAD

在此處輸入圖片說明

另一跳。 最后是0x0913220

在此處輸入圖片說明

請回想一下D3D9Create_Original的值-這是真實地址,與D3D9Create_Original相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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