QQ密码框防键盘记录的研究笔记

来源:互联网 发布:域名保护 编辑:程序博客网 时间:2024/05/21 11:00

兴趣所致,做些学习笔记.


QQ密码框从简单到复杂有好几套措施防止键盘记录.


第一层,最简单的.设置一个定时器.大概0.5秒定时用keybd_event 发送虚拟键盘消息.混淆记录.

这一层最容易实现也最容易破解.只需要在监听程序中HOOK WH_KEYBOARD_LL,在处理函数中检测flag是否有 LLKHF_INJECTED 标志位即可.


在写监听程序的时候遇到一个问题.WH_KEYBOARD_LL 是系统级别的钩子.那是不是必须要做成DLL注入到运行的程序中呢?



到MSDN有一段是This hook is called in the context of the thread that installed it.

这个描述是说这个HOOK是在安装钩子的线程的上下文中运行的.

系统钩子必须做成DLL是因为需要在其他进程运行我们的代码.

这两者是相冲突的.

看看MSDN中的描述 The WH_KEYBOARD_LL hook enables you to monitor keyboard input events about to be posted in a thread input queue.

也就是说这个钩子是在原始输入线程将消息放入线程输入队列之前调用的.这样就能理解了.

WH_MOUSE_LL 和 WH_KEYBOARD_LL 属于全局钩子,A线程安装钩子后,系统在将输入信息添加到某(焦点)线程前,通过SendMsg给A线程发消息.进入钩子函数.

并不使用注入,系统切换上下文到A线程,运行完再切换回去.所以这两个钩子是不需要做成DLL的系统钩子.


第二层.QQ本身也HOOK了WH_KEYBOARD_LL,而且为了保持自身的HOOK在最前,有个定时器不断的UNHOOK,HOOK.

实验下来发现,这样做有可能在UNHOOK和HOOK之间,原始输入线程插入了输入消息,此时的输入消息就不会被HOOK到.这种漏消息的情况就没法处理了.

但这需要很快的非正常按键操作.正常操作一般是不会有问题的


第三层.随机的修改发送按键消息.此部分消息在QQ的钩子函数中修改了 LLKHF_INJECTED 标志位.

随机规则大概是..激活控件时有可能触发,按下按键时有可能触发或停止.

触发后定时发送.分析数据发现,在一部分按键事件中.KBDLLHOOKSTRUCT 中的 time 很大.很不合理.想来是QQ用此数据来做真假消息的判断.


第四层.在钩子函数中随机的修改键值再往下发.这样即使别的程序能屏蔽掉所有虚假消息,也无法得到所有真实的键值.


第五层.QQ HOOK 了 WH_DEBUG 消息保证其他HOOK没法注入到进程,这里为了保证总在最前,可以不断的UNHOOK,HOOK.

补充一下.DEBUG钩子不能监视HOOK WH_KEYBOARD_LL和WH_MOUSE_LL


第五层.混淆代码.有备份代码..

具体参考

http://bbs.pediy.com/showthread.php?t=133943