L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Productivité · SKILL.md

reverse-engineering-dotnet-malware-with-dnspy

reverse-engineering-dotnet-malware-with-dnspy

使用 dnSpy 反编译器和调试器对 .NET 恶意软件进行逆向工程,分析 C#/VB.NET 源代码,识别混淆技术,提取配置信息,理解包括信息窃取器、远程访问木马(RAT)和加载器在内的恶意功能。适用于 .NET 恶意软件分析、C# 恶意软件反编译、托管代码逆向工程或 .NET 混淆分析等请求。

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

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 进行原生代码分析。

前置条件

  • dnSpy 或 dnSpyEx(https://github.com/dnSpyEx/dnSpy —— 社区维护的 Fork)
  • de4dot,用于自动化 .NET 反混淆(https://github.com/de4dot/de4dot)
  • ILSpy,作为交叉验证的备选反编译器
  • 安装了 .NET SDK,用于在分析过程中重新编译修改后的程序集
  • 用于在实时恶意软件上运行 dnSpy 调试器的隔离 Windows 虚拟机
  • Detect It Easy(DIE),用于识别所使用的 .NET 混淆器

工作流程

步骤 1:识别 .NET 程序集和混淆器

验证样本是否为 .NET 二进制文件并检测保护措施:

# 检查文件是否为 .NET 程序集
file suspect.exe
# 输出应包含带有 .NET 元数据的 "PE32 executable"

# 使用 Detect It Easy 检测混淆器
diec suspect.exe

# 基于 Python 的 .NET 检测
python3 << 'PYEOF'
import pefile

pe = pefile.PE("suspect.exe")

# 检查 .NET COM 描述符
if hasattr(pe, 'DIRECTORY_ENTRY_COM_DESCRIPTOR'):
    print("[*] 检测到 .NET 程序集")
    print(f"    运行时版本: {pe.DIRECTORY_ENTRY_COM_DESCRIPTOR}")
else:
    # 通过 mscoree.dll 导入进行备选检测
    for entry in pe.DIRECTORY_ENTRY_IMPORT:
        if entry.dll.decode().lower() == "mscoree.dll":
            print("[*] 检测到 .NET 程序集(mscoree.dll 导入)")
            break
    else:
        print("[!] 非 .NET 程序集")

# 检查节名称中的 .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 以识别并去除混淆
de4dot suspect.exe -o suspect_cleaned.exe

# 强制指定特定反混淆器
de4dot suspect.exe -p cf  # ConfuserEx
de4dot suspect.exe -p sa  # SmartAssembly
de4dot suspect.exe -p dr  # Dotfuscator
de4dot suspect.exe -p rv  # Reactor
de4dot suspect.exe -p bl  # Babel.NET

# 调试时使用详细输出
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 数据

在反编译源代码中定位硬编码配置:

// 常见 .NET 恶意软件配置模式:

// 模式 1:带硬编码值的静态类
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%";
}

// 模式 2:运行时解密的加密字符串
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);
}

// 模式 3:嵌入在资源中的配置
byte[] configData = Properties.Resources.config;
string config = AES.Decrypt(configData, derivedKey);
# 提取 .NET 资源字符串的 Python 脚本
import subprocess
import re
import base64

# 使用 monodis(Mono)或 ildasm(.NET SDK)转储 IL
result = subprocess.run(
    ["monodis", "--output=il_dump.il", "suspect_cleaned.exe"],
    capture_output=True, text=True
)

# 在 IL 转储中搜索字符串字面量
with open("il_dump.il", errors="ignore") as f:
    il_code = f.read()

# 查找 ldstr(加载字符串)指令
strings = re.findall(r'ldstr\s+"([^"]+)"', il_code)
for s in strings:
    # 检查 Base64 编码的字符串
    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
    # 检查 URL/IP
    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 配置。

分析方法:

  1. 运行 Detect It Easy 识别混淆器(通常为 ConfuserEx 或自定义混淆器)
  2. 使用 de4dot 进行反混淆,还原可读的类/方法名称并解密字符串
  3. 在 dnSpy 中打开,导航到入口点以了解初始化流程
  4. 定位凭证采集模块(浏览器、邮件、FTP、VPN 密码窃取类)
  5. 找到外泄方法(SMTP 邮件、FTP 上传、HTTP POST、Telegram Bot API)
  6. 提取 C2 配置(SMTP 服务器、凭证、收件人邮箱或 HTTP URL)
  7. 在解密函数上设置调试断点,一次性捕获所有解密后的字符串

常见陷阱:

  • 未先使用 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
Skills enregistrées