Icefire:这段时间忙里偷闲,在网上Down了几个Flash游戏来玩,想不到有些游戏难度有点大,但偶又不想花太多时间来冲关,自然就要请出游戏修改的工具:金山游侠,但像游侠这类工具并不能对Flash游戏进行修改,
读者:Game爱好者、Flash爱好者、Crack爱好者
前置知识:无
Icefire:这段时间忙里偷闲,在网上Down了几个Flash游戏来玩,想不到有些游戏难度有点大,但偶又不想花太多时间来冲关,自然就要请出游戏修改的工具:金山游侠,但像游侠这类工具并不能对Flash游戏进行修改,后来拿出系统调试器SoftIce,跟了一会弄得我头晕眼花,竟然找不到任何有价值的东西。其实我的要求并不高,为什么那么难搞?后来查了网上的一些资料,并看到网上有很多人问修改Flash游戏的问题,再和几个喜欢破解的朋友一起切磋,所以就产生此文。本文将由浅入深地系统介绍Flash游戏的反汇编及修改等问题,以解众惑。
菜鸟玩转Flash游戏修改
文/图 逆枫
Flash是Macromedia 公司开发的矢量图形动画编辑工具。Flash的优点是它独立于浏览器之外,只要给浏览器加入相应的插件就可以观看Flash动画,占用带宽小,比标准的GIFs和JPEGs更灵活,体积更小,且Flash播放时还可以带声音,所以Flash非常适合用于网页上表示多媒体的内容。Flash内含了ActionScript技术,可以让程序员应用其编辑动画的脚本,从Flash5.0开始程序和动画的技术结合正式应用到了Flash编辑的网络动画中,ActionScript脚本的简单易学和易用性使初级爱好者也能快速的掌握其应用法则,创作出简单的带有程序的动画。Flash游戏正是利用Flash的交互性及ActionScript脚本控制来制作的。而今天我们的目标,就是来破解这样的Flash,也算是挑战一下破解技术中的难题吧!
工具介绍
工具:Sothink SWF Decompiler MX2005、Flasm V1.52、Hex workshop十六进制工具
对象:魔塔Flash游戏
古语曰:“工欲善其事,必先利其器”(Icefire:好象每个文章开头都是用的这句话?),在对Flash游戏修改前,必须找几个好工具。我们知道Flash游戏是利用脚本来控制的,这些脚本是有点像VB程序一样,由Flash播放器边解释边执行的,所以用普通的调试器如SoftIce来跟踪会跟不到核心的内容,必须找到相应的反编译工具。本文介绍两个Flash反编译工具。一个是Sothink SWF Decompiler MX2005,界面如图1所示。左边是文件列表,中间是Flash预览或脚本浏览区,右边是Flash资源列表框,其中脚本就在里面。
图1
这个工具最实用的是脚本反编译,可以把脚本译成ActionScript的格式,非常方便阅读,或者译成P-code的格式,这个格式是Flash由ActionScript脚本生成的中间代码, P-code可以由播放器直接解释执行。另外Sothink SWF Decompiler MX2005还可以把SWF格式的文件转译成Fla格式的文件,这样在Flash MX编辑器中就可以直接打开Fla文件进行修改。
另一个工具是Flasm,就是Flasm asm的简称,这个工具是运行在DOS命令提示符下的,它可以把Flash文件中的脚本反编译出来,形成一个脚本文件,也可以把修改后的脚本文件编译进Flash文件,后面的实例就我们就是使用这个方法的。
Flash游戏修改思路
普通单机游戏程序一般是VC编译生成的PE格式程序,这些代码可以在内存中直接执行,生命值等数据可以直接放到内存中,而Flash游戏程序是由一些中间代码来组成,在Flash播放器里执行的,生命值等只会在播放器中出现,所以不要直接搜索内存,也不要偿试制作内存补丁什么的。我这里采用的方法是用Flash反编译工具,由于生命值及程序流程等内容都会在脚本中出现,所以只要对脚本进行修改,再改修改后的脚本编译进Flash程序中就可以达到修改Flash游戏的目的。
可能有人会问,为什么不用调试器,如Ollydbg、softice等来跟踪,定位要修改的数据?用过Ollydbg跟踪过VB的P-code格式程序的读者可能对这个印象较深,用调试器跟入那些中间代码,往往只会在播放器的代码中转来转去,而并没有跟入我们的Flash游戏代码中间。所以目前比较简便的方法就是修改Flash的脚本来达到修改游戏的目的。
实例修改Flash游戏:魔塔
这次出场的主角是经典RPG游戏:魔塔,这个是类似迷宫式的游戏。我们现在要来修改两处:一是把全屏显示改成窗口显示,另外一处是修改生命值及攻击防御力。
首先用Sothink SWF Decompiler MX2005载入mota.swf程序,展开右边栏的资源框,找到Action/MainMovie,如图2所示。
图2
在中间会显示相应的脚本,这些脚本可以选择菜单Code项查看ActionScript或P-code或原始数据。ActionScript简单易懂,我们来看看关键的地方。
fscommand("fullscreen", "true");这一句是设置全屏,只要修改为False就可以设成窗口方式了。再往后看看其它脚本语句,看看有什么感兴趣的,大约在352行,发现在如下语句:
Now_life = 1;
Now_hp = 1000;
Now_gong = 10;
Now_fang = 10;
Now_money = 0;
这些就是主角的数据了,如Now_hp表示主角现在的生命,Now_gong为攻击力,Now_fang为防御力。由于后面我们的Flasm只能对Flash反编译成P-code的代码,所以可以现在来看看上面这些脚本的P-code格式的代码:
_push "Now_life" 1
_setVariable
_push "Now_hp" 1000
_setVariable
_push "Now_gong" 10
_setVariable
_push "Now_fang" 10
这和上面的代码是等价的。有了这些信息,现在要用Flasm来进行修改mota.swf文件了。假设Flasm.exe在c:/flasm15win,为了方便,把mota.swf文件也拷贝到Flasm15win下。打开命令提示符,进入Flasm.exe所在的目录,由于这个mota.swf经过压缩,现在我们来解压,如图3所示。
图3
再执行反编译到mota.flm文件,如图4所示。没有错误提示,表示我们反编译成功。
图4
这样在C:/flasm15win文件夹下会生成mota.flm脚本文件,现在我们用记事本来打开它,查找Fullscreen字符串,只找到一个,把它后面的True改成False,游戏刚开始时生命是1000,所以查找字符串:1000,定位下面语句:
push 'Now_life', 1
setVariable
push 'Now_hp', 1000
setVariable
push 'Now_gong', 10
setVariable
push 'Now_fang', 10
这里就是设置主角初始值的地方(和Sothink SWF Decompiler MX2005反编译的内容有点区别,不过内容一样)。现在我们把1000改成50000,10改成500,然后保存文件。切换到命令提示符下,输入“flasm –a mota.flm”,把修改后的脚本编译进mota.swf文件,但会出现如图5所示的错误。大概意思是第一行的包括非法字符。
图5
我们用Hex workshop打开mota.flm文件,看看第一行处的内容,这里为图6所示的内容,可以看到EFBBBF为非法内容,把它删除,再保存文件 (如图6所示)。
图6
Icefire:记事本修改就是这样,为了保险起见,建议在Hex workshop中进行修改。
再执行“flasm –a mota.flm”,这次出现成功的提示,如图7所示。
图7
至此我们的修改工作结束。现在运行一下程序,进入打斗时,是不是Flash游戏的主角的生命已经变成了50000了?
其实Flash的游戏修改并不难,关键是以前其它修改游戏的定势思维的影响,使人觉得很难修改Flash游戏,其实有时换一个角度来解决问题可以很快解决一些“难题”。
(文中涉及的Flash游戏的原版和修改版已收录到杂志配套光盘“杂志相关”栏目,按文章名查找即可)