1

私はdllをプログラムします。この dll で、メモリにロードされた別の dll の関数をフックしたいと考えています。これは、何時間もの作業の結果です。

typedef int (__fastcall *def_cry)(int a,int b,int fromlen);
def_cry Real_cry;
int __fastcall custom_cry(int a,int b,int fromlen) {
    Log("cry ...");
    __asm nop;
    return Real_cry(a, b, fromlen);
}
DWORD imageBaseOtherDll = 0x39500000;
DWORD functionOffset = 0x395742F8;
DWORD imageBase = (DWORD)GetModuleHandle("otherDll.dll");
DWORD functionOffset = imageBase + (functionOffset  - imageBaseOtherDll);
Real_cry = (def_cry)DetourFunction((PBYTE)functionOffset,(PBYTE)&custom_cry);

どうやら、私のフックが機能していないようです。コードにいくつかの論理エラーを入れたと思いますが、私は初心者であり、助けが必要です!

4

1 に答える 1

3

フックしている関数が__fastcall呼び出し規約を使用していることは確かですか?

DLL からエクスポートされた関数をフックするには、それを呼び出すすべてのモジュール (dll/exe) のインポート テーブルにパッチを適用するか、実行時に関数のエントリ ポイントを書き換える必要があります。インポート テーブルへのパッチ適用に関する適切な記事は、CodeProject のこちらにあります。MS Detours の使用に関する優れたチュートリアルは、ここにあります。

DetourFunction を呼び出すときに、フックする関数のアドレスを指定する必要があります。これらの値は、DLL が特定のアドレスに読み込まれることが保証されていないため、ハード コードしないでください。これは、次のコードで非常に簡単に実行できます。

// Get the module containing the function to hook
HMODULE targetModule = GetModuleHandle("otherDll.dll");
// Get the address of the function to hook
FARPROC targetFunction = GetProcAddress(targetModule, "cry");
// Go hook it.
Real_cry = (def_cry)DetourFunction((PBYTE)targetFunction,(PBYTE)&custom_cry);
于 2011-07-26T01:12:28.370 に答える