故事总要有缘由,那么这个故事的缘由就是,当我以前写了一个获取其它进程密码框密码的时候(前几篇博客中有描述),我抱着试一试的心情去试探了一下能不能得到 QQ 的密码,当我抓到密码框的句柄,然后输入给程序的时候,结果令人失望,并没有任何结果,或许这根本就是一个假的密码框。这便激发了我的兴趣,便有了这次探究。
QQ 的安全密码框果然是下了功夫的。网上搜索相关内容,才发现,以前腾讯用了韩国的技术来保证密码的安全性,但由于涉及到驱动,造成了一部分的不稳定性,所以最后取消掉了这种方法,那么最新的方法是如何做到密码安全呢?这种密码安全是否还有提升的空间呢?我决定试一试。
首先想到的办法便是键盘钩子,大家都知道,键盘钩子可以监听系统中所有的击键信息,马上编码实现,主要调用为:
[cpp] view plaincopy
- HHOOK SetWindowsHookEx( int idHook,
- HOOKPROC lpfn,
- HINSTANCE hMod,
- DWORD dwThreadId
- );
传入的参数是:WH_KEYBOARD
打开程序监听,目标程序选择了大家不太关注的QQMusic(手头上暂时只有这个程序),打开密码框输入我的密码,结果没有任何有用信息,为什么呢?我们知道如果在钩子链中前面的钩子没有显示调用后面的钩子,后面是得不到信息的,我们能不能把自己的钩子放到最前面呢。有两点需要注意,一,后安装的钩子会在钩子链的最前面,二,我们安装的是普通钩子,还有一种低级的键盘钩子会在其前面执行。那我们直接安装低级钩子并且尽量迟的调用不就行了么。
程序完成后,我发现,确实可以收到键盘信息了,不过在收到的信息中有许多干扰信息,基于纯理论分析这一做法,可以猜测,肯定有一个定时发送模拟按键消息的 Timer 在执行,去掉这个 Timer,当然就没有了干扰信息。但事情进行的不是那么简单,我发现,每次我接收到的键盘消息并不是我真正按下去的按键,莫非它安装了一个在我前面的钩子,改掉了按键信息?于是我便写了一个程序,去分析当前系统中的钩子的信息,结果如下:
[cpp] view plaincopy
- 0x64b012d 0xc2cbf81 QQMusic.exe
- 0x64b012d 0xc2cbf81 QQMusic.exe
- 0x64c012d 0xc2cbf81 QQMusic.exe
- 0x64c012d 0xc2cbf81 QQMusic.exe
- 0x64c012d 0xc2cbf81 QQMusic.exe
- 0x64d012d 0xc2cbf81 QQMusic.exe
- 0x64d012d 0xc2cbf81 QQMusic.exe
- 0x64d012d 0xc2cbf81 QQMusic.exe
- 0x64e012d 0xc2cbf81 QQMusic.exe
- 0x64e012d 0xc2cbf81 QQMusic.exe
- 0x64e012d 0xc2cbf81 QQMusic.exe
- 0x64f012d 0xc2cbf81 QQMusic.exe
- 0x64f012d 0xc2cbf81 QQMusic.exe
- 0x64f012d 0xc2cbf81 QQMusic.exe
- 0x650012d 0xc2cbf81 QQMusic.exe
- 0x650012d 0xc2cbf81 QQMusic.exe
- 0x650012d 0xc2cbf81 QQMusic.exe
- 0x651012d 0xc2cbf81 QQMusic.exe
- 0x651012d 0xc2cbf81 QQMusic.exe
- 0x652012d 0xc2cbf81 QQMusic.exe
- 0x652012d 0xc2cbf81 QQMusic.exe
- 0x652012d 0xc2cbf81 QQMusic.exe
- 0x652012d 0xc2cbf81 QQMusic.exe
- 0x652012d 0xc2cbf81 QQMusic.exe
- 0x652012d 0xc2cbf81 QQMusic.exe
第一列便是钩子的句柄值,我是每隔一秒钟扫描一次的,可以清楚的发现,值在不断的变化,那么很容易便可以猜想到,它肯定在不断去设置新的钩子来达到使其在钩子最前端这一效果。那么去掉这个钩子,我们便能够使自己的钩子监听到键盘信息了。
本文只给出了思路,可以看出,在密码安全这一方面,还是做了不少工夫的,现在密码的安全也越来越受到各个公司的重视,希望能够以此文互相交流,使我们的密码安全做到更好。