收到论坛老鸟们的提示,用汇编语言编写的QQ自动登录(原帖地址:
http://bbs.pediy.com/showthread.php?t=89901其代码在QQ2008正式版及以后版本中无法完成密码的输入,因此本人就把自己老掉牙的版本QQ2007卸载,再装上QQ2008IIBeta1版本测试了一下,晕,还真的不行。本人搞不懂QQ到底在干什么.没办法,只能根据自己已有的经验来分析了。通过调试程序发现:在源程序代码中:
invoke FindWindowEx,hwndQQ,0,"#32770",0
mov hwnd1,eax
invoke FindWindowEx,hwnd1,0,"Edit",0
mov hwnd2,eax
所获得的密码编辑框的句柄(hwnd2)跟SPY++中所获得的句柄不一样。这就是不能完成密码输入的侦结所在。
经过一段黑暗的摸索,我终于得到一个结论:QQ客户端在启动之后,密码子对话框有一个迷惑我们的Edit,这个Edit大概在QQ启动2-3秒钟之后就会消失,随即而来的是密码子对话框会在其内创建一个新的密码输入编辑框。这个编辑框才是可以真正输入密码的编辑框。
为了证明我这个结论:启动windbg,用它来打开QQ客户端,QQ对话框一出现,立即点击Break(速度一定要快,要准);这个时候用spy++看看那个密码子对话框,发现它有一个子编辑框,记下它的句柄和标题,比如我测试的
一次是
Class:Edit
Caption:(空)
Handle:0x000F02DE;
让QQ客户端继续运行:
kd>g
过几秒中之后再次点击break(好像快捷键不能用);这个时候再用SPY++看一下,发现
Class:Edit
Caption:M(发现这个标题是随机的,每启动QQ一次,这个字符就变一次)
Handle:0x0001E368
这样前后两个编辑框的区别就大了。那么要获得真正的密码输入编辑框的句柄就不能用沿用以前的方法了,幸运的是,他们有标题的区别,我们就好办了,代码修改:
在.data中定义一个变量
Caption db 0,0,0,0
原代码:
invoke FindWindowEx,hwndQQ,0,"#32770",0
mov hwnd1,eax
invoke FindWindowEx,hwnd1,0,"Edit",0
mov hwnd2,eax
修改为
invoke FindWindowEx,hwndQQ,0,"#32770",0
mov hwnd1,eax
.WHILE(TRUE)
invoke FindWindowEx,hwnd1,0,"Edit",0
mov hwnd2,eax
invoke GetWindowText,hwnd2,offset caption,2
mov ebx,offset caption
xor eax,eax
mov eax,dword ptr [ebx]
.BREAK.IF(eax)
.ENDW
原来QQ2008Beta1绕了这么一个弯子,问题总算解决了。
另外本人看了一下QQ2009的正式版,发现QQ2009正式版有很多不同点,针对这一版本我又写了一份,并打包上传(VC++win32应用程序),可是这个工程编译后有时候能够正常执行,有时侯却不能正常执行,还请大牛看一下是为什么.QQ2009正式版本来就不好调试,本人又不懂得破解,想破脑壳也不知道到底是什么地方出了问题,只好求助大牛们了。下载不了附件的话,可看代码:
#include "stdafx.h"
#include "shellapi.h"
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
HWND hwndQQ=NULL,hwnd1=NULL,hwnd2=NULL;
ShellExecute(0,"OPEN","C:\\Program Files\\TENCENT\\QQ\\Bin\\QQ.exe",0,0,SW_SHOW);//启动QQ
while(true)
{
if(hwndQQ=FindWindow("TXGuiFoundation","QQ2009 正式版"))
break;
}
hwnd1=FindWindowEx(hwndQQ,0,"ATL:602E54D8","");
if(hwnd1)
{
SendMessage(hwnd1,WM_SETTEXT,0,(LPARAM)"123456789");//输入帐号
}
hwnd2=FindWindowEx(hwndQQ,0,"Edit",0);
if(hwnd2)
{
PostMessage(hwnd2,WM_CHAR,'P',0);//开始输入密码
PostMessage(hwnd2,WM_CHAR,'A',0);
PostMessage(hwnd2,WM_CHAR,'S',0);
PostMessage(hwnd2,WM_CHAR,'S',0);
}
PostMessage(hwndQQ,WM_LBUTTONDOWN,0,0x00C00124);//点击登录
PostMessage(hwndQQ,WM_LBUTTONUP,0,0x00C00124);
return 0;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)