ArachisH/Flazzy
GitHub: ArachisH/Flazzy
Flazzy 是一个 .NET 库,用于读取、写入、分析并去混淆 SWF 文件中的 ABC/AVM2 内容。
Stars: 43 | Forks: 15
# Flazzy
[](https://github.com/ArachisH/Flazzy/actions/workflows/ci.yaml)
[](https://www.nuget.org/packages/Hypo.Flazzy)
[)](https://www.nuget.org/packages/Hypo.Flazzy)

一个用于读取、写入和分析 SWF 文件的 .NET 库。
Flazzy 主要设计用于 Flash 逆向工程和去混淆工作流程。它可以将 SWF 反汇编为标签对象,解析嵌入的 ABC 数据,检查和重写 AVM2 字节码,规范化无效的 AS3 标识符,并重建修补后的文件。
尽管该项目提供了 `ShockwaveFlash` 和 `ABCFile` 这样的便捷高级入口点,但它也暴露了用于标签、记录、常量池、多名称、方法、指令等更低级的结构,以便在需要时直接控制文件格式。
## 功能
- 读取并反汇编 SWF 文件以进行检查和修补
- 解析常见 SWF 标签,同时将不支持的标签保留为原始数据
- 提取并解析 `DoABC` 块
- 建模 ABC 结构,例如类、脚本、方法、常量池、元数据、命名空间和多名称
- 将 AVM2 字节码解析为可编辑的指令对象
- 去混淆 AVM2 控制流
- 将无效或混淆的 AS3 类型和命名空间名称重命名为编译器安全的标识符
- 将修改后的 SWF 和 ABC 数据重新构建为二进制形式
- 解密受更新 AIR/HARMAN 运行时加密流程保护的 Flash 内容
## 快速开始
安装包:
```
dotnet add package Hypo.Flazzy
```
加载 SWF 并检查其内容:
```
using Flazzy;
using Flazzy.Tags;
using var swf = new ShockwaveFlash("client.swf");
swf.Disassemble();
Console.WriteLine($"{swf.Signature} v{swf.Version}");
Console.WriteLine($"Tags: {swf.Tags.Count}");
foreach (TagItem tag in swf.Tags)
{
Console.WriteLine(tag.Kind);
}
```
## 工作原理
在 SWF 级别,`ShockwaveFlash` 读取文件头,处理支持的压缩,解析帧记录,然后将每个标签遍历到具体的 `TagItem` 实现(如果存在)。
嵌入在 `DoABC` 标签中的 ABC 数据可以加载到 `ABCFile` 中,它暴露了更高级别的结构,例如类、脚本、方法、常量池和方法体。对于 AVM2 级别的分析,`ASMethodBody.ParseCode()` 生成一个 `ASCode` 指令列表,可以进行检查、修改和重写。
当将文件写回时,Flazzy 会重建 SWF 容器并以二进制形式输出修改后的标签和 ABC 结构。
## 使用 ABC
ABC 块可以直接从 `DoABC` 标签加载:
```
using Flazzy;
using Flazzy.ABC;
using Flazzy.Tags;
using var swf = new ShockwaveFlash("client.swf");
swf.Disassemble();
foreach (DoABCTag tag in swf.Tags.OfType())
{
using var abc = new ABCFile(tag.ABCData);
Console.WriteLine($"ABC version: {abc.Version}");
Console.WriteLine($"Classes: {abc.Classes.Count}");
Console.WriteLine($"Methods: {abc.Methods.Count}");
foreach (var method in abc.Methods.Where(m => !string.IsNullOrWhiteSpace(m.Name)).Take(10))
{
Console.WriteLine(method.ToAS3());
}
}
```
有用的入口点:
- `ABCFile.Classes`
- `ABCFile.Methods`
- `ABCFile.MethodBodies`
- `ABCFile.Scripts`
- `ABCFile.Pool`
## 使用 AVM2 字节码
方法体可以解析为指令列表:
```
using Flazzy;
using Flazzy.ABC;
using Flazzy.Tags;
using var swf = new ShockwaveFlash("client.swf");
swf.Disassemble();
DoABCTag abcTag = swf.Tags.OfType().First();
using var abc = new ABCFile(abcTag.ABCData);
foreach (var body in abc.MethodBodies)
{
ASCode code = body.ParseCode();
code.Deobfuscate();
Console.WriteLine(body.Method);
Console.WriteLine($"Instruction count: {code.Count}");
}
```
这在需要时非常有用:
- 检查 AVM2 操作码
- 移除简单的混淆模式
- 重写分支或常量
- 将修改后的方法体重建回包含的 ABC 块
## 重建文件
一旦标签或 ABC 数据被修改,SWF 可以写回:
```
using Flazzy;
using var swf = new ShockwaveFlash("client.swf");
swf.Disassemble();
/* modify tags, ABC data, or other structures here */
using var output = File.Create("client.modified.swf");
swf.CopyTo(output, swf.Compression);
```
## 解密加密的 SWF
某些更新的 AIR/HARMAN Flash 运行时在运行时使用加密的 SWF 内容。Flazzy 暴露了 `FlashCrypto`,以便在开始正常解析 SWF 之前解密加密数据。
```
using Flazzy.Tools;
Span buffer = /* encrypted SWF data */;
int decryptedLength = FlashCrypto.Decrypt(ref buffer, out int writtenOffset);
Span decryptedData = buffer.Slice(writtenOffset, decryptedLength);
```
`FlashCrypto.Decrypt` 会就地修改提供的缓冲区。解密后,`writtenOffset` 成为 SWF 数据的新起始位置,返回的长度描述了解密的完整有效载荷。
## 重要注意事项
- 未知标签通过 `UnknownTag` 保留,这使得部分格式支持对修补工作流程非常实用。
- `ShockwaveFlash.Disassemble()` 会消耗底层输入流并填充内存中的标签列表。
- `DoABCTag` 暴露了原始 `ABCData`,必要时可以将其解析为 `ABCFile`。
- `FlashCrypto` 在处理为较新 AIR/HARMAN 运行时生成的加密 Flash 内容时 intended for public use。
- 该项目既可以作为高级 SWF 库使用,也可以作为低级格式工具包使用。
## 支持的格式和限制
当前支持:
- 未压缩的 SWF
- ZLib 压缩的 SWF
- 将不支持的标签作为原始数据进行往返
- ABC 解析和 AVM2 指令建模
当前不支持:
- LZMA 压缩的 SWF
- 每个 SWF 标签类型的完整覆盖
## 核心 API 范围
主要入口点:
- `ShockwaveFlash`
- `TagItem` 及其在 `Flazzy.Tags` 下的具体标签类型
- `ABCFile`
- `ASMethodBody`
- `ASCode`
- `FlashReader` 和 `FlashWriter`
## 文档
本文件应作为项目概述。更详细的参考材料属于维基和规范表:
- [维基](https://github.com/ArachisH/Flazzy/wiki)
- [规范](https://github.com/ArachisH/Flazzy/tree/develop/Specifications)
## 贡献
欢迎贡献。
- 从 `develop` 创建 `feat/` 或 `feature/` 分支
- 将拉取请求返回到 `develop`
- 针对错误、回归或功能请求打开问题
- 报告解析、重写或去混淆问题时,请包含清晰的重现详细信息
标签:ABC, AIR, AS3, AVM2, Deobfuscation, Flash, HARMAN, NuGet, SWF, URL提取, 二进制解析, 云安全监控, 云资产清单, 代码混淆, 代码重构, 修复, 元数据, 反编译, 多人体追踪, 多名称, 常量池, 库, 应急响应, 开源, 文件格式, 方法, 标签解析, 脚本, 补丁, 运行时解密, 还原, 逆向工程, 静态分析