我知道这似乎是一个过度回答的问题,但这个问题是不同的。我有这个导出一些方法的 ActiveX 对象。我需要在它的一种方法上设置一个钩子,即Func1
,我知道如何通过使用VirtualProtect()
等来做到这一点。如果我打开 ollydbg 并深入研究 ActiveX DLL,我会看到Func1
我需要设置钩子的确切地址。
使用 Visual Studio 2008,我正在使用预编译器指令:
#import "myactx.dll" no_namespace, named_guids, raw_interfaces_only
在我的代码中,我正在尝试这样做:
LPVOID ptr = &IMyActx::Func1;
编译时返回错误:
错误 C2440:“正在初始化”:无法从“HRESULT (__stdcall IMyActx::*)(BSTR,BSTR)”转换为“LPVOID”。
this
我研究并发现由于隐式参数,我无法将指向类方法的指针转换为指向函数的指针。
但是,我不打算调用这个函数。我只想知道它在内存中的地址,以便我可以将它传递给我的挂钩例程(它需要一个LPVOID
指针)。
这对我来说似乎不可思议,我可以调用一个函数但不能在内存中获取它的原始地址。这让我想插入一些 x86 汇编代码只是为了得到我想要的指针。
任何建议都非常感谢,感谢阅读。
编辑...现在想起来...LPVOID ptr = &IMyActx::Func1;
不应该工作,因为IMyActx
它是一个纯虚拟类!无论如何,我在实例化一个对象并尝试获取原始指针之前尝试了一些组合,Func1
但到目前为止没有任何效果。我在 ollydbg 中看到调用Func1
生成为:
mov edx, [eax];
call dword ptr ds:[edx + 0x1C];
所以我可以假设我需要阅读DWORD
atvptr + 0x1C
字节和瞧。
如果我没记错的话,组件对象模型保证它将始终是放置在给定相同接口 ID的Func1
ptr 。[vptr + 0x1C]
永远。正确的?
我可能会用一些伪代码做这样的事情:
#define FUNC1_ENTRY 0x1C / sizeof(LPBYTE)
CoCreateInstance(CLSID_MyActx, 0, CLSCTX_ALL, IID_IMyActxObj, (LPVOID*) &pObj);
LPVOID pToHook = (*pObj)[FUNC1_ENTRY];