首页
社区
课程
招聘
[旧帖] [求助]碰到难题 如何 HOOK WM_CLOSE 消息 0.00雪花
发表于: 2011-8-16 15:12 1840

[旧帖] [求助]碰到难题 如何 HOOK WM_CLOSE 消息 0.00雪花

2011-8-16 15:12
1840
我用WH_CALLWNDPROC钩子根本拦截不到WM_CLOSE消息,难道是因为不在消息队列中?我连自己的程序都没法HOOK WM_CLOSE消息,哪位高手有经验的给指点下,我只是想关闭前做些处理!

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
对了,是HOOK外部程序不是自己的程序,不然我就直接加一个wm_close消息处理了
还请高手慷慨帮助!
2011-8-16 15:20
0
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
抓狂了,搞了一天没明白,为什么就是HOOK不到WM_CLOSE消息,这是为什么呢???
哪位朋友有经验的给个小例子或者给点指点哈!
要疯掉了!

主要想HOOK这个消息的原因是我HOOK了gettickcount这个函数,但是在程序结束时弹出错误信息,说是程序异常,我就慢慢摸索后发现,可能是因为程序结束时没有恢复gettickcount的原始API地址,所以只有HOOK下WM_CLOSE消息,使他结束前处理下!

下面是hook gettickcount的代码,真不知道为什么HOOK别的函数都没问题,只有HOOK了gettickcount后就会报异常!
/////////////////////////////////////////////////////////////
DWORD WINAPI my_GetTickCount()
{       
        DWORD dwProtect;

        /*恢复GetTickCount()的前5个字节*/
        VirtualProtectEx(hHandle, fpApiAddrsend,5, PAGE_READWRITE, &dwProtect);
        WriteProcessMemory(hHandle, fpApiAddrsend, OldCodesend, 5, 0);
        VirtualProtectEx(hHandle, fpApiAddrsend, 5, dwProtect, &dwProtect);

        DWORD dwRet;       
        dwRet = ((PFN_GetTickCount)(PROC) g_GetTickCount)();
        dwRet  = DWORD(double(dwRet - g_dwFirstOfGetTickCountRet) * g_dMultiple);

        /*改写GetTickCount()的前5个字节*/
        VirtualProtectEx(hHandle, fpApiAddrsend, 5, PAGE_READWRITE,&dwProtect);       
        WriteProcessMemory(hHandle, fpApiAddrsend, NewCodesend, 5, 0);
        VirtualProtectEx(hHandle, fpApiAddrsend, 5, dwProtect, &dwProtect);
        return dwRet;
}
//////////////////////////////////////////////////////
高手指点下,是不是因为程序突然关闭,导致没有恢复GetTickCount()的前5个字节,而使程序报出异常错误呢?
2011-8-16 16:47
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=丶路飞;991470]我用WH_CALLWNDPROC钩子根本拦截不到WM_CLOSE消息,难道是因为不在消息队列中?我连自己的程序都没法HOOK WM_CLOSE消息,哪位高手有经验的给指点下,我只是想关闭前做些处理![/QUOTE]

Windows编程中有许多似是而非的概念,好的办法就是多看看MSDN, 而不是想当然。 这虽然让很多人无所是从,但写程序理当如此。

The WH_CALLWNDPROC and WH_CALLWNDPROCRET hooks enable you to monitor messages sent to window procedures. The system calls a WH_CALLWNDPROC hook procedure before passing the message to the receiving window procedure, and calls the WH_CALLWNDPROCRET hook procedure after the window procedure has processed the message.

也就是说,如果那个WM_CLOSE消息是程序在内部使用SendMessage( ... )发送的,你的hook能够收到,如果不是(比如说是使用PostMessage,你收不到是正常的)。那要怎么办呢?还是看MSDN。

The WH_GETMESSAGE hook enables an application to monitor messages about to be returned by the GetMessage or PeekMessage function. You can use the WH_GETMESSAGE hook to monitor mouse and keyboard input and other messages posted to the message queue.

希望你明白了。
2011-8-17 10:58
0
雪    币: 81
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
用wh_GetMessage 钩子
2011-8-18 11:16
0
游客
登录 | 注册 方可回帖
返回
//