有关日志钩子的疑问

xuejianbest 2014-11-25 03:00:20
最近学习windows钩子遇到很多疑惑问题,其中一个是用日志钩子监视键盘消息,我在钩子函数中加入几句代码用来调试,调试思路是把程序运行中变量的值保存到一个全局内存dwTest中,最后输入结果就知道过程中变量的值了。但是当程序开始运行后,按一下键盘A键关闭程序,发现过程中变量的值并未按照预期变化,请大神帮忙看看。
程序如下:
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include myDll.inc
includelib myDll.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN equ 1000
DLG_MAIN equ 1000
IDC_TEXT equ 1001
WM_HOOK equ WM_USER + 100h
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data

szBuffer db 1000h dup (0)
szPrintf db '%d', 0
dwTest dd 100h dup (0)
.data?

hInstance dd ?
hWinMain dd ?
hHook dd ?
szAscii db 32 dup (?)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 钩子回调函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
HookProc proc _dwCode,_wParam,_lParam
local @szKeyState[256]:byte

invoke CallNextHookEx,hHook,_dwCode,_wParam,_lParam
pushad
.if _dwCode == HC_ACTION
mov ebx,_lParam
assume ebx:ptr EVENTMSG
.if [ebx].message == WM_KEYDOWN
invoke GetKeyboardState,addr @szKeyState
mov al, @szKeyState + VK_A
movzx eax, al
mov dwTest, eax
invoke GetKeyState,VK_SHIFT
mov @szKeyState + VK_SHIFT,al
mov ecx,[ebx].paramH
mov dwTest+4, ecx
shr ecx,16
mov dwTest+8, ecx
invoke ToAscii,[ebx].paramL,ecx,addr @szKeyState,addr szAscii,0
mov byte ptr szAscii [eax],0
.if szAscii == 0dh
mov word ptr szAscii+1,0ah
.endif
invoke SendDlgItemMessage,hWinMain,IDC_TEXT,EM_REPLACESEL,0,addr szAscii
.endif
assume ebx:nothing
.endif
popad
xor eax,eax
ret

HookProc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam

mov eax,wMsg
;********************************************************************
.if eax == WM_CLOSE
invoke UnhookWindowsHookEx,hHook
invoke EndDialog,hWnd,NULL
;********************************************************************
.elseif eax == WM_INITDIALOG
push hWnd
pop hWinMain
invoke SetWindowsHookEx,WH_JOURNALRECORD,addr HookProc,hInstance,NULL
.if eax
mov hHook,eax
.else
invoke EndDialog,hWnd,NULL
.endif
;********************************************************************
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret

_ProcDlgMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
invoke _ShowMem, offset dwTest, 40, 0 ;我写的调试子程序,输出内存dwTest处的数字,查看结果
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
...全文
244 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Daisy__Ben 2014-12-01
  • 打赏
  • 举报
回复
正确结果是啥意思 是要看到按键的ascii值A?难道不应该把toAscii换成MapVirtualKey?csdn好恶心
xuejianbest 2014-12-01
  • 打赏
  • 举报
回复
http://blog.csdn.net/xuejianbest/article/details/41645637
xuejianbest 2014-11-30
  • 打赏
  • 举报
回复
引用 5 楼 zeta0s 的回复:
我想楼主可能把ascII码值和虚拟键码值弄混了,它们之间存在模拟信号和数字信号的转换
我没有搞混,但是一直存在这个问题,我在日志钩子中处理WM_KeyDown消息,然后用GetKeyState获取相应按键的状态,再打印出来,发现总是无法获得正确结果,不知道怎么回事。
zeta0s 2014-11-27
  • 打赏
  • 举报
回复
我想楼主可能把ascII码值和虚拟键码值弄混了,它们之间存在模拟信号和数字信号的转换
Sandrer 2014-11-25
  • 打赏
  • 举报
回复
你不是应该发到汇编板块吗? 这些代码我只认识英语单词....不认识它们所代表的意思..........
xuejianbest 2014-11-25
  • 打赏
  • 举报
回复
引用 1 楼 Henzox 的回复:
你想设置一个全局钩子,却没有把钩子过程用 dll 封装,这样是有问题的。
这是日志钩子,不需要用dll。 有人吗。解决了问题还可以继续加分到100.
Henzox 2014-11-25
  • 打赏
  • 举报
回复
你想设置一个全局钩子,却没有把钩子过程用 dll 封装,这样是有问题的。
Henzox 2014-11-25
  • 打赏
  • 举报
回复
引用 2 楼 xuejianbest 的回复:
[quote=引用 1 楼 Henzox 的回复:] 你想设置一个全局钩子,却没有把钩子过程用 dll 封装,这样是有问题的。
这是日志钩子,不需要用dll。 有人吗。解决了问题还可以继续加分到100.[/quote] lpfn [in] Pointer to the hook procedure. If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process, the lpfn parameter must point to a hook procedure in a dynamic-link library (DLL). Otherwise, lpfn can point to a hook procedure in the code associated with the current process.

15,472

社区成员

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

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