上一篇文中提到,制作外挂的第一步,是与游戏进行连接,即登陆游戏。
对于QQ的游戏来说,可以有两种方法登陆游戏。一种是登陆空间再登陆游戏,QQ农场,QQ抢车位的游戏都可以这样登陆;另一种是登陆QQ校友再登陆游戏,QQ农场,QQ摩天大楼都可以这样登陆。
我要给大家讲的是第二种,或许有更好的方法,我在此权作是抛砖引玉。
我在第一篇文章中写道
我们进入网页游戏是要先登陆的,像要进入校内(人人)网的应用就需要先登陆人人网,要进入QQ的应用就需要先登陆QQ校友或者QQ空间。没有登陆,我们连游戏都进不了,那么外挂就不能与游戏建立连接了,之后的偷菜又从何谈起?那么我们又是从哪里登陆呢?我们从网页登陆,由JavaScript负责发送与接收。所以看不懂(能看懂就行,不需要会写)JavaScript的人,请在此止步,回去翻翻书再继续。
有人可能要问了:“我们是否可以这样做,用抓包工具把登陆时与QQ服务器交互的数据包截获下来,查看一下发送的内容和URL,然后我们再照着同样的格式,重放一遍,不就达到目的了吗?这样做就可以省去分析JavaScript的步骤了。”
这个问题问得好,是的,登陆的时候只要知道URL,知道服务器地址,发送的内容无非就是用户名和密码,把用户名和密码插在URL中相应的位置就行了。但是真有这么简单吗?答案是否定的,原因就是密码不是用明文传送的,用户名可以是,但是密码绝对不能是,不然密码很容易被盗,只要对你的网络实施搭线窃\听就可以截获你的QQ密码了。所以密码那部分是经过处理的,一般的处理方式是用哈希算法,现在广泛使用的哈希算法是MD5,但是具体他们怎么用的哈希算法,到底是不是用的MD5,就不得而知了,我们就是要通过分析他们的JavaScript代码,知道他们是处理密码的方式,然后我们用同样的方法处理一下,然后发送给他们的服务器,才能登陆成功。
不知大家做好准备了没,看懂JavaScript也不太难,相信有八成的人是做好准备了。
我们首先打开IE,转到http://xiaoyou.pengyou.qq.com/index.html,这是QQ校友的登陆页面,查看该页面的代码。这个页面的代码没有什么有价值的东西,我们希望截取的是按下登陆按钮后,发生了什么动作。但是这些代码里找不到那个函数,甚至找不到那个按钮,连输入用户名和密码的textbox都找不到。不过别担心,看那页代码靠近最下方,有一句
var iframe_src = 'http://ui.ptlogin2.qq.com/cgi-bin/login? appid=15000102&hide_title_bar=1&qlogin_jumpname=xiaoyou_qlogin&
s_url='+url+'&css=http://imgcache.qq.com/campus/login/login.css&
self_regurl=http://xiaoyou.pengyou.qq.com/emailreg.html';
通过观察其URL的名称,我们猜测,这iframe应该就是装有登陆零配件的iframe,输入用户名和密码的textbox和登陆按钮应该在那个页面上。
我们把代码中的URL复制到IE地址栏,回车之后会发现果然是我们要找的登陆页面,截图如下:
我们继续查看该网页的代码,可以找到一个onsubmit事件,那个form提交表单时执行的事件,我们要找的就是这个,代码如下:
onsubmit="if(!isAbleSubmit){return false;};return ptui_onLoginEx(loginform, 'qq.com')";
我们发现,这个事件最终执行了一个ptui_onLoginEx函数,我们接下来得找到这个函数,按下Ctrl+F输入"ptui_onLoginEx”,但是IE会提示找不到,不过大家放心,这段JavaScript代码一定会在本机执行的,要执行就必须先下载到本机,通过仔细查找,发现原来该页面还加载了一个外部的js文件:
<script language="javascript" src="http://imgcache.qq.com/ptlogin/ac/v5/js/comm.js?v=1.8"></script>
复制URL到IE地址栏,把comm.js文件下载到本机,然后查看comm.js,我们在这个文件中找到了ptui_onLoginEx函数。
function ptui_onLoginEx(B, C) {
g_time.time12 = new Date();
if (ptui_onLogin(B)) {
var A = new Date();
A.setHours(A.getHours() + 24 * 30);
if (isNaN(B.u.value) && (B.u.value.indexOf("@") < 0)) {
setCookie("ptui_loginuin2", B.u.value, A, "/", "ui.ptlogin2." + C)
} else {
setCookie("ptui_loginuin", B.u.value, A, "/", "ui.ptlogin2." + C)
}
}
return false
}
该函数调用了ptui_onLogin函数,还在本地添加了COOKIE,可以看到QQ校友登陆成功后COOKIE的有效时间是30天。
下面我们再查看ptui_onLogin函数。
function ptui_onLogin(A) {
try {
if (parent.ptlogin2_onLogin) {
if (!parent.ptlogin2_onLogin()) {
return false
}
}
if (parent.ptlogin2_onLoginEx) {
var D = A.u.value;
var B = A.verifycode.value;
if (ptui_str(STR_UINTIP) == D) {
D = ""
}
if (!parent.ptlogin2_onLoginEx(D, B)) {
return false
}
}
} catch(C) {}
return ptui_checkValidate(A)
}
这个函数调用了parent的ptlogin2_onLogin以及ptloin2_onLoginEx等方法,这两个方法的实现无光紧要,关键看最后一句返回return ptui_checkValidate(A)。
于是我们继续查看ptui_checkValidate函数。
function ptui_checkValidate(B) {
var A = B.u;
var D = B.p;
var E = B.verifycode;
if (A.value == "" || ptui_str(STR_UINTIP) == A.value) {
alert(ptui_str(STR_NO_UIN));
A.focus();
return false
}
A.value = ptui_trim(A.value);
if (!ptui_checkQQUin(A.value)) {
alert(ptui_str(STR_INV_UIN));
A.focus();
A.select();
return false
}
if (D.value == "") {
alert(ptui_str(STR_NO_PWD));
D.focus();
return false
}
if (E.value == "") {
if (!isLoadVC) {
loadVC(true);
g_submitting = true;
return false
}
alert(ptui_str(STR_NO_VCODE));
try {
E.focus()
} catch(C) {}
if (!g_loadcheck) {
ptui_reportAttr(78028)
} else {
ptui_reportAttr(78029)
}
return false
}
if (E.value.length != 4) {
alert(ptui_str(STR_INV_VCODE));
E.focus();
E.select();
return false
}
D.setAttribute("maxlength", "32");
ajax_Submit();
ptui_reportNum(g_changeNum);
g_changeNum = 0;
return true
}
我们注意最后有一句ajax_Submit,前面一大串别看了统统都没用。
继续ajax_Submit函数。
function ajax_Submit() {
var D = true;
var E = document.forms[0];
var B = "";
for (var A = 0; A < E.length; A++) {
if (E[A].name == "fp" || E[A].type == "submit") {
continue
}
if (E[A].name == "ptredirect") {
g_ptredirect = E[A].value
}
if (E[A].name == "low_login_enable" && (!E[A].checked)) {
D = false;
continue
}
if (E[A].name == "low_login_hour" && (!D)) {
continue
}
if (E[A].name == "webqq_type" && (!E[A].checked)) {
continue
}
B += E[A].name;
B += "=";
if (t_appid == g_appid && E[A].name == "u" && E[A].value.indexOf("@") < 0 && isNaN(E[A].value)) {
B += "@" + E[A].value + "&";
continue
}
if (E[A].name == "p") {
var F = "";
F += E.verifycode.value;
F = F.toUpperCase();
B += md5(md5_3(E.p.value) + F)
} else {
if (E[A].name == "u1" || E[A].name == "ep") {
B += encodeURIComponent(E[A].value)
} else {
B += E[A].value
}
}
B += "&"
}
B += "fp=loginerroralert";
var C = document.createElement("script");
C.src = E.action + "?" + B;
document.cookie = "login_param=" + encodeURIComponent(login_param) + ";domain=ui.ptlogin2." + g_domain + ";path=/";
document.body.appendChild(C);
return
}
大家注意看我标红了的文字,这段就是对密码的处理方法了,将这段代码注释一下,方便大家看懂。
var F = "";
F += E.verifycode.value;//取出验证码
F = F.toUpperCase();//转换为大写
B += md5(md5_3(E.p.value) + F)//将密码明文用MD5算法连续哈希3次之后,加上验证码再哈希一次。
如是我们得到了QQ发送密码的方式即将密码明文用MD5算法连续哈希3次之后,加上验证码再哈希一次,再知道发送的URL和服务器地址,就可以进行登陆了。
好了,JavaScript分析完了,我们掌握了登陆所需的足够信息,下一篇我们就讲,如何模拟客户端进行登陆。
分享到:
相关推荐
【标题】:“用JAVA语言编写:山寨版QQ课程设计报告” 【描述】:“用JAVA编写的QQ聊天工具!有流程图 还有图形界面” 【标签】:“山寨QQ” 【正文】: 本课程设计旨在实现一个基于JAVA的即时通讯工具,模仿QQ...
办公大楼节能降耗管理平台项目策划建议书 本项目旨在实施办公大楼节能降耗管理平台,旨在推动办公大楼的节能降耗,提高办公大楼的能源利用效率。本项目的实施将大大降低办公大楼的能源消耗,减少碳 footprint,提高...
** 3) 增加 SendData 与 RecvData 方法 ** ************************************************************************************ ** author:liquanhai date:2011-11-04 ** 改进 ** 1)增加 ClosePort中交出...
【VB Post登陆网页Web QQ】 VB(Visual Basic)是一种由微软公司开发的编程环境,用于创建Windows应用程序。在本主题中,“VB Post登陆网页Web QQ”指的是使用VB编写程序,通过HTTP POST请求来实现对Web QQ的登录。...
【标题】"高仿真QQ登陆界面 ---基于MFC"是一个使用Microsoft Foundation Classes (MFC)库开发的项目,旨在创建一个与腾讯QQ登录界面高度相似的用户界面。MFC是微软提供的一套C++类库,它封装了Windows API,使得...
### 实验五:FIR数字滤波器设计与软件实现 #### 一、实验背景与目标 本实验旨在通过MATLAB编程实现FIR(Finite Impulse Response)数字滤波器的设计,并利用该滤波器去除信号中的噪声。实验具体目标包括: 1. 了解...
【仿QQ登陆界面设计详解】 在IT行业中,用户界面(UI)的设计至关重要,因为它直接影响到用户的体验和产品的吸引力。QQ作为中国最受欢迎的即时通讯软件之一,其登录界面早已深入人心。仿QQ登录界面的设计,旨在模仿...
QQ-Groups-Spider-master.zip 是一个压缩包文件,它包含了一个名为 "QQ-Groups-Spider-master" 的项目源代码。这个项目很可能是用于抓取QQ群信息的一个爬虫程序,尤其适合对网络数据抓取和QQ社交平台的数据分析感...
Java编写QQ聊天工具是一款基于Java技术实现的即时通讯软件,主要功能是实现用户之间的私聊。对于初学者来说,这是一个很好的学习项目,因为它涵盖了Java编程基础、网络通信、多线程以及用户界面设计等多个核心知识点...
**VB编写的模拟QQ登陆程序** Visual Basic(VB)是一种基于事件驱动的编程语言,由Microsoft开发,适用于创建图形用户界面(GUI)应用程序。在这个特定的项目中,“VB编写的模拟QQ登陆程序”是一个用于教学目的的...
从零开始学Spring Boot,没有积分的可以看博客:http://412887952-qq-com.iteye.com/ 【Spring Boot 系列博客】 0)前言【从零开始学Spring Boot】 : http://412887952-qq-com.iteye.com/blog/2291496 (1...
最新Java模拟登陆QQ空间【2017-12-22】有效 代码在2017-12-22编写完成并测试通过! 功能: 1.获取QQ空间qzonetoken值 2.构造p参数加密方式getEncryption(QQ密码,QQ账号[16进制标识],验证码,false); 3.获取g_tk算法...
在其它编程语言(如ASP)编写的网页文件中均调用显示客服小面板, 参考以上说明或访问闻泰论坛提问. 2. 直接在页面中插入客服图片(固定): ------------------------------------ 在需要显示WeLive在线客服系统...
**C#语言与QQ程序开发** C#是一种由微软公司推出的面向对象的编程语言,它在.NET框架下运行,被广泛应用于Windows桌面应用、Web应用以及游戏开发等多个领域。本项目是一个使用C#编写的仿QQ程序,名为MiniQQ,其主要...
【易语言网页QQ登陆】是一种基于易语言编程的实现,旨在提供一种方法让用户能够通过网页进行QQ账号的登录。在这一技术中,开发者利用易语言的特性,模拟了QQ网页登录的过程,允许用户在不安装专门的QQ客户端的情况下...
网页漂浮QQ网页在线客服是一种在线交流工具,它允许网站管理员在自己的网页上集成一个小型的QQ聊天插件,以方便访客与客服人员实时沟通。这种技术在电子商务、服务行业以及任何需要快速响应客户需求的网站中非常常见...
本源码就是使用易语言进行编写的QQ登陆框的实现代码,对于学习易语言和界面设计的开发者来说,这是一个很好的学习资源。 易语言的核心特点在于它的易用性和直观性,它的编程语法直接采用中文,使得非英语背景的...
ISO27001:2013是国际标准化组织(ISO)和国际电工委员会(IEC)联合发布的关于信息技术安全技术信息安全管理体系的要求标准。该标准是信息安全管理体系(ISMS)的实施和认证的国际标准,提供了组织如何在业务过程中...
QQ作为中国最流行的即时通讯软件之一,其登录界面设计简洁而高效,是学习网页设计的良好范例。接下来,我们将深入探讨如何使用HTML来构建这个页面。 1. **HTML结构基础** - QQ登录页面通常包含用户名输入框、密码...