2011-07-26 49 views
1

私はdllをプログラムします。このdllでは、メモリにロードされた別のdllの関数をフックしたい。これは多くの作業時間の結果です。C++関数フック(dll、asm)

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); 

私のフックは動作しないようです。私はコードにいくつかの論理的な誤りを入れたと思うが、私は初心者の援助だ!

+0

asm - これまでに試したことと何が問題だと思いますか?あなたの問題の焦点を絞る。もしあなたが "これを見てそれを修正できますか?"あなたの質問は投票され、閉鎖されます。 – Josh

+0

(男) - 男は新しいです、彼は彼が "-1ing"彼によって、stackoverflowから逃げたいと思うようにしないでください...私は質問がかなり明確だと思います。 – Cipi

答えて

3

フックしている関数で__fastcall呼び出し規約が使用されていますか?

DLLからエクスポートされた関数をフックするには、またはと呼ばれるすべてのモジュール(dll/exe)のインポートテーブルをパッチして実行時に関数エントリポイントを書き換える必要があります。インポートテーブルにパッチを当てるためのまともな記事は、CodeProject hereにあります。 MS Detoursの使用に関する良いチュートリアルはhereです。

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);