1 根据网上的文章,至少到QQ2013版本时,QQ主要通过以下几个方式实现密码保护:
a 登录窗体和密码输入框分离为两个进程
b 设置调试钩子和低级键盘钩子阻止HOOK,所以必须干掉两个钩子
c 设置钩子代码后有检测代码以阻止篡改setwindowshookex的参数,所以必须nop掉检测代码
d 运行时拷贝代码保护c中的检测代码,所以必须HOOK掉memcpy
2 自己通过registerhotkey这个API成功地在不修改QQ运行时代码的情况下截获了用户名,但是截获密码失败。过程如下:
step1 通过registerhotkey设置[0-9a-zA-Z]为热键,截取键盘输入;但是键盘输入如果作为热键则无法作为正常输入,所以必须通过step2-4模拟键盘输入
step2 截取后马上unregister解除获取字符的热键绑定 ,为step3做准备
step3 通过keybd_event实现模拟键盘输入
step4 重新registerhotkey该字符,等待下一次输入
在截获QQ用户名输入框输入时,一切OK。截取QQ密码框输入后,keybd_event模拟输入时,直接发生多次输入的异常。想必QQ是连keybd_event这个API也通过某种方式截获了,防止模拟输入。
3 总结:从用户态获取密码太TMD蛋疼了。要去除QQProtect保护,要反汇编,要运行时修改QQ代码,还要防止QQ版本变更导致老方法失灵。直接上驱动从内核态获取行不?
经实践,通过键盘过滤驱动能完美的截获QQ运行时敲击键盘的一系列输入,无视QQProtect,无视360。载入驱动可以使用DriverStudio的Monitor,查看输出可以使用DbgView。只要QQ不涉及驱动层的保护,那当然也就无视QQ版本变更。