これは過剰に答えられた質問のように思えますが、これは異なります。いくつかのメソッドをエクスポートするこの ActiveX オブジェクトがあります。そのメソッドの 1 つにフックを設定する必要があります。つまりFunc1
、 などを使用してこれを行う方法を知っていVirtualProtect()
ます。ollydbg を開いて ActiveX DLL を掘り下げるとFunc1
、フックを設定する必要がある場所の正確なアドレスが表示されます。
Visual Studio 2008 を使用して、プリコンパイラ ディレクティブを使用しています。
#import "myactx.dll" no_namespace, named_guids, raw_interfaces_only
そして私のコードでは、これをやろうとしています:
LPVOID ptr = &IMyActx::Func1;
コンパイル時にエラーを返します:
エラー C2440: '初期化中': 'HRESULT (__stdcall IMyActx::* )(BSTR,BSTR)' から 'LPVOID' に変換できません。
私が調査したところ、暗黙的なパラメーターのために、クラスへのポインターを関数へのポインターにキャストできないことがわかりましたthis
。
ただし、この関数を呼び出すつもりはありません。メモリ内のアドレスを知りたいだけで、それをフック ルーチン (LPVOID
ポインタを想定) に渡すことができます。
関数を呼び出すことはできるが、メモリ内の生のアドレスを取得できないということは、私には考えられないようです。必要なポインターを取得するためだけに、x86 アセンブリ コードを挿入したくなります。
読んでくれてありがとう。
編集...考えてみると...純粋な仮想クラスであるLPVOID ptr = &IMyActx::Func1;
ため、機能しないはずです! IMyActx
とにかく、オブジェクトをインスタンス化して生のポインターを取得しようとする前に、いくつかの組み合わせを試しましたが、Func1
これまでのところ何も機能しませんでした。Func1
への呼び出しが次のように生成されることを ollydbg で確認します。
mov edx, [eax];
call dword ptr ds:[edx + 0x1C];
DWORD
したがって、 atvptr + 0x1C
バイトを読み取る必要があると想定できます。
私の記憶が正しければ、Component Object Model は、常に同じインターフェイス ID が与えられたFunc1
ptrであることを保証します。[vptr + 0x1C]
永遠に。右?
やや疑似コードで、おそらく次のようなことをします。
#define FUNC1_ENTRY 0x1C / sizeof(LPBYTE)
CoCreateInstance(CLSID_MyActx, 0, CLSCTX_ALL, IID_IMyActxObj, (LPVOID*) &pObj);
LPVOID pToHook = (*pObj)[FUNC1_ENTRY];