===关于Detours截获API函数,比如MessageBox===
近期小弟做了一个关于用Detours截获全局MessageBox 的API,测试下来发先并不是所有的API都能够截获,比如在WINDOWS 核心技术中的测试文本文件保存文字时询问你的是否需要保存时的那个对话框,我始终不能截获它,按理说应该可以截获啊,另外,我也使用MessageBox 的原形截获了AfxMessageBox、MessageBoxA、MessageBoxB,但是始终不能了解到系统中到底还有哪些不能截获,以及为什么?
源码:
DLL
/////////////////////////////////////////////////////////////
#pragma data_seg("Shared")
HHOOK g_hShellHook = NULL;
#pragma data_seg()
#pragma comment(linker, "/Section:Shared,rws")
DETOUR_TRAMPOLINE(int WINAPI MineMessageBox(HWND,LPCTSTR,LPCTSTR,UINT),MessageBox);
int WINAPI NewMessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)
{
return MineMessageBox(hWnd,"modify ok",lpCaption,uType);
}
//利用系统钩子和其他应用程序发生关联
static LRESULT WINAPI ShellProc(int code, WPARAM wParam, LPARAM lParam)
{
return(CallNextHookEx(g_hShellHook, code, wParam, lParam));
}
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
g_hShellHook = SetWindowsHookEx(WH_SHELL,(HOOKPROC)ShellProc,hInstDll,0);
DetourFunctionWithTrampoline((PBYTE)MineMessageBox,(PBYTE)NewMessageBox);
}
else if (ul_reason_for_call == DLL_PROCESS_DETACH) {
DetourRemove((PBYTE)MineMessageBox,(PBYTE)NewMessageBox);
UnhookWindowsHookEx(g_hShellHook);
}
return TRUE;
}