私はMicrosoftのDetoursを使ってAPIをフックしています。たとえば、次のようにMessageBoxA
呼び出されたときに何が起こるかを変更できます。
int (WINAPI* pMessageBoxA)(HWND, LPCTSTR, LPCTSTR, UINT) = MessageBoxA;
int WINAPI MyMessageBoxA(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
{
printf("A function is called here!\n");
return pMessageBoxA(hWnd, lpText, lpCaption, uType); // call the regular MessageBoxA
}
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)pMessageBoxA, MyMessageBoxA);
したがって、を呼び出すときMessageBoxA
は、実際にを呼び出していMyMessageBoxA
ます。ここで、実行時に上記のコードが実行することを実行
する関数を作成します。Hook()
たとえば、関数ポインタMessageBoxA
を関数に渡すと、上記のコードとまったく同じように動作します。
もちろん、他の関数ポインタを渡すこともできます。
次に、で関数ポインターを取得するときに、指定された関数(この場合はto )とHook
同じ戻り値とパラメーターを使用して関数を定義し、関数の関数本体を埋めるにはどうすればよいですか?MessageBoxA
int WINAPI MyMessageBoxA(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)