0

请问COM Distach Interface中的hook方法?

最近,我正在制作一些实用程序,它是一种 COM 监控工具。

我试图在运行时挂钩 Com 对象的接口。

为此,我需要使用类型库。

以下是我的代码大纲。

// Load Type Lib.
LoadRegTypeLib( TypeLibCLSID , wMajorVersion , wMinorVersion , lcid  , &pTypeLib );

// Get Function Descriptor
pInterfaceTypeInfo->GetFuncDesc( iii , &pfuncdesc );

// Create Instance and Get Interface
CoCreateInstance( pClassAttr->guid , NULL, ClassContext,  pInterfaceAttr->guid , (void**)&pUnknownObject );

// Get VTable
dwOrgFunctionPointer = *(DWORD*)pUnknownObject;

// adjust offset
dwOrgFunctionPointer += pfuncdesc->oVft;

// Get Function Pointer
dwOrgFunctionPointer = *(DWORD*)dwOrgFunctionPointer ;

// Hook
MyHookMethod( dwOrgFunctionPointer );

这是成功的,直到我找到了一些具有调度接口(非双)的 Com 对象。

如果某些 Com Object 只有 Dispatch Interface(不是 dual ),则 VTable 中没有函数指针。

只有 MFC 的函数指针,如 GetTypeInfoCount、GetTypeInfo、GetIDsOfNames、Invoke。

此外,pfuncdesc->oVft 始终为 0,因为所有函数都属于该接口。

我知道在使用这类 com 对象时应该使用“调用”方法。

但问题是我想上钩。我需要函数指针。

如何从 IDispatch 获取这些函数指针?

IDispatch->vtable 中只有 MFC 的函数指针。

任何建议将被认真考虑。

谢谢你。

4

1 回答 1

0

要挂钩 IDispatch,您可以挂钩/填充 IDispatch 的所有方法,可能主要集中在 Invoke 上。要记住的关键是 IDispatch 是一个非常特殊的接口。虽然 COM 规则确保 IID_IDispatch 的 QI 返回单个实现,但从 IDispatch 派生的其他接口可以选择拥有自己独立的 Invoke 等实现。这意味着转换为 IDispatch 可以从 QI-ing 中产生不同的结果。我发现这种行为令人困惑,但一些经典的 AX 场景需要它。

话虽如此,我强烈建议不要以这种方式挂钩,除非可能是出于调试目的。不要在真实的应用程序代码中发布以这种方式工作的代码。它会变得非常不稳定。

马丁

于 2011-05-24T05:48:23.557 回答