简介:FFDec 18.5.0 是一款基于 Java 的开源 Flash 反编译工具,全称 JPEXS Free Flash Decompiler,面向需要分析 SWF 文件结构、提取素材或进行逆向工程的开发者与研究人员。它支持将 Flash 二进制文件还原为 ActionScript 代码,导出音频、图像、动画与字体等资源,并可查看帧率、舞台尺寸等元数据,对维护旧 Flash 项目或开展教学研究尤为实用。压缩包共 62 个文件,约 13.51MB,以 30 个 jar 类库为核心,辅以 exe、bat、sh 多平台启动脚本,以及 txt 许可说明、swc 组件、xml 元信息与图标文件,覆盖 Windows、Mac 与 Linux 环境。目前已有 1047 人学习下载。借助其中的变更日志与完整类库,读者可快速了解 18.5.0 的修复与新增功能,掌握反编译、资源提取与代码编辑的完整流程,是研究 Flash 技术不可多得的工具包。
1. 从一份 ffdec-18.5.0.zip 说起:它到底能拆开什么
如果你手头正好有一个 SWF 文件,想看看里面的矢量图、声音、字体、ActionScript 代码到底长什么样,或者想把某个小游戏里的素材抠出来复用,那 ffdec-18.5.0.zip 就是为你准备的。JPEXS Free Flash Decompiler(简称 FFDec)是一个用 Java 写的开源 SWF 反编译与编辑工具,18.5.0 是它的一个稳定版本。它能把编译后的 SWF 还原成可读的 ActionScript、可编辑的形状、可导出的图片和音频,甚至能直接改完再存回去。适合做逆向分析、素材提取、老 Flash 项目维护的人,也适合想研究 SWF 格式的开发者。解压即用,不需要安装,但需要本机有 Java 运行环境。
2. 环境准备与首次启动:Java 版本和内存参数怎么定
2.1 为什么 Java 版本是第一个门槛
FFDec 18.5.0 依赖 Java 运行时,官方推荐 JDK 8 到 JDK 11 之间。我实测过 JDK 17 也能跑,但部分导出功能会报NoClassDefFoundError,尤其是导出为 HTML5 或 SVG 时。如果你机器上已经装了多个 Java 版本,最稳妥的做法是单独指定一个 JDK 8 或 11 的路径,而不是依赖系统默认的java命令。
常见做法是:先确认当前默认 Java 版本,再决定要不要切换。
# 查看当前默认 Java 版本 java -version # 如果输出是 17 或更高,建议单独下载 JDK 8 或 11 # 假设解压到 /opt/jdk-11,用绝对路径启动 FFDec /opt/jdk-11/bin/java -jar ffdec.jar逻辑说明:java -version输出里的version "17.0.x"就是当前默认版本。FFDec 的启动脚本ffdec.sh或ffdec.bat内部会调用java,所以要么改脚本里的JAVA_HOME,要么直接用绝对路径启动。参数上,-jar后面跟的是 FFDec 主 jar 包,18.5.0 版本通常叫ffdec.jar,解压后就在根目录。
2.2 内存参数:大文件不崩的关键
SWF 文件超过 50MB 时,默认堆内存往往不够,导出过程中会卡死或抛OutOfMemoryError。我一般会在启动时显式指定最大堆。
# 给 FFDec 分配 2GB 最大堆内存 /opt/jdk-11/bin/java -Xmx2g -jar ffdec.jar-Xmx2g表示最大堆 2GB,机器内存充裕可以给到-Xmx4g。注意不要超过物理内存的 70%,否则系统本身会开始换页,反而更慢。如果只是看小文件,默认值就够,不用加。
2.3 首次启动后的界面取舍
启动后你会看到左侧是 SWF 结构树,右侧是内容面板。第一次用建议先把Settings里的Auto decompile打开,这样点开 ActionScript 标签时会自动反编译,不用手动点按钮。另外Export菜单里有一项Export selection,可以只导出你选中的资源,比全量导出快很多。
提示:如果启动后界面乱码,检查系统字体是否包含中文字体,FFDec 的 Swing 界面依赖系统字体渲染。
3. 反编译与导出实操:从 SWF 到可读代码和素材
3.1 打开 SWF 并定位资源
FFDec 支持直接拖拽文件到窗口,也支持命令行传入路径。打开后左侧树会按Images、Shapes、Sounds、Fonts、Scripts等分类展开。每个分类下是具体的资源 ID,比如DefineSprite (12)表示一个精灵元件。
我一般会先点Scripts看有没有 ActionScript,再点Shapes看矢量图复杂度。如果只是想提取图片,直接展开Images就行。
3.2 导出 ActionScript 代码
选中Scripts下的某个DoAction或DoInitAction,右侧会显示反编译后的代码。如果要批量导出所有脚本,用菜单File→Export→Export ActionScript。
# 命令行方式批量导出 ActionScript 到指定目录 /opt/jdk-11/bin/java -jar ffdec.jar -export script ./output_scripts ./input.swf逻辑说明:-export script表示导出类型为脚本,./output_scripts是输出目录,./input.swf是源文件。FFDec 会为每个脚本生成一个.as文件,文件名对应资源 ID。参数上,导出类型还可以换成image、sound、shape、font等。注意输出目录必须提前存在,否则会报错。
3.3 导出图片和声音
图片导出支持 PNG、JPG、SVG 三种格式。SVG 适合矢量图,PNG 适合位图。声音导出支持 MP3、WAV。我一般用命令行批量处理,比界面点选快。
# 导出所有图片为 PNG /opt/jdk-11/bin/java -jar ffdec.jar -export image:png ./output_images ./input.swf # 导出所有声音为 MP3 /opt/jdk-11/bin/java -jar ffdec.jar -export sound:mp3 ./output_sounds ./input.swfimage:png里的冒号后面指定格式,sound:mp3同理。如果某个声音导出失败,通常是编码格式不支持,换成sound:wav再试。导出后的文件名会带资源 ID,方便和结构树对照。
3.4 修改后重新打包
FFDec 不仅能导出,还能改。比如你反编译了一个脚本,改了几行代码,想存回 SWF。操作方式是:在右侧代码面板直接编辑,然后File→Save。FFDec 会重新编译 ActionScript 并写回 SWF。注意不是所有 AS3 代码都能完美重编译,遇到复杂语法可能会报错,这时候只能放弃修改,或者用其他工具辅助。
注意:修改前务必备份原 SWF,FFDec 的保存是覆盖式的,没有后悔药。
4. 避坑与排查:五个真实翻车记录
4.1 启动报 “Unable to access jarfile”
现象:双击ffdec.jar或命令行运行时报Unable to access jarfile ffdec.jar。 原因:当前工作目录不对,或者文件名不是ffdec.jar。18.5.0 解压后主 jar 可能叫ffdec.jar,也可能在lib子目录里。 解决:先用ls确认 jar 包实际路径,再用绝对路径启动。如果 jar 在lib下,命令改成java -jar ./lib/ffdec.jar。
4.2 导出图片全是黑块
现象:导出的 PNG 打开后是纯黑或透明,看不到内容。 原因:SWF 里的形状使用了混合模式或遮罩,FFDec 默认导出时没有应用这些效果。 解决:在导出设置里勾选Apply masks和Apply blend modes。命令行方式目前不支持这两个选项,只能用界面导出。
4.3 ActionScript 反编译结果乱码
现象:反编译出来的代码里变量名全是_loc_1、_loc_2,或者直接报错。 原因:SWF 被混淆过,或者使用了 FFDec 不支持的 AS3 新特性。 解决:尝试在Settings→Decompiler里切换反编译引擎,比如从AS3换成AS2,或者调整Timeout参数。混淆过的代码基本无法还原原始命名,只能看逻辑。
4.4 大文件导出到一半卡死
现象:导出进度条走到 80% 左右不动,CPU 占用高但无输出。 原因:堆内存不足,或者某个资源死循环。 解决:加大-Xmx参数,比如-Xmx4g。如果还是卡,用-export时加上--select只导出指定资源,避免全量扫描。
4.5 保存后 SWF 无法播放
现象:修改脚本后保存,原播放器打不开或报错。 原因:FFDec 重编译 AS3 时可能改变了字节码结构,导致校验失败。 解决:保存前先File→Export一份原始 SWF 做备份。如果保存后出错,用备份回滚。另外可以尝试只修改不涉及类结构的代码,比如改常量值,成功率更高。
5. 进阶技巧:用命令行批量处理与验证导出结果
5.1 批量处理多个 SWF
如果你有一批 SWF 要处理,写个循环比一个个点界面快得多。
#!/bin/bash # 批量导出当前目录下所有 SWF 的脚本和图片 for f in *.swf; do base="${f%.swf}" mkdir -p "./output/${base}/scripts" "./output/${base}/images" /opt/jdk-11/bin/java -jar ffdec.jar -export script "./output/${base}/scripts" "$f" /opt/jdk-11/bin/java -jar ffdec.jar -export image:png "./output/${base}/images" "$f" echo "处理完成: $f" done逻辑说明:${f%.swf}去掉文件后缀作为输出目录名,mkdir -p确保目录存在。每次导出独立进程,避免内存累积。如果 SWF 数量多,可以加sleep 1防止 IO 过载。
5.2 验证导出结果是否完整
导出后怎么知道有没有漏?我一般会对比资源数量。FFDec 界面里每个分类后面有个数字,比如Images (24),表示有 24 个图片资源。导出后数一下输出目录里的文件数,对不上就说明有失败。
| 检查项 | 界面显示 | 导出后核对 |
|---|---|---|
| 图片数量 | Images (N) | 输出目录 PNG 文件数 |
| 声音数量 | Sounds (N) | 输出目录 MP3 文件数 |
| 脚本数量 | Scripts (N) | 输出目录 AS 文件数 |
| 字体数量 | Fonts (N) | 输出目录 TTF 文件数 |
如果数量不一致,回到界面里单独选中失败的那个资源,看右侧有没有报错信息。常见原因是资源本身损坏,或者格式不支持。
5.3 一个具体技巧:用 FFDec 提取字体并转 TTF
SWF 里的字体资源导出后是.ttf文件,但有时候文件名不带扩展名。我一般会手动加.ttf再用字体查看器打开。如果字体是嵌入的子集,可能只有部分字符,这是正常的,因为 SWF 只嵌入了用到的字形。
# 导出字体并自动加 .ttf 后缀 /opt/jdk-11/bin/java -jar ffdec.jar -export font ./output_fonts ./input.swf for f in ./output_fonts/*; do mv "$f" "${f}.ttf" done逻辑说明:-export font导出所有字体资源,输出文件没有扩展名。循环给每个文件加.ttf,方便系统识别。注意如果原字体有多个字重,导出后会生成多个文件,需要手动对应。
从那以后我每次处理 SWF 都强制先备份原文件,再走一遍命令行导出,最后核对资源数量。这套流程帮我省了不少返工时间。希望帮到你。
本文还有配套的精品资源,点击获取