我正在玩微软的Detours to hook 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
给函数,它将完全按照上面的代码执行。
当然,我也可以将其他函数指针传递给它。
那么有一个问题,当我得到一个函数指针时Hook
,如何定义一个与给定函数具有相同返回值和参数的函数(在本例中MessageBoxA
为 to int WINAPI MyMessageBoxA(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
),然后填充函数的函数体?