用SetWindowsHooKEx加载修改进程IAT的DLL实现OpenProcess拦截,导致Explorer或taskmgr出错? |
[ 来源:ITWENKU 时间:2006-11-16 17:52:10 | 浏览:1人次 ] |
使用了windows核心编程里面的APIHOOK类,程序都写好了,在几台电脑试过,只有我电脑一运行,到SetWindowsHooKEx时,系统注入DLL到所有进程,修改IAT就出错。。我晕。。调了好几天了。。 我找到一个相关的。但还是不大明白里面说的意思 http://www.codeproject.com/dll/Win32APIHooking_Trouble.asp 为什么其他电脑都没有问题,我的系统确不行,都是XP系统,我的系统重装了也一样存在问题。同事说是我更新了系统补丁可能不给我修改系统进程IAT导致。那没有理由其他系统可以啊! 那位搞HOOK的高手帮帮我。。我Q:191972323 EMAIL:191972323@qq.com 我一会找个地方把DLL和TEST的代码上传一下。。大家都帮忙允许一下好吗?》顺便说说系统版本! <script src="../../ads/ad468_1.js" type="text/javascript"></script> // 自定义TerminateProcess函数 BOOL WINAPI Hook_TerminateProcess(HANDLE hProcess, UINT uExitCode) { typedef BOOL (WINAPI *PFNTERMINATEPROCESS)(HANDLE, UINT); // 取得主模块的文件名称 char szPathName[MAX_PATH]; ::GetModuleFileName(NULL, szPathName, MAX_PATH); // 构建发送给主窗口的字符串 char sz[2048]; wsprintf(sz, "/r/n 进程:(%d)%s/r/n/r/n 进程句柄:%X/r/n 退出代码:%d", ::GetCurrentProcessId(), szPathName, hProcess, uExitCode); // 发送这个字符串到主对话框 COPYDATASTRUCT cds = { ::GetCurrentProcessId(), strlen(sz) + 1, sz }; if(::SendMessage(::FindWindow(NULL, "进程保护器"), WM_COPYDATA, 0, (LPARAM)&cds) != -1) { // 如果函数的返回值不是-1,我们就允许API函数执行 return ((PFNTERMINATEPROCESS)(PROC)g_TerminateProcess)(hProcess, uExitCode); } return TRUE; } // 挂钩TerminateProcess函数 CAPIHook g_TerminateProcess("kernel32.dll", "TerminateProcess", (PROC)Hook_TerminateProcess); /// #pragma data_seg("YCIShared") HHOOK g_hHook = NULL; #pragma data_seg() static HMODULE ModuleFromAddress(PVOID pv) { OutputDebugString("==>ModuleFromAddress()"); MEMORY_BASIC_INFORMATION mbi; if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0) { OutputDebugString("<==ModuleFromAddress"); return (HMODULE)mbi.AllocationBase; } else { OutputDebugString("<==ModuleFromAddress()"); return NULL; } } static LRESULT WINAPI GetMsgProc(int code, WPARAM wParam, LPARAM lParam) { return ::CallNextHookEx(g_hHook, code, wParam, lParam); } BOOL WINAPI SetSysHook(BOOL bInstall, DWORD dwThreadId) { OutputDebugString("==>SetSysHook()"); BOOL bOk; if(bInstall) { g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, ModuleFromAddress(GetMsgProc), dwThreadId); bOk = (g_hHook != NULL); } else { bOk = ::UnhookWindowsHookEx(g_hHook); g_hHook = NULL; } OutputDebugString("<==SetSysHook()"); return bOk; } 上面是DLL的代码。是拦截TerminateProcess的,但一样出错! 代码上传到这里来: http://bbs.driverdevelop.com/read.php?tid=120141&page=e&#a 我做过同类的事情 是因为WINXP DEP数据执行保护造成的 VirtualQueryEx VirtualProtectEx 可以修改内存权限 |
APIHOOK之拦截TerminateProcess
最新推荐文章于 2022-11-23 01:19:46 发布