逆向工程实战手册 第 12 章

第 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 里重放

动手练习

  1. 找一个开源 .NET 程序(或自己编译一个带注册码验证的),用 dnSpy 还原完整逻辑。
  2. 用 ConfuserEx 混淆一个小程序,再用 de4dot 脱混淆,对比还原度。
  3. 用 dnSpy 的 Edit IL 改一个条件分支(if → 恒真),另存后运行验证。
  4. 分析一个 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 模式)