近期小弟做了一个关于用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;
}

解决方案 »

  1.   

    函数体在5byte以上的函数,都能截获,只要你能读写那个进程。
    有一个api只有int 3一条指令,就没办法。忘了叫什么名字了。
      

  2.   

    我有APIHook代码(Detours什么意思?)
    http://myproject.91x.net
      

  3.   

    可能是函数名称的问题,因为一般的API有真实的版本(ANSI和UNICODE),比如:#ifdef UNICODE
    #define AfxMessageBox AfxMessageBoxW
    #else
    #define AfxMessageBox AfxMessageBoxA
    #endif
      

  4.   

    TO  BigFanOfCpp
    我这两个东东也都试过的,关于NOTEBOOK关闭时询问保存对话框,通过APIHOOK,可以看出其原形是MESSAGEBOX的,可就是不能DETOURS 他的~
      

  5.   

    拦截MessageBoxA和MessageBoxW两个函数