reverse-engineering-dotnet-malware-with-dnspy

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

9 stars

Best use case

reverse-engineering-dotnet-malware-with-dnspy is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

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

Teams using reverse-engineering-dotnet-malware-with-dnspy should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/reverse-engineering-dotnet-malware-with-dnspy/SKILL.md --create-dirs "https://raw.githubusercontent.com/killvxk/cybersecurity-skills-zh/main/skills/reverse-engineering-dotnet-malware-with-dnspy/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/reverse-engineering-dotnet-malware-with-dnspy/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How reverse-engineering-dotnet-malware-with-dnspy Compares

Feature / Agentreverse-engineering-dotnet-malware-with-dnspyStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

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

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# 使用 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 二进制文件并检测保护措施:

```bash
# 检查文件是否为 .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 混淆:

```bash
# 运行 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 数据

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

```csharp
// 常见 .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);
```

```python
# 提取 .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
```

Related Skills

reverse-engineering-rust-malware

9
from killvxk/cybersecurity-skills-zh

使用 IDA Pro 和 Ghidra 对 Rust 编译的恶意软件进行逆向工程,掌握处理非空终止字符串、提取 crate 依赖项和 Rust 特有控制流分析的专项技术。

reverse-engineering-ransomware-encryption-routine

9
from killvxk/cybersecurity-skills-zh

对勒索软件加密例程进行逆向工程,以识别密码学算法、密钥生成缺陷,以及通过静态和动态分析挖掘潜在的解密机会。

reverse-engineering-malware-with-ghidra

9
from killvxk/cybersecurity-skills-zh

使用 NSA 的 Ghidra 反汇编器和反编译器对恶意软件二进制文件进行逆向工程,在汇编和伪 C 代码层面理解其内部逻辑、密码学例程、C2 协议和规避技术。适用于恶意软件逆向工程、反汇编分析、反编译、二进制分析或理解恶意软件内部机制等请求。

reverse-engineering-ios-app-with-frida

9
from killvxk/cybersecurity-skills-zh

使用 Frida 动态插桩对 iOS 应用进行逆向工程,在无源代码的情况下理解内部逻辑、 提取加密密钥、绕过安全控制并发现隐藏功能。适用于授权 iOS 渗透测试、分析专有协议、 理解混淆逻辑或从 iOS 二进制文件中提取运行时机密。适合 iOS 逆向工程、Frida iOS Hook、 Objective-C/Swift 方法追踪或 iOS 二进制分析相关请求。

reverse-engineering-android-malware-with-jadx

9
from killvxk/cybersecurity-skills-zh

使用 JADX 反编译器对恶意 Android APK 文件进行逆向工程,分析 Java/Kotlin 源代码,识别包括数据窃取、C2 通信、权限提升和覆盖攻击在内的恶意功能。检查 Manifest 权限、Receiver、Service 及原生库。适用于 Android 恶意软件分析、APK 逆向工程、移动端恶意软件调查或 Android 威胁分析等请求。

performing-static-malware-analysis-with-pe-studio

9
from killvxk/cybersecurity-skills-zh

使用 PEStudio 对 Windows PE(可移植可执行文件)恶意软件样本进行静态分析, 检查文件头、导入表、字符串、资源和指标,无需执行二进制文件。 识别可疑特征,包括加壳、反分析技术和恶意导入。适用于静态恶意软件分析、 PE 文件检查、Windows 可执行文件分析或执行前恶意软件分级等请求场景。

performing-malware-triage-with-yara

9
from killvxk/cybersecurity-skills-zh

使用 YARA 规则对文件模式、字符串、字节序列和结构特征进行匹配,快速分级和分类恶意软件样本, 识别已知恶意软件家族及可疑指标。涵盖规则编写、扫描和与分析流程的集成。适用于 YARA 规则创建、 恶意软件分类、模式匹配、样本分级或基于签名的检测等请求场景。

performing-malware-persistence-investigation

9
from killvxk/cybersecurity-skills-zh

系统性地调查 Windows 和 Linux 系统上的所有持久化机制,以识别恶意软件如何在重启后存活并维持访问。

performing-malware-ioc-extraction

9
from killvxk/cybersecurity-skills-zh

恶意软件 IOC(失陷指标)提取是指通过分析恶意软件,识别可操作的失陷指标,包括文件哈希、网络指标(C2 域名、IP 地址、URL)、注册表修改、互斥体名称、嵌入字符串和行为产物。

performing-malware-hash-enrichment-with-virustotal

9
from killvxk/cybersecurity-skills-zh

使用 VirusTotal API 富化恶意软件文件哈希,获取检测率、行为分析、YARA 匹配和上下文威胁情报,用于事件分类和 IOC 验证。

performing-firmware-malware-analysis

9
from killvxk/cybersecurity-skills-zh

分析固件镜像中嵌入的恶意软件、后门和未授权修改,目标包括路由器、IoT 设备、UEFI/BIOS 和嵌入式系统。涵盖固件提取、文件系统分析、二进制逆向工程和 Bootkit 检测。适用于固件安全 分析、IoT 恶意软件调查、UEFI Rootkit 检测或嵌入式设备入侵评估等请求场景。

performing-automated-malware-analysis-with-cape

9
from killvxk/cybersecurity-skills-zh

部署和操作 CAPEv2 沙箱,进行自动化恶意软件分析,具备行为监控、载荷提取、配置解析和反规避能力。