首页
社区
课程
招聘
ASM写的一个日志钩子回调函数,为什么不能钩到按键?
发表于: 2006-5-13 12:07 5201

ASM写的一个日志钩子回调函数,为什么不能钩到按键?

2006-5-13 12:07
5201
回调函数如下:

;钩子回调函数
HookProc        proc _dwCode,_wParam,_lParam
                invoke        CallNextHookEx,hHook,_dwCode,_wParam,_lParam
                pushad
                .if _dwCode == HC_ACTION
                    mov            ebx,_lParam
                    assume  ebx:ptr EVENTMSG
                    .if [ebx].message == WM_KEYDOWN
                        .if [ebx].paramL == VK_F12
                             invoke MessageBox,NULL,offset szCaption,offset szCaption,MB_OK
                        .endif
                    .endif
                .endif
                assume ebx:nothing
                popad
                ret
HookProc        endp

在我按下F12键的时候怎么不能显示出消息框呢?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
最好先用调试器在HookProc中设断点跟踪看看
2006-5-13 13:13
0
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢楼上的提醒,在调试过程中:
0040111E  |.  60            pushad
0040111F  |.  837D 08 00    cmp     dword ptr [ebp+8], 0             ;  是否 HC_ACTION?
00401123  |.  75 21         jnz     short 00401146                   ;  是则不跳转
00401125  |.  8B5D 10       mov     ebx, [ebp+10]                    ;  将_lParam送入ebx
00401128  |.  813B 00010000 cmp     dword ptr [ebx], 100             ;   .if [ebx].message == WM_KEYDOWN
0040112E  |.  75 16         jnz     short 00401146
00401130  |.  837B 04 7B    cmp     dword ptr [ebx+4], 7B            ;  是否F12键?
00401134  |.  75 10         jnz     short 00401146
00401136  |.  6A 00         push    0                                ; /Style = MB_OK|MB_APPLMODAL
00401138  |.  68 30204000   push    00402030                         ; |Title = "test"
0040113D  |.  6A 00         push    0                                ; |Text = NULL
0040113F  |.  6A 00         push    0                                ; |hOwner = NULL
00401141  |.  E8 22010000   call    <jmp.&user32.MessageBoxA>        ; \MessageBoxA
00401146  |>  61            popad
00401147  |.  C9            leave
00401148  \.  C2 0C00       retn    0C

在这里, dword ptr [ebx+4] 为什么是587B 呢?
2006-5-13 13:43
0
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我在源程序里把
.if [ebx].paramL == VK_F12
改成 .if [ebx].paramL == 587bh
后,按F12倒是可以弹出对话框来了,不过却要弹出21个来,点一下确定又来一个,一共要点21次确定。。不知道是怎么回事?

但是在用OD进行单步调试的时候却又只点一下确定就行了。
2006-5-13 13:49
0
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
郁闷,没人帮忙。。。
2006-5-15 11:28
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
6
最初由 无奈无赖 发布
我在源程序里把
.if [ebx].paramL == VK_F12
改成 .if [ebx].paramL == 587bh
后,按F12倒是可以弹出对话框来了,不过却要弹出21个来,点一下确定又来一个,一共要点21次确定。。不知道是怎么回事?

........


我也不知道怎么回事,不过有办法的,不一定要messagebox
invoke SendDlgItemMessage,hWinMain,IDC_TEXT,EM_REPLACESEL,0,addr szCaption

用SendDlgItemMessage替换MessageBox,然后给他定义一个RC文件

把拦截的F12输入到IDC_TEXT  偶测试通过..
2006-10-6 21:26
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
7
我测试了几天,终于找到弹一次的办法:
  invoke MessageBox,NULL,offset szCaption,offset szCaption,MB_OK
 .if eax != NULL
  invoke ExitProcess,NULL
.endif
.......

呵呵,我想你应该明白,但是还是不够完美
2006-10-7 18:11
0
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
非常感谢Winker

我都已经放弃这个问题了的,非常感谢你现在还能够给我回贴并给出解决办法.

不过我还是不知道是为什么出出来那么多消息框.
2006-10-7 23:31
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
9
偶也不知道,郁闷ing~~

摸索去了.....
2006-10-8 01:34
0
游客
登录 | 注册 方可回帖
返回
//