0

迂回ライブラリを使ってチュートリアルを作ろうとしています。

古いバージョンの detour ライブラリ v1.5 では、関数 DetourFunction を使用してアドレスを定義していたため、DLL は関数を探す場所を認識していました。

たとえば、次のように使用できます。

         InsertDateTime = (int (__stdcall*)(int))DetourFunction((PBYTE)0x01006F10,       (PBYTE)MyInsertDateTime)

http://www.moddb.com/groups/ibepex/tutorials/function-hookingを参照してください

ただし、新しいバージョンでは、関数は次のように変更されています

     LONG DetourAttach(
        PVOID * ppPointer,
        PVOID pDetour
     );

ここで、ppPointer は迂回先のターゲット ポインターへのポインターです。

ターゲット関数のアドレスが 16 進数形式 0x01006F10 でわかっているので、これをどうにかして ppPointer の引数として使用したいと考えています。私はただ書いてみました:

               InsertDateTime = (int (__stdcall*)(int))DetourAttach((PVOID*)0x01006F10, MyInsertDateTime);

コンパイルはうまくいきますが、私のプログラムは思ったように動作しません。プログラムはそのアドレスから関数を決してキャッチしないようです。

したがって、基本的に私の質問は、16 進アドレスへのポインターを正しく使用したか、次に、DetourAttach() の使用方法に根本的な間違いがあるかということです。

4

1 に答える 1

3

使い方がDetourAttach間違っています。あなたの場合の正しい使用法は次のとおりです。

int(__stdcall* InsertDateTime)(int) = (int(__stdcall*)(int))(0x01006F10);

LONG errorCode = DetourAttach((PVOID*)(&InsertDateTime), (PVOID)MyInsertDateTime);
if(!errorCode) {
    //Detour successful
}

ASLRなどのテクノロジーが存在する場合に注意してください。GetProcAddressなどを使用して、実行時に関数のアドレスを取得する必要があります。そうしないと、破損やクラッシュが発生する可能性があります。

于 2013-06-07T10:39:46.637 に答える