本论坛为只读模式,仅供查阅,不能注册新用户,不能发帖/回帖,有问题可发邮件 xikug.xp (^) gmail.com
查看: 20994|回复: 51

QQ2010密码输入框保护原理之我见 [复制链接]

Rank: 2

发表于 2010-2-26 00:38:47 |显示全部楼层
这几天好好地研究了一下QQ2010登陆窗口的密码输入框,细节没有完全弄清楚, 不过还是看出了大致的原理了。在这里发表一下我的看法,和有兴趣的朋友一起讨论。菜鸟水平,认识问题的程度很有限,大牛们就飘过吧。

我首先想到的,是要搞清楚,他的保护原始是基于R0还是R3?
这个问题的答案是:R3。理由很简单,因为找不到QQ有驱动啊,所以自然就是在R3进行的保护了。这个没什么好说的,不讲了。

接着是,QQ究竟如何在应用层实现密码输入保护的呢?
这个问题一开始我想来想去都不明白。我的运气很好,后来无意中看到了QQ2010安装了两个很特别的windows消息钩子:WH_DEBUG和WH_KEYBOARD_LL,于是线索出来了。

看到这两个钩子,好特别啊,它们是做什么用的呢?为什么要安装这两个钩子呢?
我马上翻了一下MSDN,找到答案了。

原来,WH_DEBUG可以用来管理很多种类型的钩子,有这么多种:

WH_CALLWNDPROC
WH_CALLWNDPROCRET
WH_CBT
WH_DEBUG
WH_JOURNALPLAYBACK
WH_JOURNALRECORD
WH_KEYBOARD
WH_MOUSE
WH_MSGFILTER  
WH_SHELL
WH_SYSMSGFILTER

WH_DEBUG能管理这些类型的钩子,在这些钩子的钩子过程将要被系统调用的时候,系统总是先执行调试钩子的钩子过程。而MS的这个调试钩子,允许我们决定是否执行这些被管理的钩子。

我扫了一眼以上列表,在其中发现了WH_KEYBOARD钩子。原来普通键盘钩子是被调式钩子所管理的,也就是说,如果一个程序装上了调式钩子,那么在它上面的普通键盘钩子的钩子过程在执行之前,先要执行调式钩子,而在这个调式钩子里就可以拒绝执行即将执行的普通键盘钩子。
想到这里我恍然大悟了,难怪QQ装有一个调式钩子呢,难怪有全局键盘钩子记录不到QQ的密码呢!

还有一个低级键盘钩子,这个比较难一点,QQ保护原理核心都在这里面。
想贴一下这个钩子的钩子过程的反汇编代码,想想还是算了,太太长了。还是说一下我理解出来的意思吧,不全面,没有完全弄懂。

首先要知道的是,低级键盘钩子和普通简单钩子执行的先后顺序。
如果一个程序,同时被装有这两种钩子的话。在按键消息到来的时候,这两个钩子的执行顺序是:
低级键盘钩子 -》普通键盘钩子
为什么是这样的呢?我是看MSDN悟出来的,有疑问的话你也看看吧。
既然低级键盘钩子在普通键盘钩子的前面执行,自然它也有防御普通键盘钩子的能力了。

看到前面两个钩子,都是能够防御普通键盘钩子的。我自然想到,如果盗号者采用的是低级键盘钩子呢?是不是就能取得QQ的密码了呢?
带着好奇,我自己做了一个低级键盘钩子的测试程序。结果发现:

当我用鼠标点击密码输入框,把输入焦点定在这里时(并没有按键盘),测试程序就不停地输出按键信息。奇怪,我还没有开始输入密码啊,一个键都还没按呢!

后来冷静下来想了一想,这一定是TX为了防止盗号木马使用低级键盘钩子取走QQ的密码,而故意设置的虚假的按键信息,这样即使你用低级钩子记录到了某个正确的按键,其中必然混杂了很多虚假的按键信息,形成了干扰。

最后还有一点很重要的东西,可能大家很容易忘记,我在这里提醒一下大家。
细细地回想一下以前学习windows钩子学到的东西,记忆里会想起这么一个规律:
如果一个程序上被装上了多了同一类型的钩子,那么这些钩子的执行顺序是,先安装的后执行,
后安装的先执行。

也就是说,如果给某个程序同时装上两个低级键盘钩子A和B,安装的顺序是:A -》B,那么这个钩子的钩子过程执行的顺序就是:B -》A。

所以说,如果我们给QQ安装上一个低级键盘钩子,因为我门是在后面安装的,所以我们的钩子应该先执行,然后才执行QQ自己安装的低级键盘钩子。这不是成了QQ键盘保护的弱点了吗?我一边想着,一边在怀疑。

这个问题QQ是处理的呢?我在实践中探索到了答案,原来QQ会通过一个定时器,不停地对它的调式钩子和低级键盘钩子进行Unhook,然后马上再Hook。这样,不是就保证了QQ的钩子安装在盗号木马的钩子之后,从而先于木马的钩子执行了吗?哈哈

最后用一句话概括QQ自己的低级键盘钩子吧,尽管细节我也没有完全看明白,但还是能猜出来了。
QQ通过给自己在应用层设置这个低级键盘钩子,并不断脱钩、挂钩,来保证自己在应用层上是最先得到键盘消息的。既然是最先得到了,那么接下来要进行保护就容易了,自然就是先取得正确的按键信息,然后阻止这个消息继续传递下来给别人,就算传下去交给别人,也要修改按键信息,传一个错误的下去。:)

仔细回想一下整个过程,发现也不是很高深嘛,以前把QQ的键盘保护看得太神秘了
我知道的就这么多了,希望有深入理解的朋友继续报料啊

PS:望西裤哥哥给加点声望啊,我好多帖子都看不了呢,看在我写得这么辛苦的份上。。

Rank: 2

发表于 2010-2-26 00:41:38 |显示全部楼层
这排版好难看啊  

Rank: 1

发表于 2010-2-26 01:33:38 |显示全部楼层
.....动机太明显了....
声望....

Rank: 2

发表于 2010-2-26 02:02:33 |显示全部楼层
不是为了声望啊 || - _-

Rank: 4

发表于 2010-2-26 11:30:37 |显示全部楼层
自己装个键盘过滤驱动不就得了?反正是从下面传上来的。或者挂csrss.exe的win32k!RawInputThread

Rank: 2

发表于 2010-2-26 11:49:36 |显示全部楼层
我想了一个在应用层实现的办法:

先把QQ进程里的SetWindowsHookEx和UnhookWindowsHookEx废了,然后再安装低级键盘钩子来记录
实验了一翻这个办法是成功的,可是不知道为什么后来QQ的进程崩溃了。

Rank: 1

发表于 2010-2-26 11:57:11 |显示全部楼层
只能拜模~~

Rank: 3Rank: 3

发表于 2010-2-26 12:39:30 |显示全部楼层
估计qq还检测自己的钩子是否正常吧?

Rank: 9Rank: 9Rank: 9

发表于 2010-2-26 14:26:18 |显示全部楼层
不错。
QQ的密码框还会产生干扰,按了的键会变成另一个键信息,会生成一些随机的按键信息。
悟空,退下,为师一个人就够了

Rank: 2

发表于 2010-2-26 14:29:40 |显示全部楼层
QQ用了一个定时器,不停得卸载自己的钩子,又马上重新安装

如此来保证自己的钩子总是在最前面执行的

所以只要把SetWindowsHookEx和UnhookWindowsHookEx废了

那它就没办法了

Rank: 2

发表于 2010-2-26 14:36:35 |显示全部楼层
引用第8楼xIkUg于2010-02-26 11:26发表的  :
不错。
QQ的密码框还会产生干扰,按了的键会变成另一个键信息,会生成一些随机的按键信息。

恩,按了的键会变是QQ的低级键盘钩子改的,随机的按键信息则是QQ通过定时器产生的

幸运的是,后来我发现这些干扰可以通过LowLevelKeyboardProc的PKBDLLHOOKSTRUCT参数来克服

Rank: 2

发表于 2010-2-26 14:42:07 |显示全部楼层
哈 多谢大米加分啊

Rank: 1

发表于 2010-2-26 18:16:00 |显示全部楼层
引用第10楼huhu0013于2010-02-26 11:36发表的  :


恩,按了的键会变是QQ的低级键盘钩子改的,随机的按键信息则是QQ通过定时器产生的

幸运的是,后来我发现这些干扰可以通过LowLevelKeyboardProc的PKBDLLHOOKSTRUCT参数来克服
这个是对的
我以前也对qq做过类似的东西  只是我发现低级键盘钩子也对他无效的时候 我就放弃了
我研究是QQ2009  难道2010跟2009的保护是一样的?没什么改进吗?
多谢楼主的研究  我回头再搞QQ 
搞不死他不罢休!

Rank: 5Rank: 5

发表于 2010-2-26 19:26:39 |显示全部楼层
和谐,和谐~

Rank: 1

发表于 2010-2-27 01:16:27 |显示全部楼层
不错

Rank: 1

发表于 2010-2-27 02:15:13 |显示全部楼层
其实只要HOOK  SetTimer 就可以废掉QQ的键盘保护!

Rank: 2

发表于 2010-2-27 02:49:34 |显示全部楼层
引用第15楼chimney于2010-02-26 23:15发表的  :
其实只要HOOK  SetTimer 就可以废掉QQ的键盘保护!
它只会运行一次吧?而且你也是在他执行之后再废,还有用?

Rank: 1

发表于 2010-2-27 12:03:57 |显示全部楼层
不错   

Rank: 1

发表于 2010-2-28 02:51:48 |显示全部楼层
引用第16楼evilcode于2010-02-26 23:49发表的  :

它只会运行一次吧?而且你也是在他执行之后再废,还有用?

Hook SetTimer  修改 time-out value

不过腾讯对SetTimer 有校验!

Rank: 1

发表于 2010-3-1 12:16:22 |显示全部楼层
引用第0楼huhu0013于2010-02-25 21:38发表的 QQ2010密码输入框保护原理之我见 :
这几天好好地研究了一下QQ2010登陆窗口的密码输入框,细节没有完全弄清楚, 不过还是看出了大致的原理了。在这里发表一下我的看法,和有兴趣的朋友一起讨论。菜鸟水平,认识问题的程度很有限,大牛们就飘过吧。

我首先想到的,是要搞清楚,他的保护原始是基于R0还是R3?
这个问题的答案是:R3。理由很简单,因为找不到QQ有驱动啊,所以自然就是在R3进行的保护了。这个没什么好说的,不讲了。

.......

楼主很强大啊,呵呵
您需要登录后才可以回帖 登录 | 立即加入

Archiver|手机版|第8个男人 - 论坛为只读模式,仅供查阅

GMT+8, 2019-6-26 15:03 , Processed in 0.028771 second(s), 8 queries .

Design by pvo.cn

© 2011 Pvo Inc.

回顶部