第 12 章 .NET / C# 逆向
.NET 是逆向"福利局":IL 字节码 + 完整元数据(类、方法、字段、字符串全部保留),反编译基本等于还原源码。难点在混淆(ConfuserEx 等)和 NativeAOT(编译成原生代码,没 IL 了)。
📍 知识点地图 | 主题:.NET逆向 | 前置:第3章 | 后续:— | 核心概念:dnSpy、IL、de4dot、混淆
12.1 判断是否 .NET
不是看文件后缀,而是看 PE 头有没有 CLR 头(COM Descriptor)
工具: Detect It Easy (DIE) / pefile / dnSpy 打开试试
特征字符串: mscoree.dll、_CorExeMain、.NET Framework/System.Runtime
12.2 工具链
| 工具 | 用途 |
|---|---|
| dnSpyEx | 反编译 + 调试 + 编辑(首选) |
| ILSpy / dotpeek | 反编译 |
| de4dot | 自动脱混淆(ConfuserEx/SmartAssembly/Babel/Eazfuscator) |
| monodis / ildasm | 命令行 IL 查看 |
| ilspycmd | 命令行反编译 |
12.3 标准工作流
1. 识别: DIE / dnSpy 打开 → 确认托管程序
2. 反编译: dnSpy 直接看伪代码(比 IDA 还原度高一万倍)
3. 找入口: Main / Program.cs 对应方法
4. 混淆检测: 方法名乱码 / 控制流异常 → de4dot 脱混淆
5. 深度还原: 命名还原 + 字符串解密(de4dot --strtyp)
6. 需要改逻辑: dnSpy 直接编辑 IL(右键 Edit IL Instructions)
7. 另存为新程序集
12.4 常见混淆与应对
| 混淆 | 特征 | 应对 |
|---|---|---|
| ConfuserEx | ConfusedByAttribute、乱码命名、控制流混淆 |
de4dot 一键 |
| SmartAssembly | 字符串加密 + 控制流 | de4dot |
| Babel | 类名数字+方法重命名 | de4dot |
| Eazfuscator | 命名混淆 + 字符串加密 | de4dot |
| 自定义混淆 | 无已知特征 | 手动:dnSpy 逐方法还原 |
de4dot 常用:
de4dot input.dll # 自动检测+脱混淆
de4dot input.dll -strtyp emulate # 字符串解密(模拟执行)
de4dot input.dll -p confuserex # 指定混淆器
12.5 .NET 逆向典型任务
□ 破解/注册码: 找 License/Key 验证方法(通常字符串比对或算法验证)
□ 找硬编码密钥: dnSpy 搜索字符串/资源(加密内容常直接可见)
□ 修改逻辑: Edit IL 改分支/返回值
□ 红队工具分析: Sharp* 系列(Rubeus/SharpHound)→ 反编译直接看源码
□ 恶意 .NET loader: 分析嵌套加载、反射调用、字符串加密
12.6 NativeAOT / 混合编译
NativeAOT 把 .NET 编译成原生二进制——没有 IL 元数据,dnSpy 无用。
识别:DIE 看不是纯托管;二进制里有 .NET 运行时特征字符串。
应对:
按原生二进制处理 → IDA / Ghidra / radare2
难度陡增:函数名可能保留(AOT 保留部分元数据)
12.7 实战:两阶段 XOR + AES 解码模式(Codegate 案例)
模式: 先 XOR 解码 → 再 Base64 → 再 AES-256-CBC(key==iv)
识别: dnSpy 里看到 Convert.FromBase64String + RijndaelManaged/Aes
复现: 用同一套参数在 Python/openssl 里重放
动手练习
- 找一个开源 .NET 程序(或自己编译一个带注册码验证的),用 dnSpy 还原完整逻辑。
- 用 ConfuserEx 混淆一个小程序,再用 de4dot 脱混淆,对比还原度。
- 用 dnSpy 的 Edit IL 改一个条件分支(if → 恒真),另存后运行验证。
- 分析一个 Sharp* 红队工具(GitHub 有源码版,对照反编译结果)。
深入阅读
- 仓库:
skills/dotnet-reverse/SKILL.md(.NET 逆向作业规范) - 仓库:
skills/dotnet-reverse/references/common-workflow.md(通用工作流) - 仓库:
skills/dotnet-reverse/references/obfuscators.md(混淆器对比与应对) - 仓库:
skills/dotnet-reverse/references/sharp-tools.md(Sharp* 工具分析) - 仓库:
skills/reverse-engineering/tools.md(.NET 章节:NativeAOT、XOR+AES 模式)