`

网页游戏外挂的设计与编写:QQ摩天大楼【二】(登陆准备-信息处理方式)

    博客分类:
  • C#
阅读更多

    上一篇文中提到,制作外挂的第一步,是与游戏进行连接,即登陆游戏。

    对于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分析完了,我们掌握了登陆所需的足够信息,下一篇我们就讲,如何模拟客户端进行登陆。

 

 

 

 

 

 

 

 

 

 

分享到:
评论
9 楼 sumee 2011-01-07  
这么忙啊..都不更新哦..!!!
8 楼 virginkj 2011-01-05  
哥们 赶紧更新啊 等着你呢
7 楼 sumee 2010-12-29  
ouyangjia7 写道
sumee 写道
怎么会没人看呢.很期待啊...更新吧!!!!强烈要求!

好,有时间立马写,最近年末了好忙。



嗯...强烈要求学习...我当你的大粉丝!!!!
6 楼 ouyangjia7 2010-12-28  
sumee 写道
怎么会没人看呢.很期待啊...更新吧!!!!强烈要求!

好,有时间立马写,最近年末了好忙。
5 楼 sumee 2010-12-25  
怎么会没人看呢.很期待啊...更新吧!!!!强烈要求!
4 楼 ouewqa 2010-12-24  
哥们继续更新呀,等着看你呢。
3 楼 mymelon 2010-12-13  
没下文了?我还。。
2 楼 ouyangjia7 2010-11-25  
zhaoxin1943 写道
哥们,怎么不更新了?

没人看,看了不评论,没心思写了。
1 楼 zhaoxin1943 2010-11-18  
哥们,怎么不更新了?

相关推荐

    用JAVA语言编写:山寨版QQ课程设计报告

    【标题】:“用JAVA语言编写:山寨版QQ课程设计报告” 【描述】:“用JAVA编写的QQ聊天工具!有流程图 还有图形界面” 【标签】:“山寨QQ” 【正文】: 本课程设计旨在实现一个基于JAVA的即时通讯工具,模仿QQ...

    办公大楼节能降耗管理平台项目策划建议书

    办公大楼节能降耗管理平台项目策划建议书 本项目旨在实施办公大楼节能降耗管理平台,旨在推动办公大楼的节能降耗,提高办公大楼的能源利用效率。本项目的实施将大大降低办公大楼的能源消耗,减少碳 footprint,提高...

    CSerialPort串口类更新版2014-01-10

    ** 3) 增加 SendData 与 RecvData 方法 ** ************************************************************************************ ** author:liquanhai date:2011-11-04 ** 改进 ** 1)增加 ClosePort中交出...

    VB Post登陆网页Web QQ

    【VB Post登陆网页Web QQ】 VB(Visual Basic)是一种由微软公司开发的编程环境,用于创建Windows应用程序。在本主题中,“VB Post登陆网页Web QQ”指的是使用VB编写程序,通过HTTP POST请求来实现对Web QQ的登录。...

    高仿真QQ登陆界面 ---基于MFC

    【标题】"高仿真QQ登陆界面 ---基于MFC"是一个使用Microsoft Foundation Classes (MFC)库开发的项目,旨在创建一个与腾讯QQ登录界面高度相似的用户界面。MFC是微软提供的一套C++类库,它封装了Windows API,使得...

    实验五 FIR数字滤波器设计与软件实现

    ### 实验五:FIR数字滤波器设计与软件实现 #### 一、实验背景与目标 本实验旨在通过MATLAB编程实现FIR(Finite Impulse Response)数字滤波器的设计,并利用该滤波器去除信号中的噪声。实验具体目标包括: 1. 了解...

    仿QQ登陆界面 仿QQ登陆界面

    【仿QQ登陆界面设计详解】 在IT行业中,用户界面(UI)的设计至关重要,因为它直接影响到用户的体验和产品的吸引力。QQ作为中国最受欢迎的即时通讯软件之一,其登录界面早已深入人心。仿QQ登录界面的设计,旨在模仿...

    QQ-Groups-Spider-master.zip

    QQ-Groups-Spider-master.zip 是一个压缩包文件,它包含了一个名为 "QQ-Groups-Spider-master" 的项目源代码。这个项目很可能是用于抓取QQ群信息的一个爬虫程序,尤其适合对网络数据抓取和QQ社交平台的数据分析感...

    java编写QQ聊天工具

    Java编写QQ聊天工具是一款基于Java技术实现的即时通讯软件,主要功能是实现用户之间的私聊。对于初学者来说,这是一个很好的学习项目,因为它涵盖了Java编程基础、网络通信、多线程以及用户界面设计等多个核心知识点...

    VB编写的模拟QQ登陆程序

    **VB编写的模拟QQ登陆程序** Visual Basic(VB)是一种基于事件驱动的编程语言,由Microsoft开发,适用于创建图形用户界面(GUI)应用程序。在这个特定的项目中,“VB编写的模拟QQ登陆程序”是一个用于教学目的的...

    从零开始学Spring Boot

    从零开始学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】有效

    最新Java模拟登陆QQ空间【2017-12-22】有效 代码在2017-12-22编写完成并测试通过! 功能: 1.获取QQ空间qzonetoken值 2.构造p参数加密方式getEncryption(QQ密码,QQ账号[16进制标识],验证码,false); 3.获取g_tk算法...

    WeLive免费在线客服系统 v3.2.0 商业版 破解版 特别版V1.0

    在其它编程语言(如ASP)编写的网页文件中均调用显示客服小面板, 参考以上说明或访问闻泰论坛提问. 2. 直接在页面中插入客服图片(固定): ------------------------------------ 在需要显示WeLive在线客服系统...

    c#编写的仿QQ程序

    **C#语言与QQ程序开发** C#是一种由微软公司推出的面向对象的编程语言,它在.NET框架下运行,被广泛应用于Windows桌面应用、Web应用以及游戏开发等多个领域。本项目是一个使用C#编写的仿QQ程序,名为MiniQQ,其主要...

    易语言网页QQ登陆

    【易语言网页QQ登陆】是一种基于易语言编程的实现,旨在提供一种方法让用户能够通过网页进行QQ账号的登录。在这一技术中,开发者利用易语言的特性,模拟了QQ网页登录的过程,允许用户在不安装专门的QQ客户端的情况下...

    网页漂浮qq 网页在线客服

    网页漂浮QQ网页在线客服是一种在线交流工具,它允许网站管理员在自己的网页上集成一个小型的QQ聊天插件,以方便访客与客服人员实时沟通。这种技术在电子商务、服务行业以及任何需要快速响应客户需求的网站中非常常见...

    qq登陆框 易语言制作 源码

    本源码就是使用易语言进行编写的QQ登陆框的实现代码,对于学习易语言和界面设计的开发者来说,这是一个很好的学习资源。 易语言的核心特点在于它的易用性和直观性,它的编程语法直接采用中文,使得非英语背景的...

    ISO27001-2013中文版.pdf

    ISO27001:2013是国际标准化组织(ISO)和国际电工委员会(IEC)联合发布的关于信息技术安全技术信息安全管理体系的要求标准。该标准是信息安全管理体系(ISMS)的实施和认证的国际标准,提供了组织如何在业务过程中...

    html 仿qq登录页面

    QQ作为中国最流行的即时通讯软件之一,其登录界面设计简洁而高效,是学习网页设计的良好范例。接下来,我们将深入探讨如何使用HTML来构建这个页面。 1. **HTML结构基础** - QQ登录页面通常包含用户名输入框、密码...

Global site tag (gtag.js) - Google Analytics