其实这东西不止一次被科普过了。本文针对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爆破出来之后进行修改,在它没有被虚拟机编译的时候替换它!那就可以省去内存部分的一些代码,而且把握也比较大——尤其是对新手而言,可以减少很多因为马虎而引起的修改不成功的问题。