Func1
。我知道如何使用VirtualProtect()
等方法来做到这一点。如果我打开ollydbg并深入研究ActiveX DLL,我会看到我需要设置钩子的Func1
的确切地址。使用Visual Studio 2008,我正在使用预编译指令:
#import "myactx.dll" no_namespace, named_guids, raw_interfaces_only
在我的代码中,我正在尝试做到这一点:
LPVOID ptr = &IMyActx::Func1;
当编译时出现错误:
错误 C2440:'initializing' : 无法将类型为 'HRESULT (__stdcall IMyActx::* )(BSTR,BSTR)' 的数据转换为类型为 'LPVOID' 的数据。
我研究后发现,由于隐式的 this
参数,我无法将一个指向类方法的指针转换为函数指针。
但是,我并不打算调用这个函数。我只想知道它在内存中的地址,以便将其传递给我的 hooking 程序(该程序期望一个 LPVOID
指针)。
我觉得这似乎是不可思议的,我可以调用一个函数却无法获得它在内存中的原始地址。这让我想插入一些 x86 汇编代码以获取所需的指针。
非常感谢您的阅读,如果有任何建议,请告诉我。
编辑...
现在考虑到... LPVOID ptr = &IMyActx::Func1;
不应该起作用,因为 IMyActx
是一个纯虚类!无论如何,我之前尝试过一些组合,试图实例化一个对象并尝试获取指向 Func1
的原始指针,但都没有成功。在 ollydbg 中,我看到对 Func1
的调用生成了以下代码:
mov edx, [eax];
call dword ptr ds:[edx + 0x1C];
所以我可以假设我需要读取vptr + 0x1C
字节处的DWORD
,然后就完成了。
如果我没记错的话,组件对象模型保证在给定相同接口ID的情况下,永远会是[vptr + 0x1C]
处的Func1
指针。对吗?
我可能会用类似伪代码的方式来实现:
#define FUNC1_ENTRY 0x1C / sizeof(LPBYTE)
CoCreateInstance(CLSID_MyActx, 0, CLSCTX_ALL, IID_IMyActxObj, (LPVOID*) &pObj);
LPVOID pToHook = (*pObj)[FUNC1_ENTRY];
code
error C2440: 'reinterpret_cast' : 无法将类型为 'HRESULT (__stdcall IMyActx::* )(BSTR,BSTR)' 的内容转换为类型为 'LPVOID' 的内容。 1> 不存在可以进行此转换的上下文。code
- Marcus Geist