ArachisH/Flazzy

GitHub: ArachisH/Flazzy

Flazzy 是一个 .NET 库,用于读取、写入、分析并去混淆 SWF 文件中的 ABC/AVM2 内容。

Stars: 43 | Forks: 15

# Flazzy [![CI Workflow](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/3d1026a5ff004328.svg)](https://github.com/ArachisH/Flazzy/actions/workflows/ci.yaml) [![NuGet](https://img.shields.io/nuget/v/Hypo.Flazzy?label=NuGet)](https://www.nuget.org/packages/Hypo.Flazzy) [![NuGet](https://img.shields.io/nuget/vpre/Hypo.Flazzy?label=NuGet%20(Pre))](https://www.nuget.org/packages/Hypo.Flazzy) ![License](https://img.shields.io/github/license/ArachisH/Flazzy?label=License) 一个用于读取、写入和分析 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提取, 二进制解析, 云安全监控, 云资产清单, 代码混淆, 代码重构, 修复, 元数据, 反编译, 多人体追踪, 多名称, 常量池, 库, 应急响应, 开源, 文件格式, 方法, 标签解析, 脚本, 补丁, 运行时解密, 还原, 逆向工程, 静态分析