首页
社区
课程
招聘
[旧帖] [原创]用汇编语言实现QQ自动登陆 0.00雪花
发表于: 2009-5-26 12:47 2698

[旧帖] [原创]用汇编语言实现QQ自动登陆 0.00雪花

2009-5-26 12:47
2698
看到别人用脚本写的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期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 56
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
写的很好,赞一个,怎么没人给邀请码阿
2009-5-26 15:59
0
雪    币: 118
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
哪位大哥支持一下,本人邮箱:chenye153@163.com
2009-5-26 17:04
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
写的很好,我也来试试。谢谢了!
2009-5-26 17:49
0
雪    币: 113
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
真是不错的文章。
2009-5-28 09:13
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
哎 没有人照顾我们新人吗?给个邀请码吧
2009-5-28 11:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这个是用汇编写的吗,没学过,哎。哪个前辈能给个汇编的初级入门教程吗?
2009-5-30 20:26
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
现在的QQ登陆界面已经屏蔽了POSTMESSAGE和sendmessage等操作,楼主说的方法已经不行了。
2010-5-30 17:45
0
雪    币: 224
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
太好了,正在学WIN32汇编
2010-5-30 18:11
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
现在的QQ登陆界面已经屏蔽了POSTMESSAGE和sendmessage等操作,楼主说的方法已经不行了
2010-8-30 01:56
0
雪    币: 1099
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dqs
11
1.等待QQ启动的代码,感觉不那么友好
.WHILE(TRUE)
invoke FindWindow,0,"QQ用户登录"
mov hwndQQ,eax
.BREAK.IF(eax)
.ENDW
2.如果QQ登陆过程中,出现需要输入验证码,没有考虑到。

如果LZ能自已根据Tencent的网络协议,发送验证信息到服务器,就能得到邀请码了吧。
2010-8-30 10:11
0
游客
登录 | 注册 方可回帖
返回
//