APIHOOK之拦截TerminateProcess

用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:[email protected]
我一会找个地方把DLL和TEST的代码上传一下。。大家都帮忙允许一下好吗?》顺便说说系统版本!


// 自定义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
可以修改内存权限
 

你可能感兴趣的:(winapi,null,hook,dll,path,basic)