Win7 SetWindowsHookEx 导致exploer.exe等进程挂掉

cctdbnj 2012-03-06 11:53:53
SetWindowsHookEx(WH_GETMESSAGE, HookProc, g_hInstance, NULL);
在虚拟机的Win7和XP中都是正常的,hook也成功。但在主机的Win7系统就出问题(explorer.exe等进程挂掉,程序结束前任务管理器也挂掉,GetLastError返回0),有知道什么情况的?
...全文
260 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cctdbnj 2012-03-14
  • 打赏
  • 举报
回复
谢了,忘了结了。
Lactoferrin 2012-03-07
  • 打赏
  • 举报
回复
全部代码
cctdbnj 2012-03-07
  • 打赏
  • 举报
回复
现在用一个很小的程序测试,同样出问题。
g_hInstance是DllMain DLL_PROCESS_ATTACH时传入的hMoudle,至于HookProc里面就直接返回了return CallNextHookEx(g_hHook, nCode, wParam, lParam);
Lactoferrin 2012-03-07
  • 打赏
  • 举报
回复
还有apihook,这个是容易导致崩溃的,仔细检查
fly4free 2012-03-07
  • 打赏
  • 举报
回复
我知道的一件事就是:DllMain 会被多次调用。比如,另一个模块(.dll)创建了线程,也会调用的

不知道 g_hInstance = (HINSTANCE)hModule; 放在 switch 语句外面是否有影响。
cctdbnj 2012-03-07
  • 打赏
  • 举报
回复

//Dll文件
HHOOK g_hHook = NULL;
HINSTANCE g_hInstance = NULL;
PROC g_oldProc = (PROC)OpenProcess;

typedef HANDLE (WINAPI *OPENPROCESS)(DWORD, BOOL, DWORD);

HANDLE WINAPI MyOpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId)
{
MessageBox(NULL, "Test", NULL, MB_OK);
return ((OPENPROCESS)g_oldProc)(dwDesiredAccess, bInheritHandle, dwProcessId);
}

int InitHook(char *DllName, PROC OldFunAddr, PROC NewFunAddr)
{
HMODULE lpBase = GetModuleHandle(NULL);
IMAGE_DOS_HEADER *dosHeader;
IMAGE_NT_HEADERS *ntHeader;
dosHeader=(IMAGE_DOS_HEADER*)lpBase;
ntHeader=(IMAGE_NT_HEADERS32*)((BYTE*)lpBase+dosHeader->e_lfanew);
IMAGE_IMPORT_DESCRIPTOR *pImportDesc=(IMAGE_IMPORT_DESCRIPTOR*)((BYTE*)lpBase+ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
while(pImportDesc->FirstThunk)
{
char* pszDllName = (char*)((BYTE*)lpBase + pImportDesc->Name);
if(lstrcmpiA(pszDllName, DllName) == 0)
{
break;
}
pImportDesc++;
}

DWORD* lpAddr;
IMAGE_THUNK_DATA* pThunk = (IMAGE_THUNK_DATA*)((BYTE*)lpBase + pImportDesc->FirstThunk);
while(pThunk->u1.Function)
{
lpAddr = (DWORD*)&(pThunk->u1.Function);
if(*lpAddr == (DWORD)OldFunAddr) //位置a
{
DWORD dwOldProtect;
MEMORY_BASIC_INFORMATION mbi;
::VirtualQuery(lpAddr, &mbi, sizeof(mbi));
::VirtualProtect(lpAddr, sizeof(DWORD), PAGE_READWRITE, &dwOldProtect);

WriteProcessMemory(GetCurrentProcess(),lpAddr, &NewFunAddr, sizeof(DWORD), NULL);

::VirtualProtect(lpAddr, sizeof(DWORD), dwOldProtect, 0);
}
pThunk++;
}
return 0;
}

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
g_hInstance = (HINSTANCE)hModule;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
InitHook("Kernel32.dll", g_oldProc, (PROC)MyOpenProcess);
break;
}
return TRUE;
}

//导出函数
void SetHook(BOOL bSet)
{
if (bSet)
g_hHook = SetWindowsHookEx(WH_GETMESSAGE, HookProc, g_hInstance, NULL);
else
UnhookWindowsHookEx(g_hHook);
}

///////////////////////////////////////////////////////////////////////
//主程序
typedef void (*SetHook)(BOOL bSet);

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HMODULE hModule = LoadLibrary("ApiHook.dll");
if(hModule==NULL)
return 0;

SetHook SetApiHook = (SetHook)GetProcAddress(hModule, "SetHook");
if(SetApiHook == NULL)
return 0;

SetApiHook(TRUE); //执行后explorer.exe挂掉

Sleep(60000);
SetApiHook(FALSE);

return 0;
}
Lactoferrin 2012-03-07
  • 打赏
  • 举报
回复
因为导出表可能会被合并到.text节,此时就可能和程序指令共用某些页,如果你把保护改成不可执行,那么在尝试执行与导入表共用页的代码就会出错
cctdbnj 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lactoferrin 的回复:]

还有apihook,这个是容易导致崩溃的,仔细检查
[/Quote]

出错点貌似找到了,VirtualProtect()的第三个参数传PAGE_READWRITE在win7下出问题,改成PAGE_EXECUTE_READWRITE 则正常,求解释
cctdbnj 2012-03-07
  • 打赏
  • 举报
回复
另外还发现InitHook中(上面 位置a 处的if判断没有成立过,while循环只执行过程没有发现OpenProcess,也就是说替换函数地址没有执行。是因为本模块中没有使用到OpenProcess么?)

执行SetApiHook(TRUE)后 explorer.exe挂掉,然后会弹出MessageBox("Test")。
Lactoferrin 2012-03-06
  • 打赏
  • 举报
回复
你要告诉HookProc,g_hInstance都是怎么来的
仅给个SetWindowsHookEx(WH_GETMESSAGE, HookProc, g_hInstance, NULL);什么都看不出来
cctdbnj 2012-03-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lactoferrin 的回复:]

别的地方的问题
[/Quote]

会是什么地方,我在公司的电脑和家里的都是Win7,都会出问题。
Lactoferrin 2012-03-06
  • 打赏
  • 举报
回复
别的地方的问题

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧