reverse-skills-max: initial public release (restored, redacted, hardened)

This commit is contained in:
baradok609hecl1pq6qi
2026-10-20 02:17:15 +03:00
commit da24c2bd20
2227 changed files with 443931 additions and 0 deletions

View File

@@ -0,0 +1,192 @@
---
name: dotnet-reverse
description: .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。不用于纯 native 二进制(走 reverse-engineering / ida-reverse)。
license: MIT
compatibility: Requires a filesystem-based code agent or CLI with shell access, Windows host preferred (dnSpyEx 是 Windows GUI);Linux/macOS 可用 ILSpy/de4dot CLI + mono/dotnet runtime。
allowed-tools: Bash Read Write Edit Glob Grep Task WebFetch WebSearch
metadata:
user-invocable: "false"
---
# .NET / C# 逆向作业规范
## ACTION REQUIRED(读完立刻执行)
1. `NOW`: 用 DIE/`file`/CLR 头确认目标是 .NET 托管(否则 SWITCH 到 `ida-reverse/` / `reverse-engineering/`)
2. `NOW`: 若疑似混淆 → 先 `de4dot` 脱壳,产出 `*-clean.exe`,保留原始样本
3. `NEXT`: dnSpyEx(或 dnSpy MCP / `ilspycmd`)静态:C# 浏览 + **IL 视图**看关键判断
4. `ACT`: 需要明文/C2 时动态调试;需要改逻辑时 **IL patch** 优先于 C# 重编译
5. 阶段结束给用户 3–6 项下一步菜单(含导出报告)
## 适用范围
当任务属于以下场景时优先使用本 skill:
- 识别并逆向 .NET / C# 编译产物(托管 PE / .exe / .dll)
- 分析红队 Sharp* 工具链(Rubeus、SharpHound、SharpShell 等)
- 脱混淆 ConfuserEx / SmartAssembly / Babel / Eazfuscator / .NET Reactor 等壳
- 逆向 .NET loader / info-stealer / RAT 的解密与 C2 逻辑
- 对 C# 程序做 patch(改判断、改常量、keygen)
- 分析 IL2CPP 之前的 Mono/Unity 托管层(注意:IL2CPP 编译后是 native,走 `reverse-engineering/` + seed-014)
如果目标是纯 native 二进制(C/C++/Go/Rust 编译、无 CLR),请改用 `reverse-engineering/`、`ida-reverse/` 或 `radare2/`。
## 核心原则
- **先识别再下手**:先确认是 .NET 托管程序(PE 头 CLR + `#~` / `#Strings` 流 + mscoree `_CorExeMain`),再决定走 dnSpy 而非 IDA
- **IL 优先于 C#**:dnSpyEx 的 C# 反编译器会丢失/扭曲信息(编译器生成的状态机、async/await、yield),关键判断与 patch 必须切到 **IL 编辑器**,C# 视图只用于快速浏览
- **de4dot 先行**:遇到混淆器先 `de4dot` 脱一轮再做静态分析,否则字符串/控制流全是乱的
- **MCP 联动**:环境里若注册了 dnSpy MCP(`dnspy_*` 工具),优先走 MCP 面做 decompile / IL inspection,避免来回切 GUI
- **证据化输出**:脱混淆产物、提取的配置/C2/key、patch diff 都要落盘
## 工具链映射
| 能力 | 首选 | 备注 |
|------|------|------|
| 反编译 + 调试 + patch | **dnSpyEx** | 王牌,唯一带 IL 编辑器的 GUI;老 dnSpy 已停更,用 Ex 分支 |
| 轻量 CLI / headless 反编译 | **ILSpy** (`ilspycmd`) | 适合批量、脚本化、Linux/macOS |
| 脱混淆 | **de4dot** | ConfuserEx 全家桶、SmartAssembly 等主流壳的默认解 |
| 混淆器识别 | **Detect It Easy (DIE)** / **file** | 先判断壳类型再决定 de4dot 参数 |
| 编程化操作 IL | **dnlib** | 写 C# 脚本批量改 metadata / 字符串解密器 |
| AI 直接操作 | **dnSpy MCP** | `dnspy_decompile` / `dnspy_inspect_il` 等工具面 |
> 前置:Windows 主机装 dnSpyEx + de4dot(choco 或 release);Linux/macOS 用 `ilspycmd` + `dotnet runtime`。详见 `references/sharp-tools.md` 的安装矩阵。
## 六阶段工作流
### 1. Identify(识别 .NET)
确认目标是托管程序,别把 native PE 当 .NET 分析:
```powershell
# Windows
file target.exe # "PE32 executable ... for MS Windows" 不够
# 关键:看有没有 CLR
powershell -c "[System.Reflection.AssemblyName]::GetAssemblyName('target.exe')"
# 或
dnSpyEx 直接拖进去 —— 能打开就是托管
# 通用
strings target.exe | grep -iE "mscoree|_CorExeMain|mscorlib|System\\."
```
**.NET 识别标志:**
- PE 头 `Data Directory[14]` (CLR Runtime Header) 非零
- `mscoree.dll` 导入 / `_CorExeMain` 入口
- `#~`、`#Strings`、`#US`、`#GUID`、`#Blob` metadata 流
- `mscorlib` / `System.Private.CoreLib` 字符串
**NativeAOT 例外:** 编译成 native,没有 CLR 头,但有 `System.Private.CoreLib` 字符串和重构过的类型元数据 —— 这类走 `reverse-engineering/`(IDA/r2),本 skill 仅做识别提示。
### 2. Detect(检测混淆器)
```powershell
# DIE 快速识别
diec target.exe # Detect It Easy CLI
# 或拖进 dnSpyEx,看是否大量乱码类名 / 控制流变形
```
常见混淆器 → 脱壳策略(详见 `references/obfuscators.md`):
| 混淆器 | 特征 | de4dot 处理 |
|--------|------|------------|
| ConfuserEx (1.0.0 / 2.x) | `<module>` anti-tamper、控制流变形、字符串加密 | `de4dot target.exe` 通常自动识别 |
| SmartAssembly | `circular`/`string encoding`、资源压缩 | `de4dot target.exe` |
| Babel.NET | 方法体加密、控制流 | `de4dot target.exe` |
| Eazfuscator.NET | 字符串/资源加密 | `de4dot`,部分版本需手动 |
| .NET Reactor | anti-tamper + necrobit | `de4dot`,新版可能失败需手动 |
### 3. Deobfuscate(脱混淆)
```powershell
# de4dot 默认自动识别大多数壳
de4dot target.exe -o target-clean.exe
# 指定类型(自动识别失败时)
de4dot --type cfze target.exe # ConfuserEx
de4dot --type sa target.exe # SmartAssembly
# 多层混淆 / de4dot 报 unknown
de4dot --detect target.exe # 看它识别成什么
# 可能要先 patch anti-tamper 再 de4dot(见 references/obfuscators.md)
```
产出:`target-clean.exe`,后续分析用它。**保留原始样本**做对照。
### 4. Static Analyze(静态分析)
dnSpyEx 加载脱壳后样本:
- **C# 视图**:快速浏览类结构、方法签名、字符串(用于定位)
- **IL 视图**:关键判断、加密逻辑、状态机必须看 IL(右键 → Edit IL 或 IL 视图)
- 找入口:`Main` / `Startup` / 模块初始化器 (`Module .cctor`)
- 找关键逻辑:搜 `flag`、`password`、`verify`、`check`、`encrypt`、`http`、`Config`
```text
定位字符串 → 反向引用 → 找到使用它的方法 → IL 视图看判断逻辑
```
### 5. Dynamic(动态调试)
dnSpyEx 调试器:附加进程 / 启动调试,在关键方法下断点,观察运行时:
- 解密后的明文字符串(很多混淆器的字符串在运行时才解密)
- C2 地址、配置解密结果
- 异常驱动的控制流(anti-debug 常用 `try/catch` 隐藏真实路径)
> .NET 动态调试比 native 友好得多 —— 能直接看到对象值、字符串内容。优先动态而非死磕静态。
### 6. Patch(按需修改)
```text
dnSpyEx → 右键方法 → Edit Method (C#) 或 Edit IL
- 改判断:ldc.i4.0 → ldc.i4.1(false→true)
- 改常量:直接编辑字符串/数字
- 删除校验:nop 掉整段
File → Save Module → 替换原文件
```
**IL patch 可靠性 > C# patch**:C# 重编译可能失败(缺引用、语法不对),IL 编辑几乎不会失真。详见 `references/common-workflow.md`。
## 触发场景路由
用户说这些时进入本 skill:
- ".NET / C# 二进制逆向" / "C# 程序反编译"
- "dnSpy 分析" / "dnSpyEx patch"
- "ConfuserEx / SmartAssembly / Babel 脱混淆 / 脱壳"
- "Sharp* 工具分析"(Rubeus / SharpHound / SharpShell)
- ".NET malware / loader / info-stealer 逆向"
- "C# 程序 patch / keygen / 修改判断"
## 何时切出
- IL2CPP 编译的 Unity 游戏 → `reverse-engineering/` + `seed-014_unity-il2cpp-reverse.md`(IL2CPP 是 native,不走 dnSpy)
- NativeAOT 产物 → `reverse-engineering/`(同上,native)
- 纯 native PE(无 CLR)→ `reverse-engineering/` / `ida-reverse/`
- 需要符号/函数批量迁移到别的版本 → `binary-diff/`
- 需要画攻击路径 / 调用链图 → `diagram-generator/`
## 路由上下文
**上游入口**: `skills/SKILL.md`(总控)、`routing.md`
**下游出口**:
- IL2CPP / NativeAOT(native)→ `reverse-engineering/`
- 深度 native .so/.dll 段分析 → `ida-reverse/` / `radare2/`
- 需要 AI 直接操作 dnSpy → 注册并联动 dnSpy MCP(见 `references/sharp-tools.md`)
**同级关联模块**:
- `reverse-engineering/languages-compiled.md`(.NET 简介指向本模块)
- `apk-reverse/`(Xamarin/MAUI Android 逆向可切回本模块看 C# 层)
## 参考文档
- [references/obfuscators.md](references/obfuscators.md) — ConfuserEx / SmartAssembly / Babel / Eazfuscator / .NET Reactor 脱混淆详解 + anti-tamper 绕过
- [references/common-workflow.md](references/common-workflow.md) — 完整工作流、IL patch 可靠性、字符串解密器提取、状态机识别
- [references/sharp-tools.md](references/sharp-tools.md) — 红队 Sharp* 工具分析、工具安装矩阵、dnSpy MCP 集成、社区资源索引
## 任务完成自检
- [ ] 是否确认过 CLR / 托管身份(或已 SWITCH 出本 skill)?
- [ ] 混淆样本是否先 de4dot / 等价脱壳再深分析?
- [ ] 关键逻辑是否用 IL 视图验证(而非只看 C# 伪代码)?
- [ ] 产物(clean 样本 / 配置 / patch diff)是否落盘且可复现?
- [ ] 是否提供了下一步菜单或报告出口?

View File

@@ -0,0 +1,171 @@
# .NET 逆向通用工作流
完整工作流细节、IL patch 可靠性、字符串解密器提取、状态机识别、dnlib 脚本化。
## 完整工作流(端到端)
```text
1. Identify → 确认是 .NET 托管程序(不是 native)
2. Detect → DIE / de4dot --detect 识别混淆器
3. Deobf → de4dot 脱混淆(保留原样本)
4. Static → dnSpyEx 浏览 C# 视图定位,IL 视图看关键逻辑
5. Dynamic → dnSpyEx 调试器在关键方法下断,看运行时明文
6. Patch → IL 编辑器修改,Save Module
```
每一步的产物要落盘:原样本 `target.exe` → 脱壳 `target-clean.exe` → patch 后 `target-patched.exe`。
## IL patch vs C# patch 可靠性
**核心结论:关键修改用 IL 编辑器,不要用 C# 编辑器。**
| 维度 | C# 编辑器 (Edit Method C#) | IL 编辑器 (Edit IL) |
|------|---------------------------|---------------------|
| 编译失败风险 | 高(缺引用、语法、lambda 重写失败)| 几乎为零 |
| 信息保真 | 编译器重新生成 IL,可能与原 IL 不同 | 原样替换,逐指令改 |
| 适用 | 改个字符串、改个常量、简单逻辑 | 改判断、删校验、改控制流 |
| async/await/状态机 | 经常编译失败或扭曲 | 直接改状态机字段,可靠 |
dnSpyEx 的 C# 反编译器是基于只读反编译 + 尝试重编译,对编译器生成的代码(状态机、闭包、`yield`)重编译极易失败。IL 编辑器是逐指令编辑,所见即所得。
### 典型 IL patch 模式
```text
改判断(if (check) → 永远 true):
原: call bool Foo::Check()
brfalse.s SKIP
改: ldc.i4.1 ; push true
brfalse.s SKIP ; 现在永远不跳,SKIP 不执行
或更直接:
ldc.i4.1
ret ; 方法直接返回 true
改判断(if (check) → 永远 false):
ldc.i4.0
ret
删整段校验:
全部 nop,或改成 ret + 正确返回值
改字符串常量:
C# 编辑器改字符串通常 OK(ldstr 直接换 token),但若字符串在资源/加密里则要改解密逻辑
改数字常量:
ldarg / ldc 指令直接改操作数
```
## 状态机识别(async/await / yield)
C# 的 `async/await` 和 `IEnumerator` yield 编译成**状态机**:编译器生成一个嵌套类,`MoveNext()` 里用 `state` 字段做 switch dispatch。dnSpyEx C# 视图会还原成 async,但反编译可能失真,IL 视图看 `MoveNext` 最准。
```text
async/await 的 MoveNext 结构:
switch(this.<>1__state) {
case 0: ... await 前的逻辑; this.<>1__state = 1; await MoveNext;
case 1: ... await 后的逻辑;
}
要 patch async 逻辑:改 MoveNext 里的 state 转移或具体 case 里的判断。
C# 编辑器改 async 几乎必失败 → 必须用 IL。
```
## 字符串解密器提取
详见 `obfuscators.md`。这里补充 dnlib 脚本化批量解字符串:
```csharp
// dnlib 脚本:扫描所有字符串解密器调用,运行时还原后写回
// 用法:dotnet script decrypt.csproj target.exe 0x06000012
using System;
using System.Reflection;
using dnlib.DotNet;
using dnlib.DotNet.Writer;
using dnlib.DotNet.Emit;
var module = ModuleDefMD.Load(args[0]);
var decryptorToken = uint.Parse(args[1], System.Globalization.NumberStyles.HexNumber);
// 找到解密方法,用反射调用它(需把 assembly 加载进 AppDomain)
// 遍历所有方法,把 call Decryptor(token) 替换成 ldstr "解密结果"
foreach (var type in module.GetTypes())
foreach (var method in type.Methods)
{
if (!method.HasBody) continue;
var instrs = method.Body.Instructions;
for (int i = 0; i < instrs.Count; i++)
{
// 识别 call 解密器模式,调用解密器拿明文,替换为 ldstr
// (此处省略反射调用解密器的样板,思路:加载原 assembly →
// MethodInfo.Invoke 拿明文 → instrs[i] = OpCodes.Ldstr + operand=明文)
}
}
var opts = new ModuleWriterOptions(module);
module.Write("target-decrypted.exe", opts);
```
dnlib 是 .NET 元数据编程的事实标准,de4dot 内部就是用它。写自定义脱混淆脚本时首选。
## 动态调试要点
dnSpyEx 调试器对 .NET 程序比 native 友好得多:
- **断点在方法入口**:右键方法 → Add Breakpoint
- **看对象值**:断住后 Locals / Watch 窗口直接看对象字段、字符串内容
- **内存写入**:可以直接改运行时变量值(Edit Value)
- **异常断点**:Debug → Exceptions,勾选要断的异常类型 —— 混淆器常用异常驱动控制流,断异常能看到真实路径
### 异常驱动控制流
部分混淆器把正常逻辑塞进 `try`,用 `throw` + `catch` 做跳转。静态看 IL 像异常处理,实际是控制流:
```text
try { throw new CustomException(0x42); }
catch (CustomException e) {
switch(e.Code) {
case 0x42: 真实逻辑A; break;
case 0x43: 真实逻辑B; break;
}
}
```
下异常断点(断 `CustomException`),跟踪 `Code` 值流转,比硬啃 IL 快。
## 模块初始化器(Module .cctor)
`.NET` 模块的静态构造函数(`<module>` 的 `.cctor`)在 assembly 加载时最先执行,混淆器常把 anti-tamper / 解密初始化放这里。分析顺序:
```text
1. 先看 <module>.cctor(Module .cctor)—— 解密/反调试初始化
2. 再看 Program.Main / Startup
3. anti-tamper 在 .cctor 里 → 先 patch .cctor 再脱壳
```
## 提取配置 / C2 / Key 的通用模式
红队工具和 loader 常把配置加密嵌在资源或字段里,运行时解密:
```text
定位流程:
1. strings 看有无明文 URL/IP(混淆后通常没有)
2. 找 byte[] 字段 + 解密方法(AES/XOR)
3. 动态断在解密方法的返回点,dump 解密后的明文
4. 常见:AES-256-CBC with Key==IV(Codegate 2013 模式,见 reverse-engineering/tools.md .NET 段)
```
参考 `references/sharp-tools.md` 里红队工具的具体配置结构。
## 与 reverse-engineering 的边界
- **IL2CPP / NativeAOT** → 编译成 native,没有 CLR 元数据 → 走 `reverse-engineering/`(IDA/r2),本 skill 仅做识别
- **托管 .NET**(标准 C# exe/dll、Mono/Unity 托管层、Xamarin)→ 本 skill
- **混合(native loader + .NET payload)** → loader 部分走 `reverse-engineering/`,dump 出 .NET payload 后切本 skill
## 落盘产物清单
每次 .NET 逆向任务建议产出:
- `target-original.exe`(原样本,不动)
- `target-clean.exe`(de4dot 脱壳后)
- `notes.md`(识别的混淆器、解密器 token、关键方法地址、配置/C2/key)
- `target-patched.exe`(patch 后,如需要)
- `il-diff.txt`(patch 前后 IL 对照,如做 patch)

View File

@@ -0,0 +1,145 @@
# .NET 混淆器脱混淆详解
主流 .NET 混淆器的识别、脱壳、anti-tamper 绕过。核心工具:**de4dot**(自动识别大多数壳)+ **dnSpyEx**(手动 patch)+ **dnlib**(脚本化)。
## 总决策表
| 混淆器 | de4dot type | 典型特征 | 自动脱壳 | 手动要点 |
|--------|-------------|---------|---------|---------|
| ConfuserEx 1.x/2.x | `cfze` | anti-tamper、控制流变形、字符串加密、反调试 | ✅ 多数自动 | 新版需先 patch anti-tamper |
| ConfuserEx 3.x / 私改 | `cfze` | 同上 + 自定义 protector | ⚠️ 部分 | dump 运行时 / dnlib |
| SmartAssembly | `sa` | 字符串编码、资源压缩、方法调用隐藏 | ✅ 自动 | 资源解压 |
| Babel.NET | `babel` | 方法体加密、控制流、字符串 | ✅ 自动 | — |
| Eazfuscator.NET | `eaz` | 字符串/资源加密、表达式混淆 | ⚠️ 部分 | 字符串解密器 |
| .NET Reactor | `reactor` | necrobit (代码段加密) + anti-tamper | ⚠️ 新版难 | dump + 重建 metadata |
| Themida .NET | — | 外壳 + 虚拟化 | ❌ de4dot 不行 | dump 内存,走 native 思路 |
| Agile.NET / CliSecure | `agile` | 方法体加密 | ✅ 自动 | — |
## de4dot 标准用法
```powershell
# 自动识别(多数情况够用)
de4dot target.exe -o target-clean.exe
# 显式指定 type(自动识别失败)
de4dot --type cfze target.exe -o target-clean.exe
# 先探测壳类型
de4dot --detect target.exe
# 批量
de4dot *.exe
# 只解字符串,不动控制流(最小干预)
de4dot --strtyp delegate --strtok METHOD_TOKEN target.exe
```
de4dot 的 `--strtyp` / `strtok` 模式:只解字符串解密器(指定解密方法 token),保留原控制流。适合"只想看明文字符串但不想碰 anti-tamper"的场景。
---
## ConfuserEx(最常见)
### 特征识别
- 入口模块 `<module>` 类带 `[MethodImpl(NoInlining)]` 的 anti-tamper 检查
- 大量 `Dictionary<string, T>` 的字符串解密器调用
- 控制流平坦化(switch dispatch + state 变量)
- 资源里嵌 `.cmp` 压缩资源
- dnSpyEx C# 视图:类名/方法名乱码(`\uXXXX` 或无意义字符),方法体里满屏 `int num = ...; switch(num)`
### 脱壳流程
```powershell
# 1. 标准脱壳
de4dot target.exe -o target-clean.exe
# 2. 如果 de4dot 报 "unknown" 或脱壳后打不开 → 新版/私改 ConfuserEx
# 先确认 anti-tamper:
dnSpyEx 打开 → 找 Module .cctor 或 Main 里的完整性校验
```
### anti-tamper 绕过(新版 ConfuserEx 常见)
ConfuserEx 的 `anti tamper` 会在运行时校验方法体哈希,被改就崩。de4dot 通常能处理旧版,新版需手动:
```text
方法 A — dnSpyEx 直接 patch 校验函数:
1. 找 anti-tamper 校验方法(通常在 <module> 的静态构造里调用)
2. IL 编辑:把校验方法体改成 ret(直接返回)
3. 保存 → 再喂给 de4dot
方法 B — 运行时 dump:
1. 用 MegaDumper / ExtremeDumper 跑起来 dump 内存中的 assembly
2. dump 出来的已经解密,再用 de4dot 清理残留
```
### 控制流还原后
de4dot 会把平坦化的 switch dispatch 还原成正常 if/while。如果没完全还原(看到残留 state 机),可再跑一次 de4dot 或手动跟 IL。
---
## SmartAssembly
```powershell
de4dot --type sa target.exe -o target-clean.exe
```
特征:
- 字符串用 `SmartAssembly.Runtime.Strong` 系列编码
- 资源压缩(`{assembly}.Resources`)
- 方法调用隐藏(`ProcessCaller` / 间接 call)
de4dot 对 SmartAssembly 兼容性最好,基本一键搞定。
---
## .NET Reactor(necrobit)
`.NET Reactor` 的 **necrobit** 把真实方法体加密存到资源,运行时解密注入,原方法体是空壳。de4dot 对老版本有效,新版本(4.x+)常失败。
```text
当 de4dot 失败时:
1. 让程序跑起来(dotnet target.exe 或直接双击)
2. MegaDumper / ExtremeDumper dump 进程内存 → 导出解密后的 assembly
3. 用 de4dot 清理 dump 产物的残留混淆
4. 如果 metadata 损坏,用 dnlib 重建(见 common-workflow.md)
```
---
## 字符串解密器手动提取
混淆器把字符串加密,运行时调用解密方法还原。de4dot 多数能自动识别解密器,识别失败时手动:
```text
1. dnSpyEx 找到解密方法(通常签名固定:static string Decrypt(int) 或 Decrypt(string, int))
- 特征:被大量调用、参数是数字常量、返回 string
2. 记下方法 token(如 0x06000012)
3. de4dot 指定解密器:
de4dot --strtyp delegate --strtok 0x06000012 target.exe -o target-clean.exe
```
如果连解密方法本身也被混淆(控制流平坦化),需要先脱控制流再定位解密器。
## anti-debug 常见手法
| 手法 | 位置 | 绕过 |
|------|------|------|
| `Debugger.IsAttached` 检查 | 任意方法 | IL 改 `ldc.i4.0; ret` 或 patch getter |
| `Debugger.IsLogging` | — | 同上 |
| 时间检测 (`DateTime.Now` 差值) | 方法入口 | patch 掉差值比较 |
| `CheckRemoteDebuggerPresent` P/Invoke | — | nop 掉调用 |
| 异常驱动控制流(try/catch 路径选择)| 主逻辑 | 不能简单 nop,要分析 catch 块真实路径 |
> .NET anti-debug 比 native 简单 —— 多数是托管 API 调用,dnSpyEx IL 改一行即可。
## de4dot 失败时的退路
1. **de4dot --detect** 看识别结果,对照上表
2. **运行时 dump**(MegaDumper / ExtremeDumper / Process Hacker 导出模块)
3. **dnlib 脚本** 手动解(见 common-workflow.md 的 dnlib 段)
4. **动态优先**:跑起来在解密点下断,直接看明文,不脱壳也能拿情报
社区参考:Washi 博客《misconceptions-about-dotnet》(IL 分析的常见误区)、看雪 .NET 逆向版块、Guided Hacking《Top 5 .NET RE Tools》。

View File

@@ -0,0 +1,164 @@
# 红队 Sharp* 工具分析 & 工具安装矩阵 & dnSpy MCP
## 红队 Sharp* 工具分析
红队工具大量用 C# 写(Sharp* 系列),逆向它们是常见场景:理解检测逻辑、改特征、提取内嵌配置。
### 常见 Sharp* 工具速查
| 工具 | 功能 | 逆向关注点 |
|------|------|-----------|
| **Rubeus** | Kerberos 攻击(AS-REP roast / Kerberoast / S4U / pass-the-ticket)| Rubeus 工程结构固定,找 `Interop.*` P/Invoke 段看 native 调用 |
| **SharpHound** | BloodHound 数据采集器 | LDAP 查询逻辑、采集的属性集合 |
| **SharpShell / SharpWS** | 远程执行、横向 | WMI / WinRM 调用、命令混淆 |
| **Seatbelt** | 信息收集 | 收集项清单、判断逻辑 |
| **SharpRoast** | Kerberoasting | 票据请求/解析 |
| **Inveigh / SharpSploit** | 中间人 / 通用利用框架 | 反射加载、API 调用链 |
### 通用分析套路
```text
1. dnSpyEx 打开(通常没混淆,少数团队会加 ConfuserEx)
2. 看 Program.Main 或入口命令分发(Rubeus 是 switch(command) 结构)
3. 找目标命令的实现类/方法
4. 看 P/Invoke 段(Interop.* 命名空间)—— native API 调用在这里
5. 提取内嵌资源(有些工具嵌配置/模板)
6. 如需改特征(EDR 规避):改命令字符串、API 调用、字符串常量
```
### Rubeus 结构示例
Rubeus 用命令分派,每个子命令一个类。找 Kerberoasting 逻辑:
```text
入口: Rubeus.CommandLineParser → 解析 args
分派: switch(command) → "kerberoast" → 执行 Ask.TGS(...)
P/Invoke: Rubeus.Interop.Lsa* / Native.cs → native Kerberos API
关键: LsaCallAuthenticationPackage (KERB_RETRIEVE_TKT_REQUEST)
```
改特征(规避):把命令字符串 `"kerberoast"` 改成自定义名、把 `Rubeus` banner 字符串改掉、改 P/Invoke 调用顺序。
### 内嵌配置提取
很多 loader/工具把 C2、密钥、证书加密嵌在资源或字段:
```powershell
# dnSpyEx 里看 Resources(资源树)
# 或命令行
powershell -c "[System.Reflection.Assembly]::LoadFile('target.exe').GetManifestResourceNames()"
# 找到资源后 dnSpyEx 右键 → 提取 / Save
```
运行时解密的配置 → 动态断在解密方法返回点 dump 明文(见 `common-workflow.md`)。
---
## 工具安装矩阵
### Windows(首选,dnSpyEx 是 GUI)
```powershell
# 方式 A:Chocolatey
choco install dnspy ilspy de4dot detect-it-easy
# 方式 B:手动下载 release(推荐,版本可控)
# dnSpyEx: https://github.com/dnSpyEx/dnSpy/releases
# de4dot: https://github.com/de4dot/de4dot/releases
# ILSpy: https://github.com/icsharpcode/ILSpy/releases
# DIE: https://github.com/horsicq/Detect-It-Easy/releases
# dnlib: dotnet add package dnlib (NuGet)
```
### Linux / macOS(无 dnSpyEx GUI,用 CLI)
```bash
# ILSpy CLI 反编译
dotnet tool install -g ilspycmd
ilspycmd target.exe -p -o outdir/ # 反编译到目录
# de4dot 跨平台(需 mono 或 dotnet)
# 从 release 下载 de4dot 产物的 .dll,用 dotnet 跑
dotnet de4dot.dll target.exe -o target-clean.exe
# dnlib(脚本化,需 dotnet SDK)
dotnet new console -o dnclean && cd dnclean
dotnet add package dnlib
# DIE CLI (diec)
# Linux: 从 https://github.com/horsicq/Detect-It-Easy 装
diec target.exe
```
### .NET runtime 前置
```bash
# Linux
sudo apt install dotnet-runtime-8.0 # 或 6.0/7.0 看目标
# macOS
brew install --cask dotnet-sdk
```
> dnSpyEx(带 IL 编辑器 + 调试器)只有 Windows GUI 版。Linux/macOS 做 .NET 逆向只能用 `ilspycmd` 反编译 + `dnlib` 脚本 patch,没有等价的交互调试 GUI。需要 patch 时优先上 Windows。
---
## dnSpy MCP 集成
社区已有多个 dnSpy MCP 项目,把 dnSpy 的反编译/IL 检查暴露成 MCP 工具,AI 可直接调用 —— 和 reverse-skill 的 MCP 哲学完全一致。
### 主流 dnSpy MCP 项目
| 项目 | 特点 | 适配 |
|------|------|------|
| **soufianetahiri/dnspy-mcp** | 核心 MCP Server,暴露 decompile、IL inspection 等工具 | Claude Code / Cursor |
| **AgentSmithers/DnSpy-MCPserver-Extension** | 作为 dnSpyEx 扩展运行,深度集成 GUI | dnSpyEx 内加载 |
| **malwarecakefactory/dnspy-mcp-extension** | 33 个工具,覆盖 triage → deobfuscation 全流程 | 全流程自动化 |
### 注册到 Claude MCP 配置
按对应项目 README 装 dnSpyEx 扩展后,在 `~/.claude/mcp.json` 注册(具体 command/args 以项目 README 为准):
```json
{
"mcpServers": {
"dnspy": {
"command": "dotnet",
"args": ["path/to/dnspy-mcp.dll"]
}
}
}
```
注册后本 skill 的 AI 联动路径:用户说"分析这个 .NET"→ 路由到 `dotnet-reverse/` → 优先调 `dnspy_decompile` / `dnspy_inspect_il` 工具面 → 不行再切 GUI。
> dnSpy MCP 不是 reverse-skill 内置 bootstrap 能力,需用户手动按项目 README 安装扩展并注册。后续可考虑加进 `bootstrap-manifest.json`。
---
## 社区资源索引
### 强烈推荐
- **Washi 博客** — .NET 逆向大佬:https://blog.washi.dev/posts/misconceptions-about-dotnet/
- 核心观点:**不要过度依赖 dnSpy 的 C# 反编译器,要熟悉 IL 编辑器**(与本项目 IL 优先原则一致)
- **dnSpyEx** — dnSpy 的活跃维护分支:https://github.com/dnSpyEx/dnSpy
- **de4dot** — .NET 脱混淆:https://github.com/de4dot/de4dot
- **dnlib** — 元数据编程:https://github.com/dnlib/dnlib
### 实战教程
- Medium《De-obfuscating and reversing a .NET/C# spyware》— dnSpy + de4dot 实战 info-stealer 脱混淆
- YouTube《dnSpy Patch .NET EXEs & DLLs》— 手把手 patch + keygen
- 看雪论坛 .NET 逆向版块 — 搜 ".net 逆向" / "dnSpy" / "ConfuserEx" 有大量实战帖、Nuitka 逆向、免杀讨论
- Guided Hacking《Top 5 .NET Reverse Engineering Tools》— dnSpy 仍排第一
- StackExchange / Reverse Engineering — `DynamicMethod` 调试等进阶问题
### 本仓库已有 .NET 资源(联动)
- `reverse-engineering/tools.md` `.NET Analysis` 段 — dnSpy/ILSpy 工具速查 + Codegate 2013 两阶段 XOR+AES-CBC 模式
- `reverse-engineering/field-notes.md` `.NET` 段 — 工具速记
- `reverse-engineering/awesome-re-resources.md` — de4dot 入选
- `field-journal/seed-014_unity-il2cpp-reverse.md` — Unity IL2CPP(native 侧,与 .NET 托管层互补)
.NET 逆向深度内容统一收敛到本模块,`reverse-engineering/` 里保留速查索引即可。