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 );
これは、ディスパッチインターフェイス(デュアルではない)を持つComオブジェクトが見つかるまで成功しました。
一部のComオブジェクトにディスパッチインターフェイス(デュアルではない)しかない場合、VTableに関数ポインターはありません。
GetTypeInfoCount、GetTypeInfo、GetIDsOfNames、InvokeなどのMFCの関数ポインタがあります。
さらに、pfuncdesc-> oVftは、そのインターフェイスに属するすべての関数に対して常に0です。
この種のcomオブジェクトを使用するときは、「Invoke」メソッドを使用する必要があることを知っています。
しかし、問題は、Imがフックしようとしていることです。関数ポインタが必要です。
IDispatchからこれらの関数ポインタを取得するにはどうすればよいですか?
IDispatch->vtableにはMFCの関数ポインタのみがあります。
アドバイスをいただければ幸いです。
よろしくお願いします。