526077247/TaoTieObfuscation

GitHub: 526077247/TaoTieObfuscation

一款基于 Mono.Cecil 的 Unity DLL 混淆工具,通过可扩展的 pass 流水线实现名称重命名、字符串加密、控制流扁平化和反篡改注入,保护游戏代码免遭逆向分析。

Stars: 0 | Forks: 0

# TaoTie 混淆 用于 Unity 的 DLL 混淆工具 — 支持名称重命名及可扩展的 pass 流水线。 ## 安装说明 通过 Package Manager 添加到你的 Unity 项目中: 将此仓库克隆到你的 Unity 项目的 `Packages/` 目录中: ``` cd YourUnityProject/Packages git clone https://github.com/526077247/TaoTieObfuscation.git ``` 或者通过 `manifest.json` 添加它: ``` "com.taotie.inspector": "https://github.com/526077247/TaoTieObfuscation.git" ``` ## 配置 所有设置均通过 **Edit > Project Settings > TaoTie Obfuscation** 进行配置,或者通过 **Tools > TaoTie Obfuscation > Setting** 专用窗口进行配置。 设置将持久化保存到 `ProjectSettings/TaoTieObfuscationSettings.asset`,并与你的项目一起进行版本控制。 ### 可用选项 #### 混淆 Pass | 选项 | 描述 | |--------|-------------| | **Name Renaming** | 重命名类型、方法、字段、属性和事件 | | **String Encryption** | 使用 XOR+Base64 加密字符串字面量并注入运行时解密 | | **Control Flow** | 通过基于 switch 的状态机调度来扁平化方法控制流 | | **Anti-Tamper** | 使用 `RuntimeInitializeOnLoadMethod` 注入反调试检查(`Debugger.IsAttached`) | #### 字符串加密选项 | 选项 | 描述 | |--------|-------------| | **XOR Key** | 用于 XOR 加密的字节值(0 = 每次运行自动生成随机密钥) | #### 控制流选项 | 选项 | 描述 | |--------|-------------| | **Intensity** | 要处理的符合条件的方法百分比(1-100,默认为 50) | #### 反篡改选项 | 选项 | 描述 | |--------|-------------| | **Method-Level Checks** | 如果为 true,除了启动检查外,还会在方法入口点注入调试器检查 | #### 重命名开关 | 选项 | 描述 | |--------|-------------| | **Obfuscate Class Names** | 重命名类型/类名 | | **Obfuscate Method Names** | 重命名方法名称 | | **Obfuscate Field Names** | 重命名字段名称 | #### 名称重命名选项 | 选项 | 描述 | |--------|-------------| | **Keep Public API** | 如果为 true,public 类型和成员将保留其原始名称 | | **Naming Scheme** | `confusing` (O0lI_)、`hex` (_0x1a)、`unicode` (同形字) 或 `sequential` (a,b,c) | #### 名称排除(精确匹配) | 选项 | 描述 | |--------|-------------| | **Excluded Class Names** | 不会被重命名的类型全名(例如 `MyNamespace.MyClass`) | | **Excluded Method Names** | 不会被重命名的方法名称(例如 `Awake`) | | **Excluded Field Names** | 不会被重命名的字段名称(例如 `instance`) | #### 基于属性的排除 指定属性全名 —— 任何带有这些属性之一的类型、方法或字段都将被跳过。如果缺失,将自动追加 `Attribute` 后缀。 示例: - `System.Serializable` → `System.SerializableAttribute` - `Newtonsoft.Json.JsonProperty` → `Newtonsoft.Json.JsonPropertyAttribute` #### 构建流水线 | 选项 | 描述 | |--------|-------------| | **Obfuscate On Build** | 在构建后自动混淆目标程序集 | | **Target Assemblies** | 构建时要混淆的程序集名称(例如 `Assembly-CSharp`) | ## 使用方法 ### 手动混淆 - **Tools > TaoTie Obfuscation > Obfuscate DLL...** — 选择任意 DLL 文件进行混淆 - **Tools > TaoTie Obfuscation > Obfuscate Assembly-CSharp** — 混淆主游戏程序集 这两个操作在设置面板中也可以作为按钮使用。 ### 构建流水线集成 在设置面板中启用 **Obfuscate On Build** 并指定目标程序集。混淆器将在构建后自动运行,并就地覆盖目标 DLL。 ## 架构 ``` com.taotie.obfuscation/ ├── package.json ├── README.md └── Editor/ ├── TaoTie.Obfuscation.Editor.asmdef ├── Mono.Cecil.dll (Precompiled reference) ├── ObfuscationSettings.cs (ScriptableObject → ProjectSettings) ├── ObfuscationSettingsProvider.cs (SettingsProvider panel) ├── ObfuscationSettingsUI.cs (Shared UI drawing logic) ├── ObfuscationWindow.cs (Tools menu EditorWindow) ├── ObfuscationRunner.cs (Pipeline orchestration + menu items) ├── ObfuscationContext.cs (Shared context) ├── NoThrowAssemblyResolver.cs (Non-throwing assembly resolver) ├── Obfuscators/ │ ├── IObfuscator.cs (Pass interface) │ ├── NameObfuscator.cs (Name renaming — implemented) │ ├── StringEncryptionObfuscator.cs (XOR+Base64, injects decrypt helper) │ ├── ControlFlowObfuscator.cs (State machine flattening) │ └── AntiTamperObfuscator.cs (Debugger.IsAttached + RuntimeInit) └── Utils/ └── NameGenerator.cs (4 naming schemes) ``` ### 流水线 `ObfuscationRunner` 通过 Mono.Cecil 加载目标程序集,构建一个 `ObfuscationContext`,并按顺序运行每个 `IObfuscator` pass: 1. **NameObfuscator** — 重命名类型、方法、字段、属性和事件,然后修复方法体中的所有引用。 2. **StringEncryptionObfuscator** — 加密字符串字面量(XOR+Base64),注入解密辅助类型,并将每个 `ldstr` 替换为加密字符串 + `call Decrypt`。 3. **ControlFlowObfuscator** — 将方法体拆分为基本块,并将它们转换为具有乱序 case 的基于 switch 的状态机。 4. **AntiTamperObfuscator** — 注入一个带有 `[RuntimeInitializeOnLoadMethod]` 的 `` 类型,该类型会检查 `Debugger.IsAttached` 并调用 `Application.Quit()`(或 `Environment.Exit`)。 额外的后处理: - **移除强名称** —— 由于程序集内容已更改,移除公钥签名。 - **剥离无法解析的常量** —— 重置其支持类型无法解析的默认参数值和字段默认值,从而防止 Cecil 写入失败。 - **支持 PDB 符号** —— 如果输入 DLL 旁边存在 `.pdb` 文件,则会读取符号并使用混淆后的名称进行重写。 ## 安全跳过 名称混淆器会自动跳过: - Unity 生命周期方法(Awake、Start、Update、OnEnable 等) - P/Invoke 方法 - Virtual / override / abstract 方法 - 构造函数 - 特殊名称方法(运算符等) - 可序列化类型 - 属性类型(继承自 `System.Attribute`) - 委托的 `Invoke` / `BeginInvoke` / `EndInvoke` - 常量(`const` 字段) - 索引器(属性名 `Item`) - 编译器生成的类型(``、``,名称中包含 `<` 的成员) - 带有 `[CompilerGenerated]` 属性的成员 - 带有 `[Obfuscation(Exclude = true)]` 属性的成员 - 带有用户指定的任何排除属性的成员 ## 依赖项 - [Mono.Cecil](https://github.com/jbevain/cecil) 0.11.6(作为预编译 DLL 包含在内) - Unity 2021.3+
标签:DOM解析, Unity, 代码混淆, 反调试, 多人体追踪, 软件保护