迁移博客时注: 这篇文章还是我在草稿箱翻到的,直接迁移了过来。当时市里给各学校下发任务,要求参加这种知识竞赛。有人用 Cheat Engine 搜索内存实现改成绩,我则倾向于抓包 - 改包。游戏程序是用 flash 做的,当时还折腾了好长时间 swf 的逆向,每天中午一回家就打开电脑弄这个,一有机会接触电脑就查资料,也不知道哪来的热情。第二年这个竞赛拿php还是jsp重写了,用了Google的验证码库,遂放弃。第三年就没有这个比赛了。 以现在的方法,当然一个不长的 Python 脚本就能搞定这一切。或许正如古人所说,“后之视今,亦犹今之视昔”吧。 共勉!

以下是原文


如果可以说这是一个外挂的话。 这种东西技术含量不高,嗯,如果不认为这个可以作为一篇教程的话,就当本文是我的个人日记好了。

网址:http://www.ahjtxx.com/asksnew/index.html , 一个交通安全竞赛的地址。当然,如果不是在比赛期间,就访问http://www.ahjtxx.com/asksnew/HomePage.swf 。 进去,关掉不需要的标签页,打开抓包程序,我用WSExplorer。 注册:(其实一打开这个网站,就会加载许多swf,swf会响应用户操作,向服务器发送数据)

请求页面: /asksnew/asp/Register.ashx 请求方式: POST 表单: _sex=男/女的url编码 _name=姓名 _birthdate= _region=大观区/迎江区等,见http://ahjtxx.com/asksnew/db/School.xml _school=同上 _grade=小学/初中/高中 + 一年级/二年级/三年级… _class=该段是自己填写的 _qq= _email= _account=账户名 _contact=联系方式 _password=账户密码

注意:1,提交数据的URL编码问题 2,我们提交数据可以随便填~SERVER不检查

// URL编码函数,网上找的CString UrlEncode(CString str, bool fRaw)
{
    CString urlstr;

    for(int i = 0; i < str.GetLength(); i++)
    {
        char c = str[i];

        if(fRaw && c == '+')
        {
            urlstr += "%2B";
        }
        else if(c > 0x20 && c < 0x7f && c != '&')
        {
            urlstr += c;
        }
        else if(c == 0x20) 
        {
            urlstr += fRaw ? ' ' : '+';
        }
        else
        {
            CString tmp;
            
            tmp.Format("%%%02x", (BYTE)c);
            urlstr += tmp;
        }
    }
    return urlstr;
}

想要实现模拟注册,发个包就可以了,注册效率不是很高,电脑开了一晚上注册了275万个号。 后来我就想,能不能实现刷分呢?说到刷分,有一个方法,用Cheat Engine。玩游戏的应该知道,只是那么修改太慢,而且必须等那一关结束才能进行提交分数,我就又开始了我的抓包之旅~

请求页面: /asksnew/asp/Login.ashx请求方式: POST 提交数据: _password=_account=同样需要url编码。

登录之后,获得了Cookie,这是我解析Cookie的函数:

#define  flag    "Set-Cookie: ASP.NET_SessionId="  // Cookie开始标志char  *GetCookie(const char* data)
{
    char  *str2;
    char  Cookie[25] = "";

    int  i = 0;

    str2 = strstr(data, flag);

    if(str2 == NULL)
    {
        return NULL;
    }

    str2 += strlen(flag);

    while( *str2 != ';' )
    {
        Cookie[i++] = *str2++;
    }

    return Cookie;  // 此处隐含一个错误,Cookie是局部变量,懒得改了。写博客的时候才发现
}

记下来,我们获取个随机数。作者还是挺严谨的哈~ 请求页面: /asksnew/asp/code.ashx?0.27791845984756947(随便填)请求方式: GET 别忘了把Cookie带上:

Cookie: ASP.NET_SessionId=返回一个6位的随机数

我是这么获取的

    strcpy(Recv, strstr(Recv, "\r\n\r\n"));`

    if( !strcmp(Recv, "") )
    {
        return FALSE;
    }

    sscanf(Recv, "%d", &num);

开始游戏~请求页面: /asksnew/asp/Start.ashx 请求方式: GET 带上Cookie,Cookie: ASP.NET_SessionId=pnsfaojdyxycp24535xetye2 至于它的返回,我就不管了,应该是200 OK吧