0

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の関数ポインタのみがあります。

アドバイスをいただければ幸いです。

よろしくお願いします。

4

1 に答える 1

0

IDispatch をフックするには、IDispatch のすべてのメソッドをフック/シムすることができます。おそらく主に Invoke に焦点を当てます。覚えておくべき重要なことは、IDispatch が非常に特殊なインターフェイスであることです。COM ルールは、IID_IDispatch の QI が単一の実装を返すことを保証しますが、IDispatch から派生した他のインターフェイスは、Invoke などの独自の個別の実装を持つことを選択できます。つまり、IDispatch へのキャストは、QI とは異なる結果をもたらす可能性があります。この動作は紛らわしいと思いますが、一部の従来の AX シナリオでは必要です。

そうは言っても、おそらくデバッグ目的を除いて、この方法でフックしないことを強くお勧めします。実際のアプリ コードでこのように動作するコードを出荷しないでください。非常に不安定になります。

マーティン

于 2011-05-24T05:48:23.557 に答える