hook代码为什么只执行一次?

lengx7 2009-10-17 03:55:34
LRESULT CALLBACK GetMsgProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
char ch[100],cha[100];
PMSG TEMSG;
TEMSG = (PMSG)lParam;
itoa((DWORD)(TEMSG->message),ch,10);
itoa((DWORD)(TEMSG->hwnd),cha,10);
MessageBoxA(NULL,ch,cha,MB_OK);
return CallNextHookEx(MessageHook, code, wParam, lParam);
}

MessageHook=SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,(HINSTANCE)hModule,(DWORD)thwd);


以上代码在HOOK后,立刻并且只跳出了一次MessageBox,然后再怎么Post/SendMessage也没反映了...
...全文
365 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
奇才有点痴 2009-10-19
  • 打赏
  • 举报
回复
mark
lengx7 2009-10-19
  • 打赏
  • 举报
回复
void SetHook()
{
MessageHook=SetWindowsHookEx(WH_KEYBOARD,GetMsgProc,GetModuleHandle("HOOK.dll"),(DWORD)thwd);
}

把上面的SetHook做成导出函数,使用程序A静态加载DLL,然后调用SetHook挂到计算器上,HOOK成功

但是如果把SetHook写在DLL_PROCESS_ATTACH中,用LoadLibrary把DLL注入目标进程,让DLL自身调用SetHook对自身进程HOOK(确认SetWindowsHookEx第4参数thwd正确),却一直无法成功

被LoadLibrary加载的DLL不能直接HOOK自身进程吗?
lengx7 2009-10-18
  • 打赏
  • 举报
回复
把DLL内的MessageBox全部去掉,改为GetMsgProc接到消息就SendMessage(tth,2222,1,2);[被注入的delphi程序接收到此消息后会自动退出]
在SetWindowsHookEx后面紧跟SendMessage(tth,2222,1,2);目标进程被注入后立刻退出。SendMessage在这里运行成功

SetWindowsHookEx后面什么都不加直接break,DLL注入后,不管向目标进程发送什么消息都没反映....



日志调试不知道是什么。。。我去搜一下
wjlsmail 2009-10-18
  • 打赏
  • 举报
回复
日志调试是个办法
鱼翅1013 2009-10-18
  • 打赏
  • 举报
回复
恩。
对钩子调试的时候,赞同日志调试,而非MessageBox输出信息...
MoXiaoRab 2009-10-18
  • 打赏
  • 举报
回复
日志调试就是多弄输出吧
YeBinYe 2009-10-17
  • 打赏
  • 举报
回复
MessageBoxA的问题
lengx7 2009-10-17
  • 打赏
  • 举报
回复
以上代码都是在DLL内的,使用的时候用LoadLibrary把DLL注入目标进程,SetWindowsHookEx在DLL_PROCESS_ATTACH中执行,目标进程选用一个delphi程序或者计算器做测试
如果在SetWindowsHookEx后面紧跟一个MessageBox
thwd = GetWindowThreadProcessId(tth,&tpid);
SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,(HINSTANCE)hModule,(DWORD)thwd);
MessageBoxA(NULL,thwd,tth,MB_OK);//为了方便就这么写了
对话框中tth与用Windows优化大师看到的目标主窗口句柄相同
随后点击对话框中的“确定”,跳出GetMsgProc中的对话框
itoa((DWORD)(TEMSG->message),ch,10);
itoa((DWORD)(TEMSG->hwnd),cha,10);
MessageBoxA(NULL,ch,cha,MB_OK);
发现message为0x200,hwnd为0x2D10E4
然后就再没有任何对话框出现了

如果SetWindowsHookEx后面没有MessageBox直接break,则什么对话框都不会出现
zcq108 2009-10-17
  • 打赏
  • 举报
回复
应该是代码本身的问题,第一次挂入了钩子,说明钩子是挂入了的,然后是你挂入后处理不对或者造成了挂入后的远线程异常。建议你不要用MESSAGEBOX,此可能使远线程崩溃,可以用其他调试手段,譬如日志跟踪适用于DLL的调试。。
an_bachelor 2009-10-17
  • 打赏
  • 举报
回复
可能你另一头没有Get/Peek Message
需要GetMessage/PeekMessage才会触发这个构字处理过程

16,472

社区成员

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

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

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