我可以获取从COM Dispatch Interface挂钩的函数指针吗? (不是双界面)

时间:2011-05-24 03:58:51

标签: com hook vtable dispatch

我可以问一下COM Distach接口中的挂钩方法吗?

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

我正在尝试在运行时挂钩Com对象的界面。

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

以下是我的代码大纲。

// 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 );

这是成功的,直到我找到一些具有Dispatch Interface(不是双重)的Com Object。

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

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

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

我知道当我使用这些com对象时,我会使用'Invoke'方法。

但问题是我试图挂钩。我需要函数指针。

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

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

任何建议将不胜感激。

骗过你。

1 个答案:

答案 0 :(得分:0)

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

话虽如此,我强烈建议不要以这种方式挂钩,除非是为了调试目的。不要在真实的应用程序代码中提供以这种方式工作的代码。结果会很不稳定。

马丁