| name | reverse-engineering-dotnet-malware-with-dnspy |
| description | 使用 dnSpy 反编译器和调试器对 .NET 恶意软件进行逆向工程,分析 C#/VB.NET 源代码,识别混淆技术,提取配置信息,理解包括信息窃取器、远程访问木马(RAT)和加载器在内的恶意功能。适用于 .NET 恶意软件分析、C# 恶意软件反编译、托管代码逆向工程或 .NET 混淆分析等请求。
|
| domain | cybersecurity |
| subdomain | malware-analysis |
| tags | ["malware","dotnet","reverse-engineering","dnSpy","decompilation"] |
| version | 1.0.0 |
| author | mahipal |
| license | Apache-2.0 |
使用 dnSpy 对 .NET 恶意软件进行逆向工程
适用场景
- 恶意软件样本被识别为 .NET 程序集(C#、VB.NET、F#)且需要反编译时
- 分析基于 .NET 的恶意软件家族(AgentTesla、AsyncRAT、RedLine Stealer、Quasar RAT)时
- 对使用 ConfuserEx、SmartAssembly 或自定义混淆器保护的 .NET 代码进行反混淆时
- 从托管程序集中提取硬编码的 C2 配置、加密密钥和凭证时
- 运行时调试 .NET 恶意软件以观察解密例程和动态行为时
请勿使用:分析原生(非托管)PE 二进制文件;请改用 Ghidra 或 IDA 进行原生代码分析。
前置条件
工作流程
步骤 1:识别 .NET 程序集和混淆器
验证样本是否为 .NET 二进制文件并检测保护措施:
file suspect.exe
diec suspect.exe
python3 << 'PYEOF'
import pefile
pe = pefile.PE("suspect.exe")
if hasattr(pe, 'DIRECTORY_ENTRY_COM_DESCRIPTOR'):
print("[*] 检测到 .NET 程序集")
print(f" 运行时版本: {pe.DIRECTORY_ENTRY_COM_DESCRIPTOR}")
else:
for entry in pe.DIRECTORY_ENTRY_IMPORT:
if entry.dll.decode().lower() == "mscoree.dll":
print("[*] 检测到 .NET 程序集(mscoree.dll 导入)")
break
else:
print("[!] 非 .NET 程序集")
for section in pe.sections:
name = section.Name.decode().rstrip('\x00')
if name in ['.text', '.rsrc', '.reloc']:
print(f" 节: {name}(典型 .NET 节)")
PYEOF
步骤 2:使用 de4dot 进行反混淆
在手动分析前移除常见的 .NET 混淆:
de4dot suspect.exe -o suspect_cleaned.exe
de4dot suspect.exe -p cf
de4dot suspect.exe -p sa
de4dot suspect.exe -p dr
de4dot suspect.exe -p rv
de4dot suspect.exe -p bl
de4dot -v suspect.exe -o suspect_cleaned.exe
de4dot suspect.exe suspect_helper.dll -o cleaned/
常见 .NET 混淆器:
━━━━━━━━━━━━━━━━━━━━━━━
ConfuserEx: 字符串加密、控制流混淆、反调试、防篡改
SmartAssembly: 字符串编码、流混淆、代码裁剪
Dotfuscator: 重命名、字符串加密、控制流混淆
.NET Reactor: 原生代码生成、necrobit、反调试
Babel.NET: 字符串加密、资源加密、代码虚拟化
Crypto Obfuscator: 字符串加密、反调试、水印
Custom: 恶意软件专用混淆(需手动配置 de4dot)
步骤 3:在 dnSpy 中打开并分析代码
在 dnSpy 中加载反混淆后的程序集进行源码级分析:
dnSpy 分析工作流:
━━━━━━━━━━━━━━━━━━━━━━━
1. File -> Open -> 选择清理后的程序集
2. 导航到入口点:
- Assembly Explorer -> <命名空间> -> Program 类 -> Main 方法
- 或: 右键单击程序集 -> Go to Entry Point
3. 需重点检查的区域:
- 入口点(Main):初始化和执行流程
- Form 类:基于 UI 的恶意软件(RAT、信息窃取器)
- Network/HTTP 类:C2 通信
- Crypto/加密类:数据保护
- 资源访问:嵌入的载荷
- Timer/Thread 类:持久化和调度
4. 导航快捷键:
Ctrl+G - 跳转到 token/地址
Ctrl+Shift+K - 搜索程序集
F12 - 跳转到定义
Ctrl+R - 分析(查找用法)
F5 - 开始调试
F9 - 切换断点
步骤 4:提取配置和 C2 数据
在反编译源代码中定位硬编码配置:
public static class Config {
public static string Host = "185.220.101.42";
public static int Port = 4782;
public static string Key = "GhOsT_RaT_2025";
public static string Mutex = "AsyncMutex_6SI8OkPnk";
public static bool Install = true;
public static string InstallFolder = "%AppData%";
}
public static string Decrypt(string input) {
byte[] data = Convert.FromBase64String(input);
byte[] key = Encoding.UTF8.GetBytes("SecretKey123");
for (int i = 0; i < data.Length; i++) {
data[i] ^= key[i % key.Length];
}
return Encoding.UTF8.GetString(data);
}
byte[] configData = Properties.Resources.config;
string config = AES.Decrypt(configData, derivedKey);
import subprocess
import re
import base64
result = subprocess.run(
["monodis", "--output=il_dump.il", "suspect_cleaned.exe"],
capture_output=True, text=True
)
with open("il_dump.il", errors="ignore") as f:
il_code = f.read()
strings = re.findall(r'ldstr\s+"([^"]+)"', il_code)
for s in strings:
try:
decoded = base64.b64decode(s).decode('utf-8', errors='ignore')
if len(decoded) > 3 and decoded.isprintable():
print(f" Base64: {s[:40]}... -> {decoded[:100]}")
except:
pass
if re.match(r'https?://', s) or re.match(r'\d+\.\d+\.\d+\.\d+', s):
print(f" 网络: {s}")
步骤 5:使用 dnSpy 进行调试
设置断点并调试恶意软件以观察运行时行为:
dnSpy 调试工作流:
━━━━━━━━━━━━━━━━━━━━━━━
1. 在关键方法上设置断点:
- 字符串解密函数(捕获解密后的值)
- 网络连接方法(捕获 C2 URL)
- 文件写入操作(查看释放的文件)
- 注册表修改方法(查看持久化)
2. Debug -> Start Debugging(F5)
- 选择要调试的程序集
- 根据需要设置命令行参数
- 配置异常处理(对所有 CLR 异常中断)
3. 在每个断点处:
- 检查局部变量(Locals 窗口)
- 求值表达式(Immediate 窗口)
- 查看调用栈以理解执行上下文
- 逐过程(F10)/ 逐语句(F11)/ 跳出(Shift+F11)
4. 捕获解密后的字符串:
- 在解密函数返回后设置断点
- 从 Locals 窗口读取返回值
- 记录所有解密后的配置值
步骤 6:记录分析结果
将分析结果整理为结构化报告:
分析文档应包含:
- .NET 程序集元数据(CLR 版本、目标框架、编译信息)
- 识别的混淆器及使用的反混淆方法
- 完整 C2 配置(主机、端口、加密密钥、互斥体名称)
- 恶意软件功能(键盘记录、屏幕截图、文件窃取等)
- 持久化机制(注册表、计划任务、启动目录)
- 反分析技术(虚拟机检测、调试器检测、沙箱规避)
- 提取的 IOC(C2 IP/域名、文件哈希、互斥体名称、注册表键)
- 基于独特代码模式或字符串的 YARA 规则
核心概念
| 术语 | 定义 |
|---|
| CIL/MSIL | 公共中间语言(Common Intermediate Language);.NET 程序集编译后的字节码格式,可反编译还原为 C#/VB.NET 高级代码 |
| 元数据令牌(Metadata Token) | 程序集元数据表中 .NET 类型、方法和字段的唯一标识符;在 dnSpy 中用于导航 |
| de4dot | 开源 .NET 反混淆工具,可识别并去除多种商业和恶意软件专用混淆器的保护 |
| ConfuserEx | 恶意软件作者常用的流行开源 .NET 混淆器,用于字符串加密和控制流混淆 |
| 字符串加密(String Encryption) | 将字符串字面量替换为加密数据并在运行时解密的混淆技术,以对静态分析隐藏 IOC |
| 资源嵌入(Resource Embedding) | 在 .NET 嵌入资源中存储配置、载荷或其他程序集,通常使用从程序集元数据派生的密钥加密 |
| Assembly.Load | 从内存中的字节数组加载程序集的 .NET 方法,可实现无文件执行嵌入载荷 |
工具与系统
- dnSpy/dnSpyEx:开源 .NET 程序集编辑器、反编译器和调试器,支持 C# 和 VB.NET 反编译
- de4dot:自动化 .NET 反混淆工具,支持 ConfuserEx、SmartAssembly、Dotfuscator、Reactor 及许多其他保护器
- ILSpy:开源 .NET 反编译器,提供程序集代码的 C#、VB.NET 和 IL 视图
- dotPeek:JetBrains 的免费 .NET 反编译器,具有符号服务器和交叉引用导航功能
- Detect It Easy(DIE):多格式文件分析器,可识别 .NET 框架版本、混淆器和编译器信息
常见场景
场景:分析 AgentTesla 信息窃取器
背景:钓鱼邮件投递一个 .NET 可执行文件,被识别为 AgentTesla。需要分析以确定其窃取哪些凭证、如何外泄数据及其 C2 配置。
分析方法:
- 运行 Detect It Easy 识别混淆器(通常为 ConfuserEx 或自定义混淆器)
- 使用 de4dot 进行反混淆,还原可读的类/方法名称并解密字符串
- 在 dnSpy 中打开,导航到入口点以了解初始化流程
- 定位凭证采集模块(浏览器、邮件、FTP、VPN 密码窃取类)
- 找到外泄方法(SMTP 邮件、FTP 上传、HTTP POST、Telegram Bot API)
- 提取 C2 配置(SMTP 服务器、凭证、收件人邮箱或 HTTP URL)
- 在解密函数上设置调试断点,一次性捕获所有解密后的字符串
常见陷阱:
- 未先使用 de4dot 就开始分析(ConfuserEx 使手动分析极为困难)
- 未检查多阶段加载(初始 .NET 可执行文件可能从资源中加载额外的程序集)
- 遗漏存储在 .NET 资源中(而非硬编码字符串中)的配置
- 未隔离网络环境直接运行调试器(AgentTesla 会立即尝试外泄数据)
输出格式
.NET 恶意软件分析报告
================================
样本: invoice_scanner.exe
SHA-256: e3b0c44298fc1c149afbf4c8996fb924...
类型: .NET 程序集(C#)
框架: .NET Framework 4.8
混淆器: ConfuserEx v1.6
已反混淆: 是(de4dot -p cf)
分类结果
家族: AgentTesla v3
类型: 信息窃取器 / 键盘记录器
编译时间: 2025-09-10
C2 配置
外泄方式: SMTP(邮件)
SMTP 服务器: smtp.yandex[.]com:587
SMTP 用户名: exfil.account@yandex[.]com
SMTP 密码: Str0ngP@ssw0rd2025
收件人: operator@protonmail[.]com
间隔: 每 30 分钟
加密: AES-256,密钥 "AgentTesla_2025_key"
功能列表
[*] 浏览器凭证窃取(Chrome、Firefox、Edge、Opera)
[*] 邮件客户端密码(Outlook、Thunderbird)
[*] FTP 客户端凭证(FileZilla、WinSCP)
[*] VPN 凭证(NordVPN、OpenVPN)
[*] 键盘记录(SetWindowsHookEx)
[*] 屏幕截图(每 30 秒)
[*] 剪贴板监控
持久化机制
方式: 注册表 Run 键 + 计划任务
注册表: HKCU\Software\Microsoft\Windows\CurrentVersion\Run\WindowsUpdate
计划任务: \Microsoft\Windows\WindowsUpdate\Updater
提取的 IOC
SMTP 服务器: smtp.yandex[.]com
外泄邮箱: exfil.account@yandex[.]com
收件人: operator@protonmail[.]com
互斥体: AgentTesla_2025_Q3_MUTEX
安装路径: %AppData%\Microsoft\Windows\svchost.exe