近期小弟做了一个关于用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;
}
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;
}
解决方案 »
- ifstream流输入带文字路径的文件时出错
- LPARAM lParam参数转换问题
- 为什么是显示乱码,UNICODE的问题吗?
- 大虾指教,基于对话框的打印程序怎么实现分页功能!
- 如何实现MP3的播放?
- VC程序完成后如何打包
- [MFC] CDialog指针的 UpdataData()方法 的问题
- 再问,怎样才能在程序视窗的任意位置按住鼠标后可以移动整个窗体而不是里面的视图
- 在继承自Cscrollview的ondraw函数中设置滚动条位置 m_horz=GetScrollPos(SB_HORZ)后 显示没反应
- visual assist1079的注册码?
- 请帮我解释一下以下程序的意思,谢谢,要散分的哦
- 高分!!!工具栏简单问题
有一个api只有int 3一条指令,就没办法。忘了叫什么名字了。
http://myproject.91x.net
#define AfxMessageBox AfxMessageBoxW
#else
#define AfxMessageBox AfxMessageBoxA
#endif
我这两个东东也都试过的,关于NOTEBOOK关闭时询问保存对话框,通过APIHOOK,可以看出其原形是MESSAGEBOX的,可就是不能DETOURS 他的~