Coding的痕迹

一位互联网奔跑者的网上日记

0%

(原) 一个简单外挂的实现

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 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的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#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位的随机数

我是这么获取的

1
2
3
4
5
6
7
8
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吧