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, 代码混淆, 反调试, 多人体追踪, 软件保护