为什么钩子钩不到任何消息? 钩子回调函数触发不了?

screen12 2016-07-11 09:32:38
我在程序中,用CreateProcess创建了一个子进程。然后设置了一个钩子,钩这个子进程的主线程中的消息。在SetWindowsHookEx中,填入的是CreateProcess中获得的子进程的主线程的线程ID。

可是我发现,在SetWindowsHookEx中,如果填入的是子进程的主线程的ID,则获取不到任何消息,钩子回调函数从来没有被触发。但SetWindowsHookEx的返回值不是0,书上说不是0表示成功,而且我用PCHunter看了一下,子进程中确实钩子模块已注入。但在“消息钩子”中,却找不到这个钩子。

但如果我把SetWindowsHookEx中的线程ID改为0,则可以成功。返回值正确,钩子函数能被正确触发。PCHunter中也能看到这个钩子。

我又把SetWindowsHookEx中的线程ID改为自己的线程ID(就是创建一个局部钩子),结果也能成功。PCHunter中能看到这个钩子,也能正确触发。

现在总结一个,如果SetWindowsHookEx中的线程ID填写的是本进程ID(设置局部钩子),或0(设置远程全局钩子),都正确。但填入用CreateProess创建的子进程的主线程的ID,就不行了。表现为返回值正确(非0),但触发不了,在PCHunter中也找不到这个钩子。

而且我用Spy ++看了一下,线程ID确实是对的,传给SetWindowsHookEx的线程ID,确实和SPY ++ 获取的子进程的主线程ID是一样的。

记得成功过一次,可是编着编着,不知怎么的,就不行了,而且一直找不到原因。

程序代码如下,希望能帮我看看原因在哪里?


主程序autozen.cpp:

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include "resource.h"
#include "autozen.h"
#pragma comment(lib, "c:\\1\\autozen\\debug\\mess.lib")
LRESULT CALLBACK DlgProc1(HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam);
//===================================================================================================
HINSTANCE hIn;
STARTUPINFO si, si_yc;
PROCESS_INFORMATION pi_zen, pi_yc;
TCHAR buf[MAX_PATH];
//***************************************************************************************************
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
hIn = hInstance;
DialogBoxParam(hIn, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc1, NULL);
return 0;
}
//==============================================================================================
LRESULT CALLBACK DlgProc1(HWND hDlg, UINT message, WPARAM wParam,LPARAM lParam)
{
static int type, otheruno;
switch(message)
{
case WM_INITDIALOG:
{
si.cb = sizeof(STARTUPINFO);
//-----------------------------------------------------------------------------------zen 6
_tcscpy(buf, L"C:\\Windows\\system32\\notepad.exe");
if(CreateProcess(buf, L"", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi_zen) == 0)
return 0;
if(WaitForInputIdle(pi_zen.hProcess, INFINITE) != 0)//此函数等待新进程初始化完成才返回
return 0;
InstallHook(hDlg, pi_zen.dwThreadId, WM_HOOK);
return TRUE;
}
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:{
return TRUE;
}
case IDCANCEL:{
EndDialog(hDlg, FALSE);
return TRUE;
}
}
case WM_CLOSE:
EndDialog(hDlg, FALSE);
return TRUE;
default:
;
}
return FALSE;
}




钩子程序mess.cpp:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include "..\\autozen\\autozen.h"
//----------------------------------------------
#pragma data_seg ("shared")
HHOOK hHook = 0;
HWND hWnd = 0;
UINT dwMessage = 0;

#pragma data_seg ()
//---------------------------------------------------------------------------------------------
HINSTANCE hIn;
//==============================================================================================
int WINAPI DllMain(HINSTANCE _hInstance, DWORD fdwReason, PVOID pvReserved)
{
hIn = _hInstance;
return TRUE;
}
//===============================================================================================
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode == HC_ACTION){
MSG msg = *(MSG *)lParam;
if(msg.message == WM_COMMAND){
SendMessage(hWnd, WM_HOOK, wParam, lParam);
}
}
return 0;
}
//==============================================================================================
BOOL CALLBACK InstallHook(HWND _hWnd, DWORD tid, int _dwMessage)
{
hWnd = _hWnd;
dwMessage = _dwMessage;
hHook = SetWindowsHookEx(WH_GETMESSAGE, HookProc, hIn, tid);
if(hHook == 0)
MessageBox(NULL, _T("钩子安装失败!"), NULL, MB_ICONERROR);
return TRUE;
}
//==============================================================================================
BOOL CALLBACK UninstallHook()
{
UnhookWindowsHookEx(hHook);
return TRUE;
}



头文件autozen.h:

#define WM_HOOK WM_USER + 1
#define WM_WAIT WM_USER + 2
BOOL CALLBACK InstallHook(HWND _hWnd, DWORD tid, int _dwMessage);
BOOL CALLBACK UninstallHook();
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);


头文件mess.def:

LIBRARY "mess"

EXPORTS

InstallHook
UninstallHook
HookProc


记得刚开始是成功的,可以触发消息的,不知怎么的,就不行了。
...全文
524 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
crypta 2016-10-09
  • 打赏
  • 举报
回复
我也想知道.
screen12 2016-07-18
  • 打赏
  • 举报
回复
引用 4 楼 boylafong 的回复:
[quote=引用 3 楼 screen12 的回复:] 我自己发现了原因在哪儿。那就是:钩子回调函数还是被触发了。钩子已经正常起作用了。 但是下的断点却不会在那里中断,因为当钩子函数被触发的时候,是别的进程调用的。因此本进程(调试程序)无法在那里中断。 用个MessageBox就知道了。
你自己的调试方法不对而已[/quote] 那怎样调试,才能让别的进程中调用钩子函数时,里面的断点也能起作用呢? 我是正确启动程序,而不是启动钩子DLL,是不是要启动钩子DLL,才能让断点成功?
boylafong 2016-07-18
  • 打赏
  • 举报
回复
引用 5 楼 screen12 的回复:
[quote=引用 4 楼 boylafong 的回复:] [quote=引用 3 楼 screen12 的回复:] 我自己发现了原因在哪儿。那就是:钩子回调函数还是被触发了。钩子已经正常起作用了。 但是下的断点却不会在那里中断,因为当钩子函数被触发的时候,是别的进程调用的。因此本进程(调试程序)无法在那里中断。 用个MessageBox就知道了。
一种是把调用dll的程序放到你dll程序的debug目录,启动dll程序,你选择该程序 一种是 调试--附加到进程 你自己的调试方法不对而已[/quote] 那怎样调试,才能让别的进程中调用钩子函数时,里面的断点也能起作用呢? 我是正确启动程序,而不是启动钩子DLL,是不是要启动钩子DLL,才能让断点成功? [/quote] 一种是把调用dll的程序放到你dll程序的debug目录,启动dll程序,你选择该程序 一种是 调试--附加到进程
screen12 2016-07-12
  • 打赏
  • 举报
回复 1
我自己发现了原因在哪儿。那就是:钩子回调函数还是被触发了。钩子已经正常起作用了。 但是下的断点却不会在那里中断,因为当钩子函数被触发的时候,是别的进程调用的。因此本进程(调试程序)无法在那里中断。 用个MessageBox就知道了。
boylafong 2016-07-12
  • 打赏
  • 举报
回复
引用 3 楼 screen12 的回复:
我自己发现了原因在哪儿。那就是:钩子回调函数还是被触发了。钩子已经正常起作用了。 但是下的断点却不会在那里中断,因为当钩子函数被触发的时候,是别的进程调用的。因此本进程(调试程序)无法在那里中断。 用个MessageBox就知道了。
你自己的调试方法不对而已
赵4老师 2016-07-11
  • 打赏
  • 举报
回复
使用DLL 关闭UAC、防火墙、杀毒软件 以管理员身份运行 32位和64位不一样。 ……
screen12 2016-07-11
  • 打赏
  • 举报
回复
我的问题,简单的就是: 我想安装一个针对特定线程的钩子(别的进程的),结果安装返回值显示成功,但钩子函数一直触发不了。就好象没安装这个钩子一样。而那个线程的ID经检查是对的。 但换成全局钩子,就是那个线程的ID为0,这样的钩子是可以获取所有进程的所有线程的消息的,发现成功。 再试一下,把那个线程ID换成本进程的一个线程ID,发现也成功。 也就是说‘: 安装本进程的某一个线程的钩子,成功。安装全局钩子,成功。就是安装针对另一个进程的某线程的钩子,不行。但安装后,返回值看起来是对的。就是不起作用。 这是怎么回事?难道不是填入某线程ID,就是监视这个线程的消息吗?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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