本人新手,第一次发帖,有很多地方都不是很专业,各位大神见笑了~~
说破解可能会有点喧哗取众 - -,准确的说应该算是腾讯的一个小小的漏洞吧,有可能在这之后就会被修复了...
下面我就简单的说下整个流程:
QQ客户端现在的整体的一个情况是,在打开QQ但还没登陆之前,会有一个QQProtect.exe + 2个QQ.exe 进程(通过分析后知道其中一个QQ.exe是专门负责处理登陆密码框,该进程会在登陆成功后退出,另外一个QQ.exe是负责UI界面的显示),在登陆期间结束3个进程中任何一个都会引起3个进程一起退出.
现在我主要关注的是密码框所在进程,而密码框进程是由QQProtect.exe调用CreateProcess 来启动,这个的话只需要注入QQProtect,Hook CreateProcess,然后再注入密码框进程,注入密码框进程后,密码控件此时是还没有创建的,如果要第一时间获取到创建的密码框控件句柄可以Hook CreateWindow,我这里区别密码控件的句柄是通过类名及窗口名,目前发现暂时还是唯一的.获取到控件句柄以后就立马修改回调函数地址(后来经过我多次试验发现设置这个窗口回调地址一定要在创建窗口时,不然等到窗口创建成功后,它内部会循环调用SetWindowLong交替设置它的两个回调函数地址,一旦其中一个回调函数发现上次的回调函数地址不对就立马崩溃).
那现在回调函数是设置成功了,但是由于它后面会循环设置回调函数,所以它内部就能保证它的回调函数是最先被调用的,而我设置的回调函数是在它的回调之后.然后所有的消息都会经过它处理后再传到我的回调函数地址,这样的话无论如何在我的回调函数里获取的信息都是被它内部处理过,根本没法获得有用的信息.它这样做确实很蛋疼,什么WM_CHAR,WM_KEYDOWN,WM_KEYUP,WM_GETTEXT 消息全部没用.
只能想想其他办法了,Hook DispatchMessage 应该没问题,比较下窗口句柄就行了,这样总能先一步获取消息了吧 - -,没错,但是这里会收到一些无关的WM_CHAR,WM_KEYDOWN及WM_KEYUP...怎么办呢?
后来发现这些个无关的消息最终不会被送到窗口的回调函数(具体什么原因还没分析,猜测应该是自己过滤的),太好了这样我只需要通过回调函数对应的消息配合后过滤无关的WM_CHAR消息了.这样一来我就可以收到正确的按键消息,而且是没有经过它内部的
回调函数处理的.
嗯 以为这样就能获取到按键输入的密码了 - -,那时我心里就想呢,腾讯的程序员不也就这样嘛...被我两下搞定... 哈哈,结果尼玛发现输入的结果完全不对...输入的字符全部被重新编码了(所谓的重新编码就是 它将26个ascii码全部打乱重组, 比如 原来的c代表a,d代表e,e代表z... 而且是每次都随机,这还没完,最蛋疼的就是它不是每个ascii码都一定会使用重组后的编码,它有可能使用正常的编码!!!),所以现在的情况就是:比如 abcdef 对应打乱后的是fedcba, 如果现在我输入密码 abc,那此时的字符 可能是 fed,可能是 fbc,也有可能是fec ...
无奈了,只能Hook SendInput看有没有什么新的发现...
果然不出所料,重大发现- -:
1,所有和输入有关,且非正确的字符由SendInput发送(ExtInfo为33).
2,所有和输入无关的字符也是由SendInput发送,但是(ExtInfo为0).
3,所有正确的字符不会经过SendInput!!!
所以现在的话我只要获取到被打乱后的字符(关于获取打乱后的字符,可以在窗口创建,但是还没有显示之前,自己模拟26个ascii码然后SendInput,这样在回调函数里面收到的一定是错误的编码,具体原因也没有分析,可能是因为密码控件窗口还没有做初始化工作!!!),然后~~~你懂的 - -
源码:http://bbs.pediy.com/showthread.php?p=1279700#post1279700
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!