![](/img/trans.png)
[英]C++: Why does my function return a reference address different from the dereferenced pointer's address?
[英]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調用,並獲得了該文件的名稱。 然后,我得到了函數指針,並將GetModuleHandleEx
與GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
來基本上確定該地址來自哪個DLL。
因此, ModuleBasedOnGetAPI_path
是ModuleBasedOnGetAPI_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.