zoukankan      html  css  js  c++  java
  • qq农场,数据抓包分析,实现源码,图片讲解

    一下是分析制作过程:

    1.首先登录农场,(建议从空间登录)。

    2.打开抓包工具(我用的WSockExpert_Cn.exe),选进程iexplorer.exe,点打开,开始监视,如下图

    (注:我用的ie8,进程较多,如不确定可以挨个试一下,ie6的话只有一个进程,没这么麻烦)


    3.找到要赠送的好友,赠送牧草。然后返回抓包工具查看。如下图

    (抓包分析的话当然要先找个开通了牧场的才能分析)


    数据如下

    post网址部分  

    POST /cgi-bin/cgi_feed_food HTTP/1.1  
    Accept: */*  
    Accept-Language: zh-CN  
    Referer: http://appimg.qq.com/happyfarm/module/Master_v_13.swf?v=1
    x-flash-version: 10,0,32,18  
    Content-Type: application/x-www-form-urlencoded  
    Content-Length: 149  
    Accept-Encoding: gzip, deflate  
    User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)  
    Host: mc.qzone.qq.com  
    Connection: Keep-Alive  
    Cache-Control: no-cache  
    Cookie: __Q_w_s__appDataSeed=1; randomSeed=908772; login_time=3A4DCAE21B8577C02CDEF469E8DF6CD0B161F4F15D9B9B3C; uin=o0379184514; skey=@aX6MZB3vC; ssid=s5583724002; pt2gguin=o0574738500; ptcz=d1a0057d31caec87aeca1dcf672c3cb9f8c146a7b3f982a899982c26a808879d; pvid=9714891820; flv=10.0  



    post数据部分:  

    foodnum=10&uId=531348296&nick=%E5%97%9C%E8%A1%80%E5%88%80%E9%AD%94&type=0&farmKey=3ac36cc979237f6bda1c5f5765e13f86&uIdx=379004904&farmTime=1261587968






    服务器返回数据  

    {"addExp":1,"added":10,"animal":[{"buyTime":1261451345,"cId":1504,"growTime":86899,"growTimeNext":19932,"hungry":0,"serial":1,"status":5,"statusNext":3,"totalCome":7},{"buyTime":1261451345,"cId":1504,"growTime":72499,"growTimeNext":6701,"hungry":0,"serial":2,"status":2,"statusNext":3,"totalCome":0},{"buyTime":1261451345,"cId":1504,"growTime":57600,"growTimeNext":21600,"hungry":0,"serial":3,"status":2,"statusNext":3,"totalCome":0},{"buyTime":1261451355,"cId":1005,"growTime":57600,"growTimeNext":18000,"hungry":0,"serial":4,"status":2,"statusNext":3,"totalCome":0},{"buyTime":1261451355,"cId":1005,"growTime":43200,"growTimeNext":32400,"hungry":1,"serial":5,"status":2,"statusNext":3,"totalCome":0},{"buyTime":1261451355,"cId":1005,"growTime":43200,"growTimeNext":32400,"hungry":1,"serial":6,"status":2,"statusNext":3,"totalCome":0},{"buyTime":1261451355,"cId":1005,"growTime":43200,"growTimeNext":32400,"hungry":1,"serial":7,"status":2,"statusNext":3,"totalCome":0}],"direction":"成功添加10棵牧草","money":0,"total":2,"type":0,"uId":531348296}
    post网址部分

    POST /cgi-bin/cgi_feed_food HTTP/1.1
    Accept: */*
    Accept-Language: zh-CN
    Referer: http://appimg.qq.com/happyfarm/module/Master_v_13.swf?v=1
    x-flash-version: 10,0,32,18
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 149
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)
    Host: mc.qzone.qq.com
    Connection: Keep-Alive
    Cache-Control: no-cache
    Cookie: __Q_w_s__appDataSeed=1; randomSeed=908772; login_time=3A4DCAE21B8577C02CDEF469E8DF6CD0B161F4F15D9B9B3C; uin=o0379184514; skey=@aX6MZB3vC; ssid=s5583724002; pt2gguin=o0574738500; ptcz=d1a0057d31caec87aeca1dcf672c3cb9f8c146a7b3f982a899982c26a808879d; pvid=9714891820; flv=10.0

    post数据部分:

    foodnum=10&uId=531348296&nick=%E5%97%9C%E8%A1%80%E5%88%80%E9%AD%94&type=0&farmKey=3ac36cc979237f6bda1c5f5765e13f86&uIdx=379004904&farmTime=1261587968


    服务器返回数据

    {"addExp":1,"added":10,"animal":[{"buyTime":1261451345,"cId":1504,"growTime":86899,"growTimeNext":19932,"hungry":0,"serial":1,"status":5,"statusNext":3,"totalCome":7},{"buyTime":1261451345,"cId":1504,"growTime":72499,"growTimeNext":6701,"hungry":0,"serial":2,"status":2,"statusNext":3,"totalCome":0},{"buyTime":1261451345,"cId":1504,"growTime":57600,"growTimeNext":21600,"hungry":0,"serial":3,"status":2,"statusNext":3,"totalCome":0},{"buyTime":1261451355,"cId":1005,"growTime":57600,"growTimeNext":18000,"hungry":0,"serial":4,"status":2,"statusNext":3,"totalCome":0},{"buyTime":1261451355,"cId":1005,"growTime":43200,"growTimeNext":32400,"hungry":1,"serial":5,"status":2,"statusNext":3,"totalCome":0},{"buyTime":1261451355,"cId":1005,"growTime":43200,"growTimeNext":32400,"hungry":1,"serial":6,"status":2,"statusNext":3,"totalCome":0},{"buyTime":1261451355,"cId":1005,"growTime":43200,"growTimeNext":32400,"hungry":1,"serial":7,"status":2,"statusNext":3,"totalCome":0}],"direction":"成功添加10棵牧草","money":0,"total":2,"type":0,"uId":531348296}

    准备工作就这么多。下面是分析。


    发送数据如下


    (发送的数据本身有些是没用的,可省,比如主人编号和主人昵称)

    下面是实现

    1、第一种办法,利用html的表单。

    view plaincopy to clipboardprint?
    <mce:script type="text/javascript"><!--  
    /*  
    作者:王安林。QQ:379184514。邮箱:w18514379@126.com。博客:http://blog.csdn.net/w184514379http://blog.csdn.net/lin379184514。  
    特别声明:本作品仅做研究交流用,仅为大家提供一点思路,可任意修改和传播,不追究版权亦不承担任何责任,不回答提问,不再更新。  
    2009.12.24  
    */  
    // --></mce:script>
    <mce:script type="text/javascript" src="md5.js" mce_src="md5.js" ></mce:script>
    <mce:script type="text/javascript"><!--  
    function test()//计算farmKey并提交表单  
    {  
    var c = new Date();  
    var farmTime = Math.floor(c.getTime() / 1000);  
    var key = "fs#$hsJ!Fa*AF!-0aPS";  
    var farmKey = hex_md5(farmTime + key.substr(parseInt(farmTime) % 10, 19));  
    //key = "&farmTime=" + farmTime + "&farmKey=" + farmKey;  
    document.getElementById("farmTime").value=farmTime;//填充时间farmTime到表单  
    document.getElementById("farmKey").value=farmKey;//填充时间farmKey到表单  
    window.frames["free"].submit(); //执行提交表单  
    //      return key;  
        };  
    // --></mce:script>
    <form name="free" method="post" action="http://mc.qzone.qq.com/cgi-bin/cgi_feed_food">
    uId<input name="uId" value="379004904"/>(好友编号,此编号并非QQ号,获得请参考js版)<br>
    foodnum<input name="foodnum" value="10"/>(赠送牧草数量)<br>

    <br>以下3项不需输入<br>
    farmTime<input name="farmTime" value=""/><br>
    farmKey<input name="farmKey" value=""/><br>
    type<input name="type" value="0"/><br>
    <input type="button" value="赠送牧草" onClick="test()">   

    </form>
    <br>
    <br>
    <br>
    作者:王安林。QQ:379184514。邮箱:w18514379@126.com。博客:http://blog.csdn.net/w184514379http://blog.csdn.net/lin379184514。  
    特别声明:本作品仅做研究交流用,仅为大家提供一点思路,可任意修改和传播,不追究版权亦不承担任何责任,不回答提问,不再更新。  
    2009.12.24
    <mce:script type="text/javascript"><!--
    /*
    作者:王安林。QQ:379184514。邮箱:w18514379@126.com。博客:http://blog.csdn.net/w184514379http://blog.csdn.net/lin379184514
    特别声明:本作品仅做研究交流用,仅为大家提供一点思路,可任意修改和传播,不追究版权亦不承担任何责任,不回答提问,不再更新。
    2009.12.24
    */
    // --></mce:script>
    <mce:script type="text/javascript" src="md5.js" mce_src="md5.js" ></mce:script>
    <mce:script type="text/javascript"><!--
    function test()//计算farmKey并提交表单
    {
    var c = new Date();
    var farmTime = Math.floor(c.getTime() / 1000);
    var key = "fs#$hsJ!Fa*AF!-0aPS";
    var farmKey = hex_md5(farmTime + key.substr(parseInt(farmTime) % 10, 19));
    //key = "&farmTime=" + farmTime + "&farmKey=" + farmKey;
    document.getElementById("farmTime").value=farmTime;//填充时间farmTime到表单
    document.getElementById("farmKey").value=farmKey;//填充时间farmKey到表单
    window.frames["free"].submit(); //执行提交表单
    //   return key;
    };
    // --></mce:script>
    <form name="free" method="post" action="http://mc.qzone.qq.com/cgi-bin/cgi_feed_food">
    uId<input name="uId" value="379004904"/>(好友编号,此编号并非QQ号,获得请参考js版)<br>
    foodnum<input name="foodnum" value="10"/>(赠送牧草数量)<br>

    <br>以下3项不需输入<br>
    farmTime<input name="farmTime" value=""/><br>
    farmKey<input name="farmKey" value=""/><br>
    type<input name="type" value="0"/><br>
    <input type="button" value="赠送牧草" onClick="test()">

    </form>
    <br>
    <br>
    <br>
    作者:王安林。QQ:379184514。邮箱:w18514379@126.com。博客:http://blog.csdn.net/w184514379http://blog.csdn.net/lin379184514
    特别声明:本作品仅做研究交流用,仅为大家提供一点思路,可任意修改和传播,不追究版权亦不承担任何责任,不回答提问,不再更新。
    2009.12.24

    2.第二种方法,利用js。

    <script type="text/javascript">
    /*
    作者:王安林。QQ:379184514。邮箱:w18514379@126.com。博客:http://blog.csdn.net/w184514379http://blog.csdn.net/lin379184514
    特别声明:本作品仅做研究交流用,仅为大家提供一点思路,可任意修改和传播,不追究版权亦不承担任何责任,不回答提问,不再更新。
    2009.12.24
    */
    </script>
    <script type="text/javascript" src="md5.js"></script>
    <script type="text/javascript">
    //farmKey计算
    function getkey()
    {
        var c = new Date();
        var farmTime = Math.floor(c.getTime() / 1000);

            var key = "fs#$hsJ!Fa*AF!-0aPS";
            var farmKey = hex_md5(farmTime + key.substr(parseInt(farmTime) % 10, 19));
            key = "&farmTime=" + farmTime + "&farmKey=" + farmKey;
        //alert(key);
        return key;
    };

    //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX POST 发数据 end XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX//
    function createXMLHttpRequest()
    {
        if (window.XMLHttpRequest) {
          XMLHttpR = new XMLHttpRequest();
        } else if (window.ActiveXObject) {
          try {
            XMLHttpR = new ActiveXObject("Msxml2.XMLHTTP");
          } catch(e) {
            try {
              XMLHttpR = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(e) {}
          }
        }
    }

    function sendRequest(method , url, data, callback)
    {
        createXMLHttpRequest();
        XMLHttpR.open(method=="p"?"POST":"GET", url, false);//method等于"p"为post方法,其他为get方法
        XMLHttpR.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        XMLHttpR.onreadystatechange =eval(callback+"processResponse");//通过eval创建一列处理函数
        XMLHttpR.send(data);
    }

    //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX POST 发数据 end XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX//

    //00000000000000000000000000000000000000000000 赠送牧草 start 000000000000000000000000000000000000000000000000000000000000000//
    function feedfoodprocessResponse()
    {
        if (XMLHttpR.readyState == 4 && XMLHttpR.status == 200)
        {
           txtOutput.value =XMLHttpR.responseText;//服务返回值,送到文本域显示
        }
    }
    function getfeedfood(foodnum,frienduId)
    {
        var url = "http://mc.qzone.qq.com/cgi-bin/cgi_feed_food";
        var data ="foodnum="+foodnum+"&uId="+frienduId+"&type=0"+ getkey();
        sendRequest("p",url, data,"feedfood");
    }
    //00000000000000000000000000000000000000000000 赠送牧草 end 000000000000000000000000000000000000000000000000000000000000000//


    //zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 获取个人信息 start zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz//
    function userinfoprocessResponse() //通过eval函数创建的。即eval("userinfo"+"processResponse\(unm\)");
    {
        if (XMLHttpR.readyState == 4 && XMLHttpR.status == 200)
        {
           txtOutput.value =XMLHttpR.responseText;
           transUserInfo(XMLHttpR.responseText);
        }
    }

    function getUserInfo()
    {
        var url = "http://happyfarm.qzone.qq.com/api.php?mod=user&act=run";
        var data = getkey();
        sendRequest("p",url, data,"userinfo");
    }

    function transUserInfo(myString)
    {
        var userinfo = eval('(' + myString + ')');   //用字符串myString创建JSON对象userinfo。
        //创建表格,利用innerHTML,注意,table的innerHTML属性是只读的,所以不能直接操作table的innerHTML,这里操作的是DIV的innerHTML。
        var str='<TR align=middle bgColor="#ffff66"><TD>'+userinfo.user.uId+'</TD><TD>'+userinfo.user.yellowlevel+'</TD><TD>'+userinfo.user.exp+'</TD><TD>'+userinfo.user.money+'</TD><TD>'+getLevel(userinfo.user.exp)[0]+'</TD><TD>'+((getLevel(userinfo.user.exp)[0]+1)*200-getLevel(userinfo.user.exp)[1])+"\/"+(getLevel(userinfo.user.exp)[0]+1)*200+'</TD></TR>';
        document.getElementById('userinfoDiv').innerHTML='<TABLE border=1><TBODY id=userinfoTab><TR align=middle><TH>UID</TH><TH>黄钻等级</TH><TH>经验</TH><TH>金币</TH><TH>等级</TH><TH>升级</TH></TR>' + str + '</TBODY></TABLE>';
       }
    //zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 获取个人信息 end zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz//


    //*************************************************** 等级计算 start *****************************************************************//
    //9级以上的升级所需经验不对。具体计算方法不清楚。等级是都对的。
    function getLevel(experience){
        var levelArray = new Array(2);
        levelArray[0] = 0;
        levelArray[1] = 0;
        for (var i = 1; i < 100; i++) {
            levelArray[0] += 200 + 200 * (i - 1);
            if (levelArray[0] > experience) {
                //取得升级所需经验
                levelArray[1] = levelArray[0] - experience;
                //取得当前级别
                levelArray[0] = i - 1;
                break;
            }
        }
        return levelArray;
    };

    //****************************************************** 等级计算 end ***************************************************************//


    //----------------------------好友列表 start-------------------------------------------//
    function FriendListprocessResponse()
    {
        if (XMLHttpR.readyState == 4 && XMLHttpR.status == 200)
        {
          txtOutput.value =XMLHttpR.responseText;
          transFriend(XMLHttpR.responseText);
        }
    }

    function getFriendList()
    {
        var url = "http://happyfarm.qzone.qq.com/api.php?mod=friend";
        var data = getkey();
        sendRequest("p",url, data,"FriendList");
    }

    function transFriend(myString)
    {

        var friendinfo = new Array();
        friendinfo = eval('(' + myString + ')');
        var friendTitle = '<TR align=middle><TH>序号</TH><TH>ID</TH><TH>QQ</TH><TH>昵称</TH><TH>头像</TH><TH>黄钻</TH><TH>经验</TH><TH>金币</TH><TH>等级</TH><TH>升级</TH><TH>狗粮</TH><TH>选中</TH></TR>';
        //alert(friendinfo[0].userId);
       
        var str="";
        for (i = 0; i < friendinfo.length; i++)
        {
          //friendinfo[0].userId;
          str += '<TR align=middle><TD>' + i + '</TD><TD>' + friendinfo[i].userId + '</TD><TD>' + friendinfo[i].uin + '</TD><TD>' + friendinfo[i].userName+ '</TD><TD><IMG height=40 width=40 src=' + friendinfo[i].headPic + '></TD></TD><TD>' + friendinfo[i].yellowlevel + '</TD><TD>' + friendinfo[i].exp + '</TD><TD>' + friendinfo[i].money + '</TD><TD>'+ getLevel(friendinfo[i].exp)[0] +'</TD><TD>'+ ((getLevel(friendinfo[i].exp)[0]+1)*200-getLevel(friendinfo[i].exp)[1]*1)+'\/'+(getLevel(friendinfo[i].exp)[0]+1)*200+'</TD><TD>?</TD><TD><input type="checkbox" id="friendinfo'+ i +'" checked></TD></TR>';
        }
        var userinfo='<TR align=middle bgColor="#ffff66"><TD>' + i + '</TD><TD>' + document.getElementById("userinfoTab").rows[1].cells[0].innerText + '</TD><TD>NULL</TD><TD>主人</TD><TD>NULL</TD><TD>' + document.getElementById("userinfoTab").rows[1].cells[1].innerText + '</TD><TD>' + document.getElementById("userinfoTab").rows[1].cells[2].innerText + '</TD><TD>' + document.getElementById("userinfoTab").rows[1].cells[3].innerText + '</TD><TD>' + document.getElementById("userinfoTab").rows[1].cells[4].innerText + '</TD><TD>' + document.getElementById("userinfoTab").rows[1].cells[5].innerText + '</TD><TD>?</TD><TD><input type="checkbox" id="friendinfo'+ i +'" checked></TD></TR>';
        document.getElementById('friendListDiv').innerHTML = '<TABLE border=1><TBODY id=friendTab>' + friendTitle + str +userinfo+ '</TBODY></TABLE>';
    }


    //-----------------------------好友列表 end-----------------------------------------------//

    </script>

    <a target="_blank" tabindex="8" href="http://qzone.qq.com" id="label_forget_pwd">登录</a>
    (必须首先通过空间登录农场才可以使用此外挂!)
    <br>
    <br>


    <input type="button" value="获取个人信息" onClick="getUserInfo()">
    <div id="userinfoDiv">
    <TABLE border=1 >
    <TBODY id=userinfoTab>
    </TBODY>
    </TABLE>
    </div>
    <br>


    <input type="button" value="获取好友列表" onClick="getFriendList()">
    (需要“获取个人信息”)
    <div id="friendListDiv">
    <TABLE border=1>
        <TBODY id=friendTab>
        </TBODY>
    </TABLE>
    </div>


    <br><br><br><br>
    赠送牧草数量<input id="foodnum" value=""/><br>
    好友代号<input id="frienduId" value=""/>
    (注:好友代号并不是QQ号,是通过“获取个人信息”和"获取好友列表" 获得的uid,一般前3位跟qq号相同)
    <br>
    <input type="button" value="送牧草" onClick='getfeedfood(foodnum.value,frienduId.value)'>
    <br>


    <br><br>
    服务器返回的原始数据<br>
    <textarea id="txtOutput" style="850px;border:1px solid #c5e2f2;overflow:visible;" rows="15" ></textarea>
    <input class="but" id="res" type="button" value="UTF-8 还原 中文 ↓" onclick="txtresult.value=unescape(txtOutput.value.replace(/\\u/g,'%u'));" />
    <input class="but" id="conv" type="button" value="中文 转换 UTF-8 ↑" onclick='txtOutput.value=txtresult.value.replace(/[^\u0000-\u00FF]/g,function($0){return escape($0).replace(/(%u)(\w{4})/gi,"\\u$2")});'/>
    <textarea id="txtresult" style="850px;border:1px solid #c5e2f2;overflow:visible;" rows="15"></textarea>

    <br><br><br>
    为防止时间太久需要重新登录,可没隔一段时间调用刷新农场
    <br>
    <input type="button" value="刷新农场" onClick='document.getElementById("happyfarm").src = "http://happyfarm.qzone.qq.com/";'>
    <iframe id="happyfarm" width="100%" height="670" frameborder="0" application="yes" scrolling="no" src='http://happyfarm.qzone.qq.com'></iframe>


    <br>
    特别声明:本作品仅做研究交流用,仅为大家提供一点思路,可任意修改和传播,不追究版权亦不承担任何责任,不回答提问,不再更新。
    2009.12.24

    结束 www.hitidc.com

  • 相关阅读:
    BZOJ2301——莫比乌斯&&整除分块
    2019HDU多校第五场A fraction —— 辗转相除法|类欧几里得
    AKS素性检测
    2019牛客多校B generator 1——十进制快速幂
    BZOJ 3884——欧拉降幂和广义欧拉降幂
    libevent HTTP client 的实现
    google proto buffer安装和简单示例
    setenv LD_LIBRARY_PATH
    Centos6.4下安装protobuf及简单使用
    lrzsz
  • 原文地址:https://www.cnblogs.com/hsapphire/p/1979799.html
Copyright © 2011-2022 走看看