gpt4 book ai didi

c++ - 如何获取指向 Hook 的 COM 方法的指针?

转载 作者:太空狗 更新时间:2023-10-29 23:09:19 25 4
gpt4 key购买 nike

我知道这似乎是一个回答过度的问题,但这个问题不同。我有这个导出一些方法的 ActiveX 对象。我需要在它的方法之一上设置一个钩子(Hook),即 Func1,我知道如何使用 VirtualProtect() 等来做到这一点。如果我打开 ollydbg 并深入研究ActiveX DLL 我准确地看到了我需要设置 Hook 的 Func1 的地址。

使用 Visual Studio 2008,我正在使用预编译器指令:

#import "myactx.dll" no_namespace, named_guids, raw_interfaces_only

在我的代码中,我试图这样做:

LPVOID ptr = &IMyActx::Func1;

编译时返回错误:

error C2440: 'initializing' : cannot convert from 'HRESULT (__stdcall IMyActx::* )(BSTR,BSTR)' to 'LPVOID'.

我研究并发现由于隐式 this 参数,我无法将类方法指针转换为函数指针。

但是,我不打算调用这个函数。我只想知道它在内存中的地址,以便我可以将它传递给我的 Hook 例程(需要一个 LPVOID 指针)。

这对我来说似乎是不可思议的,我可以调用一个函数但不能在内存中获取它的原始地址。这让我想插入一些 x86 汇编代码来获得我想要的指针。

非常感谢任何建议,感谢阅读。

编辑...现在想想... LPVOID ptr = &IMyActx::Func1; 应该不行,因为 IMyActx 是一个纯虚类!无论如何,在实例化一个对象并尝试获取指向 Func1 的原始指针之前,我尝试了一些组合,但到目前为止没有任何效果。我在 ollydbg 中看到对 Func1 的调用生成为:

mov edx, [eax];
call dword ptr ds:[edx + 0x1C];

所以我可以假设我需要读取 vptr + 0x1C 字节处的 DWORD 瞧。

如果我没记错的话,组件对象模型保证它将始终是位于 [vptr + 0x1C] 处的 Func1 ptr 给定相同的接口(interface) ID。永远。对吧?

我可能会用一些伪代码来做这样的事情:

#define FUNC1_ENTRY   0x1C / sizeof(LPBYTE)

CoCreateInstance(CLSID_MyActx, 0, CLSCTX_ALL, IID_IMyActxObj, (LPVOID*) &pObj);

LPVOID pToHook = (*pObj)[FUNC1_ENTRY];

最佳答案

COM对象的方法其实就是普通的函数。这就是启用用 C 而不是 C++ 编写的 COM 客户端的原因。

我建议为 C 客户端生成头文件,然后可以轻松检索函数地址。但是,您首先需要一个您打算 Hook 的类的实例。

关于c++ - 如何获取指向 Hook 的 COM 方法的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5542771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com