WEB FLASH 游戏的作弊工具的编写

Home / Article MrLee 2016-10-17 3959

一.WEB FLASH 游戏的作弊工具基本上有这么几种:
1. 脱机程序: 不需要开启游戏,使用程序模拟用户登录游戏,并自动执行一定的机器人操作
2. 外G: 开启游戏的同时,开启外G程序,通过代理的方法或者底层网络数据截获等方法,截取游戏的网络数据,并显示在外G上,在外G上可以通过UI进行一些快速操作, 比如快速买道具,快速回城等
3. 内挂: 开启游戏的同时,通过DNS或者代理来欺骗浏览器,又或者进程注入的方法, 修改游戏运行的的SWF,嵌入自己的ABC代码,在游戏里可以呼出自己的代码,直接调用原SWF的某些函数进行操作
4. 内存修改: 通过CheatEngine等修改器修改FLASH游戏的某些值, 只有这些值是客户端生成后再发给服务器的情况下,这种方法才适用。 比如以前某餐厅游戏里面的人气度,可以通过cheatEngine进行查找和修改为满分。 在此内存修改的原理上,也可以不通过cheatEngine(每次都要手动搜索太麻烦), 使用其他工具比如VC编写程序,强制读取浏览器进程, 并在ASM的级别上修改内存里的指令来达到目的。(可参考我以前写的 code cave)
上面提到的几种工具, 很多情况下需要破解SWF,进行源码阅读后才能进行。SWF里的代码是ABC字节码的形式进行保存,ABC字节码是在AVM2里跑的,AVM2的绝大多数指令都是有公开文档的(avm2_overview)。 所以理论上,只要拿到了SWF,至少可以反编译成ABC, 高级点可以进一步反编译成AS代码。
二. 编写作弊工具的重要一步,就是分析游戏通信的协议和加密方式。
下面看几个FLASH游戏的典型例子
1. 数据通信没有做任何加密,通信协议为HTTP,常见于早期的social game
这种情况下是最简单的,通常连SWF都不需要反编译, 只需要通过HTTP截取工具(firefox插件或者其他类似插件),截取HTTP数据,做一定的分析即可。
比如游戏里会发送一个分数给服务器, Post 给http://server/finish?score=100
那么你只需要模拟这个POST, 发送一个 http://server/finish?score=1000, 就可以让你的分数变成1000分了。
2. 类似于例子1, 但是数据做了一定加密,通常是附加一个签名参数, 这个签名参数=md5(提交的数据, 一个私钥),他假设你不知道这个私钥,那么每次提交的时候: 先计算签名: $sig = md5(score, 一个私钥), 然后
post http://server/finish?score=100&sig= $sig
如果你不知道$sig的计算方法, 只是简单的把score=100改成score=1000,那么服务器在验证sig就会知道你在作弊。
遇到这种情况,通常你需要反编译这个SWF,找到sig的正确计算方法。
3.数据通信做了加密,使用SOCKET通信
这种情况,你截取数据后,除非你是数学方面的大牛,可以分析出加密算法, 一般情况下也得破解原SWF。
在一般情况下,数据的加密方式都是易于破解的,虽然很多开发者总是想法设法的绕了很多弯,只是加大你的破解难度罢了,只要有一定的耐心都没什么大问题。
有一种通常使用的方二进制加密方法就是异或。 使用一个数去异或所有的字节,在服务器上继续用这个数异或回来就得到原始数据。 高级一点就是这个数会不断的变化,而且对于每个字节使用不一样的数。
三. 编写作弊工具,还有重要的一环,就是反编译SWF
要反编译首先要找到这个SWF。
在早期的游戏, SWF基本没有任何保护措施,那么你只需要直接找到SWF的下载地址即可。
现在大多数游戏,基本都可能会考虑到加壳的方法。 比如把SWF稍微加个密,作为二进制数据嵌入一个作为壳的SWF里,然后在浏览器里,这个壳会自动的把这个二进制数据进行解壳,最后使用loadbytes进行加载, 所以这种情况,你可以通过搜索loadBytes这个关键字来解决大多数的加壳问题。
实际上可能有一些SWF解壳过程还是比较麻烦的。那么有一种比较通用的方法,就是内存抓取。因为SWF要被flash player运行,必然在浏览器进程中存在着SWF的一个镜像。 所以只需要扫描浏览器进程,把这个SWF DUMP出来即可。
假设我们现在拿到了这个SWF,反编译通常使用硕思或者ASV, 有时候代码可能还被做了一定程度的混淆,或者类名被转成了全角,导致这些软件可能会异常报错。
对于代码混淆目前我还不知道有什么很好的方法来解决, 而如果硕思或者ASV出错了,那么就意味着你得考虑其他的工具(或者等它们出新版本吧)。 其他工具,简单点的有abcdump, swftools, 更高级点得自己写脚本进行处理(如果你只会AS3,那么可以考虑swfdiy开源库, 

:D

 )
四. 数据通信加密部分使用了alchemy怎么办?
对于我来讲,大多数情况下我不需要知道具体的加密算法,alchemy暴露给AS3程序的也就是一段ABC的函数而已。那么你完全可以自己提取这段ABC,把它塞进你自己的作弊程序进行执行。(经过几次实验证明有效)
五. 如何修改原SWF
我们知道,硕思反编译出来的FLA,对于一个复杂的SWF来说,要重新把它编译成SWF,大多数情况下都是不可能,或者有BUG的。
所以,如果我们想对一个SWF进行修改,只能在二进制上直接对SWF进行修改。
这方面知识请参考swf10的spec 和avm2的overview.
如果是简单修改,请使用abcdiy(我正在编写中的工具  )

本文链接:https://www.it72.com/10914.htm

推荐阅读
最新回复 (0)
返回