迁移博客时注: 这篇文章还是我在草稿箱翻到的,直接迁移了过来。当时市里给各学校下发任务,要求参加这种知识竞赛。有人用 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吧