看到别人用脚本写的QQ自动登陆程序,自己也突发奇想,写了这篇“用汇编语言实现QQ自动登陆”的文章。本人最初是打算用c++来做这篇文章的,可是又发现论坛里学汇编的朋友大有人在,为了符合大众口味,于是改为用win32汇编来实现。因此在本篇的附件中有两份代码,一份是用vc做的win32应用程序,没有用到mfc;另一份是汇编的,也就是本篇所用到的代码,其实原理都是一样的。本篇不只是给出了实现QQ自动登陆程序的具体方法,同时给出了此次编程分析的过程。
我们知道QQ登陆的流程是
1.打开腾讯QQ客户端。
2.输入帐号。
3.输入密码。
4.点击登录按钮。
5.选择上网环境,点击确定。
那么我们实现这个QQ自动登陆程序也就按照这个步骤来。
1.首先要启动腾讯QQ的客户端。这里会用到一个api函数。ShellExecute,这个函数不但能执行一个文件,还能打开一个文件夹,或者访问一个网址。我们要启动QQ,就要知道QQ可执行文件的位置。比如我的电脑是D:\Program Files\Tencent\QQ\FinePlus.exe,大家查看一下自己桌面上腾讯QQ这个快捷方式的属性就能看到了。好,现在编写代码,新建工程:
include windows.inc ;
.data
hwndQQ dword ? ;保存QQ登陆主对话框的句柄,
hwnd1 dword ? ;保存QQ子控件的句柄。
hwnd2 dword ? ;保存QQ子控件的句柄
.code
Start:
invoke ShellExecute,0,"OPEN","D:\Program Files\Tencent\QQ\FinePlus.exe","","",SW_SHOW
invoke ExitProcess,0
end Start
对于任何一个习惯了vc编程的人来说,突然要用汇编来写程序,那仿佛一下子回到了远古时代,很多简单明了的语句都不能使用,非常之郁闷。本人是在很早以前学的汇编,到现在已经快忘得差不多了,因此代码中可能有很多考虑不周的地方,还请大牛们谅解一下。
启动QQ对话框之后,我们就要打算输入帐号密码了。我们要对QQ登陆对话框进行操作。就必须知道QQ登陆对话框的句柄,要获得句柄我们要用到一个api函数:FindWindow.,因此接下来就调用这个函数,我们把获得的句柄保存在hwndQQ这个变量中。
invoke FindWindow,0,"QQ用户登录"
mov hwndQQ,eax
可是很快你会发现一个问题。要知道我们的程序是运行得很快的,这个程序执行完ShellExecute之后马上会执行FindWindow。而这个时候QQ登陆对话框还没有显示出来。那么结果是FindWindow返回的结果是0。没有句柄后面的操作就无从谈起。那么怎么办呢,你可能会想到让这个程序sleep几秒,但是到底sleep几秒,我们也不确定,为了让程序达到最快的执行效率,我们不用sleep,用一个循环。
.WHILE(TRUE)
invoke FindWindow,0,"QQ用户登录"
mov hwndQQ,eax
.BREAK.IF(eax)
.ENDW
在这个循环里一发现句柄就退出循环。这段代码自己尝试的时候不要打错,否则有可能进入死循环,那么就要在任务管理器中的进程列表中找到并结束这个程序的进程。
2.接下来我们开始输入帐号了,同样我们要输入帐号,就要知道用来输入帐号的那个组合框的句柄。因为这个组合框是QQ登陆对话框的子窗口控件,这时我们会用到api函数FindWindowEx。在这里,我并不打算介绍每用到的一个api函数的用法,每个api函数的具体用法请去查看相关资料。好,继续写
invoke FindWindowEx,hwndQQ,0,"ComboBox",""
mov hwnd1,eax
接下来我们开始输入帐号,我们用到SendMessage。这个函数可以向组合框发送消息,还有一个api函数是PostMessage,这个函数同样能向别的窗口发送消息。改变组合框的显示内容可以发送WM_SETTEXT消息。
代码如下:
invoke SendMessage,hwnd1, WM_SETTEXT,0,“123456789”
3.接下来就要输入密码了,跟上面一样,用Spy++看一下密码框,我们可以看到这个密码框被腾讯作了手脚。因为在spy++中显示的不是Edit这个类名,而是一个对话框的类名。那么我们暂时无法使用操作像普通编辑框那样的方法。我们在Spy++仔细看看这个密码子对话框,我们发现这个子对话框有一个子窗口,类名为Edit,原来这个子窗口就是真正的密码输入编辑框。一切好办。编写代码:
invoke FindWindowEx,hwndQQ,0,"#32770",0
mov hwnd1,eax
invoke FindWindowEx,hwnd1,0,"Edit",0
mov hwnd2,eax
得到了编辑框的句柄,我们开始输入密码了。腾讯QQ的密码编辑框很奇怪,我们只能一个一个字符的输入,不能像上面一样,一行代码就搞定了。因此,大家只有多敲敲键盘了。
invoke PostMessage,hwnd2,WM_CHAR,'P',0
invoke PostMessage,hwnd2,WM_CHAR,'A',0
invoke PostMessage,hwnd2,WM_CHAR,'S',0
invoke PostMessage,hwnd2,WM_CHAR,'S',0
4.输入了密码之后,就要点击登录了。有了前面的经验,在这里我就不罗嗦了,直接看代码:
invoke FindWindowEx,hwndQQ,0,"Button","登录"
mov hwnd1,eax
invoke PostMessage,hwnd1,WM_LBUTTONDOWN,0,0
invoke PostMessage,hwnd1,WM_LBUTTONUP,0,0.
5.点击登录之后会出现选择上网环境的对话框,如果你的QQ客户端不会出现这个对话框的话,就不要加后面的代码了。
.WHILE(TRUE) ;下面这段代码加不加根据个人需要而定
invoke FindWindow,0,"请选择上网环境"
mov hwnd1,eax
BREAK.IF(eax)
.ENDW
invoke FindWindowEx,hwnd1,0,"Button","确定"
mov hwnd2,eax
invoke PostMessage,hwnd2,WM_LBUTTONDOWN,0,0
invoke PostMessage,hwnd2,WM_LBUTTONUP,0,0
至此,一个QQ自动登录的程序就这样完成了。最后要注意的是尽量用PostMessage,而不要用SendMessage,,我在前面的代码中用了一个SendMessage,大家还是尽量换成PostMessage。
---------------------------------------------------------------------------------------------------------------------------------------
后文地址:
http://bbs.pediy.com/showthread.php?t=90100
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)