$npx -y skills add zhaoxuya520/reverse-skill --skill dotnet-reverse.NET / C# 二进制逆向。当目标是 .NET assembly(PE 头含 CLR、.exe/.dll 托管程序)、C# 编译产物(含 NativeAOT)、红队 Sharp* 工具(Rubeus / SharpHound / SharpHound 等)、.NET 混淆程序(ConfuserEx / SmartAssembly / Babel / Eazfuscator)、.NET loader / info-stealer / 套壳 malware 时使用。优先用 dnSpyEx + de4dot,需要 AI 直接操作时联动 dnSpy MCP。
| 1 | # .NET / C# 逆向作业规范 |
| 2 | |
| 3 | ## ACTION REQUIRED(读完立刻执行) |
| 4 | |
| 5 | 1. `NOW`: 用 DIE/`file`/CLR 头确认目标是 .NET 托管(否则 SWITCH 到 `ida-reverse/` / `reverse-engineering/`) |
| 6 | 2. `NOW`: 若疑似混淆 → 先 `de4dot` 脱壳,产出 `*-clean.exe`,保留原始样本 |
| 7 | 3. `NEXT`: dnSpyEx(或 dnSpy MCP / `ilspycmd`)静态:C# 浏览 + **IL 视图**看关键判断 |
| 8 | 4. `ACT`: 需要明文/C2 时动态调试;需要改逻辑时 **IL patch** 优先于 C# 重编译 |
| 9 | 5. 阶段结束给用户 3–6 项下一步菜单(含导出报告) |
| 10 | |
| 11 | ## 适用范围 |
| 12 | |
| 13 | 当任务属于以下场景时优先使用本 skill: |
| 14 | |
| 15 | - 识别并逆向 .NET / C# 编译产物(托管 PE / .exe / .dll) |
| 16 | - 分析红队 Sharp* 工具链(Rubeus、SharpHound、SharpShell 等) |
| 17 | - 脱混淆 ConfuserEx / SmartAssembly / Babel / Eazfuscator / .NET Reactor 等壳 |
| 18 | - 逆向 .NET loader / info-stealer / RAT 的解密与 C2 逻辑 |
| 19 | - 对 C# 程序做 patch(改判断、改常量、keygen) |
| 20 | - 分析 IL2CPP 之前的 Mono/Unity 托管层(注意:IL2CPP 编译后是 native,走 `reverse-engineering/` + seed-014) |
| 21 | |
| 22 | 如果目标是纯 native 二进制(C/C++/Go/Rust 编译、无 CLR),请改用 `reverse-engineering/`、`ida-reverse/` 或 `radare2/`。 |
| 23 | |
| 24 | ## 核心原则 |
| 25 | |
| 26 | - **先识别再下手**:先确认是 .NET 托管程序(PE 头 CLR + `#~` / `#Strings` 流 + mscoree `_CorExeMain`),再决定走 dnSpy 而非 IDA |
| 27 | - **IL 优先于 C#**:dnSpyEx 的 C# 反编译器会丢失/扭曲信息(编译器生成的状态机、async/await、yield),关键判断与 patch 必须切到 **IL 编辑器**,C# 视图只用于快速浏览 |
| 28 | - **de4dot 先行**:遇到混淆器先 `de4dot` 脱一轮再做静态分析,否则字符串/控制流全是乱的 |
| 29 | - **MCP 联动**:环境里若注册了 dnSpy MCP(`dnspy_*` 工具),优先走 MCP 面做 decompile / IL inspection,避免来回切 GUI |
| 30 | - **证据化输出**:脱混淆产物、提取的配置/C2/key、patch diff 都要落盘 |
| 31 | |
| 32 | ## 工具链映射 |
| 33 | |
| 34 | | 能力 | 首选 | 备注 | |
| 35 | |------|------|------| |
| 36 | | 反编译 + 调试 + patch | **dnSpyEx** | 王牌,唯一带 IL 编辑器的 GUI;老 dnSpy 已停更,用 Ex 分支 | |
| 37 | | 轻量 CLI / headless 反编译 | **ILSpy** (`ilspycmd`) | 适合批量、脚本化、Linux/macOS | |
| 38 | | 脱混淆 | **de4dot** | ConfuserEx 全家桶、SmartAssembly 等主流壳的默认解 | |
| 39 | | 混淆器识别 | **Detect It Easy (DIE)** / **file** | 先判断壳类型再决定 de4dot 参数 | |
| 40 | | 编程化操作 IL | **dnlib** | 写 C# 脚本批量改 metadata / 字符串解密器 | |
| 41 | | AI 直接操作 | **dnSpy MCP** | `dnspy_decompile` / `dnspy_inspect_il` 等工具面 | |
| 42 | |
| 43 | > 前置:Windows 主机装 dnSpyEx + de4dot(choco 或 release);Linux/macOS 用 `ilspycmd` + `dotnet runtime`。详见 `references/sharp-tools.md` 的安装矩阵。 |
| 44 | |
| 45 | ## 六阶段工作流 |
| 46 | |
| 47 | ### 1. Identify(识别 .NET) |
| 48 | |
| 49 | 确认目标是托管程序,别把 native PE 当 .NET 分析: |
| 50 | |
| 51 | ```powershell |
| 52 | # Windows |
| 53 | file target.exe # "PE32 executable ... for MS Windows" 不够 |
| 54 | # 关键:看有没有 CLR |
| 55 | powershell -c "[System.Reflection.AssemblyName]::GetAssemblyName('target.exe')" |
| 56 | # 或 |
| 57 | dnSpyEx 直接拖进去 —— 能打开就是托管 |
| 58 | |
| 59 | # 通用 |
| 60 | strings target.exe | grep -iE "mscoree|_CorExeMain|mscorlib|System\\." |
| 61 | ``` |
| 62 | |
| 63 | **.NET 识别标志:** |
| 64 | - PE 头 `Data Directory[14]` (CLR Runtime Header) 非零 |
| 65 | - `mscoree.dll` 导入 / `_CorExeMain` 入口 |
| 66 | - `#~`、`#Strings`、`#US`、`#GUID`、`#Blob` metadata 流 |
| 67 | - `mscorlib` / `System.Private.CoreLib` 字符串 |
| 68 | |
| 69 | **NativeAOT 例外:** 编译成 native,没有 CLR 头,但有 `System.Private.CoreLib` 字符串和重构过的类型元数据 —— 这类走 `reverse-engineering/`(IDA/r2),本 skill 仅做识别提示。 |
| 70 | |
| 71 | ### 2. Detect(检测混淆器) |
| 72 | |
| 73 | ```powershell |
| 74 | # DIE 快速识别 |
| 75 | diec target.exe # Detect It Easy CLI |
| 76 | # 或拖进 dnSpyEx,看是否大量乱码类名 / 控制流变形 |
| 77 | ``` |
| 78 | |
| 79 | 常见混淆器 → 脱壳策略(详见 `references/obfuscators.md`): |
| 80 | |
| 81 | | 混淆器 | 特征 | de4dot 处理 | |
| 82 | |--------|------|------------| |
| 83 | | ConfuserEx (1.0.0 / 2.x) | `<module>` anti-tamper、控制流变形、字符串加密 | `de4dot target.exe` 通常自动识别 | |
| 84 | | SmartAssembly | `circular`/`string encoding`、资源压缩 | `de4dot target.exe` | |
| 85 | | Babel.NET | 方法体加密、控制流 | `de4dot target.exe` | |
| 86 | | Eazfuscator.NET | 字符串/资源加密 | `de4dot`,部分版本需手动 | |
| 87 | | .NET Reactor | anti-tamper + necrobit | `de4dot`,新版可能失败需手动 | |
| 88 | |
| 89 | ### 3. Deobfuscate(脱混淆) |
| 90 | |
| 91 | ```powershell |
| 92 | # de4dot 默认自动识别大多数壳 |
| 93 | de4dot target.exe -o target-clean.exe |
| 94 | |
| 95 | # 指定类型(自动识别失败时) |
| 96 | de4dot --type cfze target.exe # ConfuserEx |
| 97 | de4dot --type sa target.exe # SmartAssembly |
| 98 | |
| 99 | # 多层混淆 / de4dot 报 unknown |
| 100 | de4dot --detect target.exe # 看它识别成什么 |
| 101 | # 可能要先 patch anti-tamper 再 de4dot(见 references/obfuscators.md) |
| 102 | ``` |
| 103 | |
| 104 | 产出:`target-clean.exe`,后续分析用它。**保留原始样本**做对照。 |
| 105 | |
| 106 | ### 4. Static Analyze(静态分析) |
| 107 | |
| 108 | dnSpyEx 加载脱壳后样本: |
| 109 | |
| 110 | - **C# 视图**:快速浏览类结构、方法签名、字符串(用于定位) |
| 111 | - **IL 视图**:关键判断、加密逻辑、状态机必须看 IL(右键 → Edit IL 或 IL 视图) |
| 112 | - 找入口:`Main` / `Startup` / 模块初始化器 (`Module .cctor`) |
| 113 | - 找关键逻辑:搜 `flag`、`password`、`verify`、`check`、`encrypt`、`http`、`Config` |
| 114 | |
| 115 | ```text |
| 116 | 定位字符串 → 反向引用 → 找到使用它的方法 → IL 视图看判断逻辑 |
| 117 | ``` |
| 118 | |
| 119 | ### 5. Dynamic(动态调试) |
| 120 | |
| 121 | dnSpyEx 调试器:附加进程 / 启动调试,在关键方法下断点,观察运行时: |
| 122 | - 解密后的明文字符串(很多混淆器的字符串在运行时才解密) |
| 123 | - C2 地址、配置解密结果 |
| 124 | - 异常驱动的控制流(anti-debug 常用 `try/catch` 隐藏真实路径) |
| 125 | |
| 126 | > .NET 动态调试比 native 友好得多 —— 能直接看到对象值、字符串内容。优先动态而非死磕静态。 |
| 127 | |
| 128 | ### 6. Patch(按需修改) |
| 129 | |
| 130 | ```text |
| 131 | dnSpyEx → 右键方法 → Edit Method (C#) 或 Edit IL |
| 132 | - 改判断:ldc.i4.0 → ldc.i4.1(false→true) |
| 133 | - 改常量:直接编辑字符串/数字 |
| 134 | - 删除校验:nop 掉整段 |
| 135 | File → Save Module → 替换原文件 |
| 136 | ``` |
| 137 | |
| 138 | **IL patch 可靠性 > C# patch**:C# 重编译可能失败(缺引用、语法不对),IL 编辑几乎不会失真。详见 `references |