【科普】制作FLASH游戏修改器的一点小经验

      其实这东西不止一次被科普过了。本文针对AS3且适用于AS2,AS2的人家都有修改器的。不过说起来修改FLASH游戏,我这也只是初级方法,现在还在看flexsdk4.1里面的fdb的源码,呵呵。理论上应该可以找到更好的解决办法——直接去修改二次编译后的代码,那样就可以为所欲为了,咕~~(╯﹏╰)b。闲话少说,进入这次的正题,后面的“高级”东东以后再说,反正弄着玩嘛,又不指望这吃饭,兴趣使然。

      有位老大爷说得好,工欲善其事必先利其器!建议往下看之前先搞个这:http://www.yogda.com/Yogda.1.0.564.zip 。 当然了,去主页看看也挺好;要是你有闪客精灵、ASV啥的也行,呵呵。不过还是推荐我这。这东东嘎哈的不用说了,这丫的可以直接修改代码……咕~~(╯﹏╰)b挺好挺强大。

一、必备工具

1、Yogda、闪客精灵、ASV6之一

2、WINHEX等十六进制编辑器

转载请注明出处:http://www.cnblogs.com/zcsor

二、反编译并修改

      先说最实在的,玩个游戏也许一次过不去,下次就过了;不过要是十次过不去,并且有了相当的思考(自认为),那就有必要修改一下,但是不要去做坏事!接下来还是说实在的,知道用什么工具了,稍微了解一下语法规范就能干很多事情。也许不需要讲。不过还是细说一下。

1、反编译谁?

简单的在时间轴上写几句:

var _w:int = 60;
var _h:int = 60;
var gr:* = graphics;
gr.clear();
gr.lineStyle(1, 0x999999);
gr.beginFill(0xFF00FF, 0.4);
gr.drawRect(20, 20, this._w, this._h);
gr.endFill();

然后导出。咋看那个边缘咋不清晰,给他改成黑的!(嗨嗨,别回去改代码,咱今天自己和自己过不去,绕远!)

2、反编译自己!

用你选择的反编译器打开导出的SWF,Yogda则依次展开左边的树,来到这里:

Public function _fla:frame1();

看右面(我只是右键复制的):

function 0000 *():
 {
 
    // Max stack    : 5
    // Local count  : 1
    // Scope depth  : 10
    // Max Scope depth  : 11
    // Exception Count  : 0
    // Trait Count  : 0
    // Code Length   : 65 bytes.
 
 
       0  getlocal0
       1  pushscope
       2  getlocal0
       4  pushbyte 60
       6  initproperty _w
       7  getlocal0
       9  pushbyte 60
       11  initproperty _h
       12  getlocal0
       14  getlex graphics
       16  initproperty gr
       17  getlocal0
       19  getproperty gr
       22  callpropvoid clear,0
       23  getlocal0
       25  getproperty gr
       27  pushbyte 1
       29  pushint 1
       32  callpropvoid lineStyle,2
       33  getlocal0
       35  getproperty gr
       37  pushint 2
       39  pushdouble 1
       42  callpropvoid beginFill,2
       43  getlocal0
       45  getproperty gr
       47  pushbyte 20
       48  dup
       49  getlocal0
       51  getproperty _w
       52  getlocal0
       54  getproperty _h
       57  callpropvoid drawRect,4
       58  getlocal0
       60  getproperty gr
       63  callpropvoid endFill,0
       64  returnvoid
 }


 转载请注明出处:http://www.cnblogs.com/zcsor

看见红的那几行了吧(当然你编辑器上不是红的,看行号,要是没红的,看下面),就是gr.lineStyle(1, 0x999999);反编译的结果了,0x999999呢?除了byte,bool类型,其他的一般都被索引代替了,可以翻看左面的Integers,里面依次有编号,但是编号和这里的编号不对应,应该+1。 不扯远了,再次对比:

gr.lineStyle(1, 0x999999);

就是:

       23  getlocal0
       25  getproperty gr
       27  pushbyte 1
       29  pushint 1
       32  callpropvoid lineStyle,2


注:前面的数字不是行号,是字节号。

翻译一下,注意对照看ABC:

23,其语义应理解为This.

25,Gr.

27,咱就不说堆栈,参数1

29,咱还不说堆栈,参数2

32,调用

前面的俩参数,是给后面调用用的。很明白了吧。所以,我们想把这鬼子丫的改成清晰的黑框子,很易:

双击29那行,修改为pushbyte 1,点OK保存。然后小鼠标轻点工具栏上内保存按钮,重新运行那个new.swf,丫的黑了吧!

 

很易是不,不过还得说,我们还得用WINHEX,因为我习惯于WINHEX,直接CTRL+ALT+X查找一串标志性的16进制,然后去编辑——2D 01改为24 01……晕了吧,开个玩笑。

 

三、在线的FLASH怎么办?——纯属技术讨论

      之所以用WINHEX,是因为我们要找到修改的位置相对于整个SWF文件的偏移量。所以个人觉得,熟悉了之后,用反编译工具看一眼,然后直接WINHEX比较好——上面明明白白的写着偏移量,还可以复制选择内容为N种语言代码,不过丫的没有VB的,哈哈。

1、提取SWF来反编译:对,还有一个头疼的事,很多时候我们用尽各种办法,试了无数工具,发现SWF没有被下载到硬盘上……其实真是活见鬼了,那么简单的事都让大家搞复杂了,解决方法前面文章里我已经做好了——爆破内存中的SWF那篇,里面有工具,只是使用时记得注意:多标签浏览器的SWF一般不在和你标题一样的那个进程里,例如浏览器名.EXE有N个,其中不带启动窗口标题那个家伙却正是我们要搜索的。

2、之后,当我们记下在什么位置,修改成什么样(好的做法应该是还记录原来什么样,并在修改前校验),就可以修改了——只是这次是在内存里。

注:对混效过的SWF反编译的话,建议用ASV,它提供了一个将混淆后名称进行“反混淆”的功能,不过丫的只是把方框变成字母数字表示,要想看明白,还得自己动手!另外,这个修改需要在虚拟机解释ABC代码之前,原因和方法留给大家吧,很简单,别想复杂了!

转载请注明出处:http://www.cnblogs.com/zcsor

=======================================================================================
以下需要工具:
flexsdk4.1 (adobe有下)
debug 版本的 flashplayer 或 ax 控件 (adobe有下)
XJad (自己搜索吧,或者你手头有java反编译工具)用的时候点文件—反编译jar文件
eclipse (不是必须的,java编辑器而已,用记事本也能看,不过还是有高亮语法显示看起来容易些)
=======================================================================================

四、挂接调试器,解决更多问题!
      用过FLASH的都知道,FLASH提供了调试功能,这个debugger被公开在flexsdk里面,我看的是4.1版本的,在里面有个fdb.exe,完全可以拿来就用,不过需要对你的flashplayer或者ax控件进行一点更改:到adobe去下载对应的debug版本。这样,只需要运行fdb.exe并输入run,就会进入等待。当用debug版本的flashplayer或网页打开一个SWF时(当然需要安装了debug版本的ax控件,无法正常安装时可到c:\windows\system3\micromedia\执行卸载程序——先关闭所有页面,看到flash*.dll消失了,证明卸载成功,否则可以关闭浏览器再试)fdb的界面上就将显示对应提示。当然,想要使用这个命令行版本的工具还需要仔细看它的帮助文件。其断点功能就是我们所需要的——而且非常“贴心”——它支持函数名作为断点。当然,如果你使用了一个非debug版本的SWF那么就可能需要对它做点小手术!这样,我们通过在一些位置下断点,就可以取得任何你想要的东西——但是还是没有前面所说的修改二次编译后的ASM过瘾——那将让我们进入熟悉的WINDOWS运行环境让我们可以为所欲为——例如send个message啥的呵呵。又扯远了,对于控制台应用程序,我们可以重置其输入输出流,从而得到其输出信息。这个内容可以参考象棋魔法学校那一篇,那里用到的与引擎通讯的技术就是了,或者你可以直接去看MSDN提供的源码——那非常清晰。

转载请注明出处:http://www.cnblogs.com/zcsor

五、仔细阅读~fdb.jar源码,可以得到更多
      只是一个建议,这将耗费大量的时间和精力——如果对你而言这只是一个工程而不是你的一个知识框架的组成部分,那研究它就得不偿失了。但是如果想实现更“厉害”的修改器,恐怕要研究而且要灰常研究。
转载请注明出处:http://www.cnblogs.com/zcsor

 

再说明一下,之所以用Yogda,主要原因还是他可以直接修改并保存文件,这样完全可以把SWF爆破出来之后进行修改,在它没有被虚拟机编译的时候替换它!那就可以省去内存部分的一些代码,而且把握也比较大——尤其是对新手而言,可以减少很多因为马虎而引起的修改不成功的问题。

posted @ 2011-02-08 16:44  zcsor~流浪dè风  Views(4440)  Comments(2Edit  收藏  举报