dnSpy
2026/5/29工具工具逆向工程dotNETdnSpy大约 4 分钟
dnSpy
链接
是什么
dnSpy 是 .NET 反编译和调试工具,可以查看 C# 代码、IL 指令、资源,并对 .NET 程序进行调试和修改。
虽然原项目已归档,CTF 中仍常见 dnSpy 或 dnSpyEx。
安装与配置
Windows 下使用最方便。可下载 dnSpyEx 或可信发布包:
https://github.com/dnSpyEx/dnSpy下载后解压运行 dnSpy.exe。
基本用法
打开程序
File -> Open -> 选择 exe/dll搜索字符串
Ctrl+Shift+F搜索:
flag
password
check
verify
correct
wrong查看入口点
定位 Main 函数,追踪输入校验逻辑。
调试
Debug -> Start Debugging可下断点、查看变量、单步执行。
更多功能
反编译功能
C# 反编译:
- 显示接近原始的 C# 代码
- 支持泛型、Lambda、LINQ
- 显示注释和文档
IL 代码:
- 显示中间语言指令
- 可以直接编辑 IL
- 支持 IL 级别调试代码导航
Ctrl+Click: 跳转到定义
Alt+Left: 返回
Alt+Right: 前进
Ctrl+G: 跳转到地址
F12: 跳转到定义
Shift+F12: 查找引用搜索功能
Ctrl+Shift+F: 全局搜索字符串
Ctrl+F: 当前文件搜索
Ctrl+T: 搜索类型
Ctrl+Shift+T: 搜索成员编辑功能
编辑类:
- 右键类 -> Edit Class
- 修改 C# 代码
- 重新编译
编辑方法:
- 右键方法 -> Edit Method
- 修改方法实现
- 重新编译
编辑 IL:
- 右键方法 -> Edit IL Instructions
- 直接修改 IL 代码资源查看
Resources 节点:
- 图片资源
- 字符串资源
- 配置文件
- 嵌入文件程序集信息
Assembly 节点:
- 版本信息
- 引用的程序集
- 自定义属性
- 强名称调试功能
断点:
- F9: 切换断点
- 条件断点
- 命中次数断点
单步执行:
- F10: 单步跳过
- F11: 单步进入
- Shift+F11: 单步跳出
查看变量:
- 鼠标悬停
- Locals 窗口
- Watch 窗口
- Immediate 窗口CTF常用技巧
.NET 常有高层逻辑
相比原生程序,.NET 通常保留较多元数据,优先从函数名、类名、字符串入手。
修改分支
练习时可以修改 IL 或 C#,但正式 WP 应说明原始逻辑,而不是只写"改成 true"。
注意混淆
如果类名函数名很乱,先找字符串和调用关系。
分析流程
1. 打开程序
2. 查看入口点 (Main)
3. 搜索关键字符串
4. 追踪函数调用
5. 分析校验逻辑
6. 理解算法
7. 编写解密脚本反混淆
1. 搜索字符串定位关键代码
2. 查看调用关系
3. 分析方法参数和返回值
4. 使用 de4dot 等工具
5. 手动重命名类和方法资源提取
1. 展开 Resources 节点
2. 右键资源 -> Save
3. 分析提取的文件
4. 检查是否有隐藏数据IL 修改
1. 右键方法 -> Edit IL Instructions
2. 修改条件跳转
3. 修改返回值
4. 保存并测试de4dot 反混淆
安装
# 从 GitHub 下载
# https://github.com/de4dot/de4dot使用
# 基本使用
de4dot obfuscated.exe
# 指定输出
de4dot obfuscated.exe -o clean.exe
# 指定混淆器
de4dot obfuscated.exe -p dotfuscator常见混淆器
Dotfuscator
SmartAssembly
ConfuserEx
.NET Reactor
Eazfuscator.NET
Babel.NET
CliSecure常见问题
打不开程序
确认是不是 .NET 程序。先用 file、Detect It Easy 或 PE 工具判断。
代码显示异常
可能被混淆或使用了新版 .NET 特性。换 dnSpyEx、ILSpy 或 JetBrains dotPeek 试试。
调试失败
检查运行时版本、程序位数和依赖文件是否完整。
版本问题
.NET Framework:
- 需要对应的 .NET Framework 版本
- 通常向下兼容
.NET Core/.NET 5+:
- 需要对应的运行时
- 可能需要特定版本 dnSpy无法编辑
1. 检查程序是否签名
2. 检查是否有只读属性
3. 使用管理员权限运行
4. 复制一份再编辑混淆太严重
1. 使用 de4dot 自动反混淆
2. 手动分析关键函数
3. 使用动态调试
4. 关注字符串和常量关联
- DotNET逆向基础
- 字符串、交叉引用与控制流
- 动态调试基础
- Detect It Easy