@ZEAL Blog·厉
WWW Zeal Blog
We stand alone,
TOGETHER.

flash反编译杂记

Posted by zeal on 2009-06-19 12:32 , 2645 characters |  + 0 - 0   English
转载请保留本行原始出处声明信息 : http://www.zeali.net/entry/623 MaDe1nZEAL
标签 ( WebDev ):  , 

近日有位童鞋让我帮忙把某个在线的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 真的可以让人抱有期待。本来嘛,都是基于浏览器的东西为什么不做成内置标准以最简单的方式来提供给开发者?

13 条评论:
- converter () (link) 于 2009-06-19 22:30
额,flash也能够反编译阿
- () 于 2009-06-20 03:01
强,我买的正版的ASV2009也是出错误,硕思用的5.0也一样,希望给指点下QQ16958398
- haphic () (link) 于 2009-06-20 03:38
即使没有 HTML5, 偶也比较反感 Flash, 都是带宽, 都是资源啊...
当然, Flash 游戏例外. 比如我正玩儿的这个: http://swf.enorth.com.cn/0/05/92/88/5928..
- zeal (link) verified2009-06-21 15:53
反编译这东西七成靠工具,三成靠运气。毕竟不是正常渠道的东西,具体每个swf反编译时出现的情况可能都有细节上的差异。
- 小林 (link) 于 2009-07-05 17:20
很久没有碰FLASH了。
以前都是用 硕思
- chimao2009-12-03 20:01
看了您上面精彩的杂记
我也按照做了遍
可为什么我得到的SWF播放不了????
我的这个FLASH 怎么才能改成本地能播放的FLASH(也就是用使用本地的图片)
请老师帮忙看下!谢谢老师!
http://www.rayfile.com/files/58bc5538-e0..
- wrist weights () (link) 于 2010-11-12 17:24
i am sure to all the commenter here! It's always nice when you can not only be informed, but also engaged! I'm sure you had fun writting this article.
- dog tags for dogs () (link) 于 2010-11-13 09:05
I have found that this problem is replicated in our environment, as our end users in general do not have administrator access on their computers, we install it with an administrator account instead.
- dog tags for dogs () (link) 于 2010-11-15 09:09
I have found that this problem is replicated in our environment, as our end users in general do not have administrator access on their computers, we install it with an administrator account instead.
- dog tags for dogs () (link) 于 2010-11-18 12:07
i really appreciate the effort you have given to this post. I am looking forward for your next post. I found this informative and interesting blog. I just I hope you could make another post related to this. This is definitely worth reading.
- Technology () (link) 于 2010-11-23 10:46
It seems that you are maintaining a steady blogging pace. Well done! Looking for more updates from your end. Thanks a lot!
- Videos Watch Online () (link) 于 2011-01-05 10:19
There's a lots good data in this blog, though I would like tell you something. I can understand the content, but the navigation doesn't work so good. I never usually post on blogs but I have found this is very useful work. I high appreciate this post
- SWF to FLV Converter () (link) 于 2011-06-28 15:56
If you want to convert SWF to FLV video, or if you are looking for a video converter from SWF to FLV, this <a href="http://swflv.net">SWF to FLV Converter</a> is the ideal one. It can perfectly convert all sorts of SWF files to FLV videos, so that you can upload them to YouTube and share with others.
日志存档
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
本 Blog 原创内容
遵循以下授权:

Creative Commons
(创作共用) CC

署名-非商业性
-相同方式分享
ZEAL Blog 基于
Powered byPivot - 1.24.1: 'Arcee'
Pivot1.24.1
开发
系统部署于
Linode.com
Launched @
2005-04-27
Since 2005.04.27  梦想 就像鸡蛋 要么孵化 要么臭掉RSS Feed (Entries) | About me | Back To Home | @ZEAL | zbird.com | 沪ICP备05024379号