flash反编译杂记

近日有位童鞋让我帮忙把某个在线的flash游戏做成单机硬盘版的好在自己的电脑上玩,恰好又有些其它swf文件的反编译需求,于是很不专业的折腾 了一番。思路比较混乱,随手记一下。Flash 达人请直接飘过。

现在的flash不像以前都是单个SWF,直接下载下来就完事儿。在AS3里面可以采用Loader / URLLoader / Sound 等来按需加载不同的外部内容数据,减少单次下载的内容大小。通过 Firebug 的网络面板可以很容易知道在交互过程中产生了哪些二次数据请求,当然也就很容易把这些必需的外部文件也同步保存到本地。

但这样保存下来的内容不见得是整个应用所需的全部素材,因为你不见得会在一次访问过程中触发所有的可能性。所以最彻底的方式是反编译保存下来的 SWF文件,然后用全局搜索查找出全部的调用内容。

反编译的工具,对我来说 Sothink SWF Decompiler 不错,基本上能很好的还原出fla文件。但这个工具有一个很严重的问题,在反编译还原 AS 类库文件的时候会出现很多错误,比如把某些变量进行了错误的替换,某些注释被错误的赋值给变量,等等(我用的是 v4.4 ,不知道最新的 v5.0 还有没有这个问题)。如果直接用 Flash CS3 / CS4 去打开生成反编译出来的项目的话,很可能会报出一大堆的编译器错误!所以还需要使用另外一个工具 Action Script Viewer 6 ( ASV6 之前的版本并不支持AS3脚本的反编译),用ASV的 “Export Rebuild Data (JSFL)” 功能导出的 rebuild 脚本虽然有时候并不能完整的重建项目,但导出来的 AS 库文件源代码却很完整。

把 ASV 生成的 AS 库文件复制覆盖到 Sothink 生成的项目文件夹,再打开 Sothink 生成的flp项目文件去编译,应该就不会有一堆莫名其妙的编译器错误了 —- 一开始我太相信 Sothink 的反编译结果,一度很纠结为什么源代码有这么多编译错误还能生成SWF并正常交互,还以为是跟 Flash CS4 版本兼容性问题又去搞了个 CS3。

ASV 网上能找到的好用版本貌似只有到 asv6 alpha4 ,由于不是 relase 版本,在反编译的时候会提示说反编译出来的东西不一定是完整的 —- 由于这个提示我一度放弃使用 asv6 ,直到后来拿 asv6 反编出来的源代码去和 Sothink 反编出来的做比较才发现原来声明自己并不一定完整的反而是准确可用的。

这两个工具最好都不要找什么绿色汉化版,有后门。如果常规性会有类似反编译需求的童鞋是值得花钱去买一份正版的来用的。

Sothink 生成的flp项目文件是 for Flash CS3 的, CS4 打开flp文件的方法是:选择“窗口”>“其它面板”>“项目”打开“项 目”面板;在“项目”面板中,从“项目”弹出菜单中选择“打开项目”;在“浏览文件夹”对话框中,导航到包含 FLP 文件的文件夹,然后单击“确定”,即可。

为了完成反编译修改大业,终于把机器上尘封了N久的Flash8给卸掉,换成了 Flash CS3 。一开始搞了个精简版,结果对 as 源代码进行语法检查就报“JAVA 运行时环境初始化时出现错误,您可能需要重新安装Flash”。原来精简版把 JVM 都给精简了,需要装一个 jre 环境(或者找找机器上是不是已经有 jre 环境目录了),把jre下的内容复制到 Flash 安装目录下的 JVM 文件夹中(没有的话建一个)。

当然最好还是找个原版镜像出来的比较好,否则总会出现各种古怪问题(比如当Flash项目中用到的字体文 件在你本地环境中找不到的话,精简版会直接程序崩溃,就为这个我又一度不得不上网去找来项目中用到的微软雅黑字体给装上)。有时候浓缩不一定是精华。

发布项目时出现“5003: 生成字节代码时发生未知错误”。可以尝试的解决方法: 1、 在“文件->发布设置”的“ActionScript 3.0 设置”中不要勾选“减小文件大小并改善性能”(发布设置这个菜单项平时是没有的,必须打开项目的默认fla文件,一度又很纠结为什么在项目面板鼠标右键点 击fla文件的时候不出现这个发布设置…); 2、 “控制->删除 ASO 文件”; 3、 增加一个系统环境变量 JAVA_TOOL_OPTIONS ,变量值设置为 -Xmx512M (注意 512 这个数字需要根据情况调整,不同的电脑配置可设置的数值不一样,可以从 1024 开始往小里改。我的本本要改到 400 才行,大于 400 的数字会又一次导致’JAVA 运行时环境初始化出现错误’;修改了环境变量之后可以开一个命令行窗口输入命令 SET JAVA_TOOL_OPTIONS=ANYTHING 让新的环境变量立即生效,重新打开 Flash CS 程序即可)。

当去掉了发布设置选项中的”省略 trace 动作”勾选框之后,测试项目时会输出”VerifyError: Error #1030: 堆栈深度不对称”的错误,没搞清为什么,只好把这个选项再勾上。

URLLoader 加载本地文件,相对路径如果写成 “./data/……” 的话,测试项目没问题,生成项目之后用某些支持SWF的播放器也没问题,但用 Flash Player 运行生成出来的SWF时会抛出类似”Error #2044: 未处理的 ioError:。 text=Error #2032: 流错误” 的 ioError ,需要把 “./” 去掉,直接写 “data/……” 这样的相对路径才能正常读取到相对目录下的内容。

折腾完毕,一个字:累。或许是早期版本Flash IDE对as脚本编写支持的超级弱让我对 Flash 一直很排斥,即便到现在还是如此。也许 HTML 5 真的可以让人抱有期待。本来嘛,都是基于浏览器的东西为什么不做成内置标准以最简单的方 式来提供给开发者?

Tags : , , ,

Google Reader Yahoo Facebook Twitter Digg FriendFeed Delicious Google Translate
这篇日志发表于2010年06月18日 00:33。 你可以订阅该日志的所有评论通过 RSS 2.0。 你可以发表评论,或者引用通告

发表评论

(Ctrl+Enter)

XHTML:你可以使用这些标签:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>