BinFlip/dotscope
GitHub: BinFlip/dotscope
一个纯 Rust 编写的高性能跨平台 .NET 程序集分析与逆向工程框架,提供从元数据解析、CIL 反汇编、静态分析到反混淆和模拟执行的全链路能力,无需依赖 Windows 或 .NET 运行时。
Stars: 9 | Forks: 1
# dotscope
[](https://crates.io/crates/dotscope)
[](https://docs.rs/dotscope)
[](LICENSE-APACHE)
[](https://github.com/BinFlip/dotscope/actions)
[](https://codecov.io/gh/BinFlip/dotscope)
一个高性能、跨平台的框架,用于分析、逆向工程和修改 .NET PE 可执行文件。`dotscope` 使用纯 Rust 构建,提供了全面的工具,用于解析 CIL (Common Intermediate Language) 字节码、元数据结构、反汇编 .NET 程序集以及创建修改后的程序集,而无需依赖 Windows 或 .NET 运行时。
## 功能特性
- **高效的内存访问** - 内存映射文件访问,具有最少的分配和基于引用的解析
- **完整的元数据分析** - 解析所有 ECMA-335 元数据表和流
- **程序集修改** - 通过验证和完整性检查来编辑元数据表、堆和 PE 结构
- **方法注入** - 使用高级构建器向现有程序集添加新方法、类和元数据
- **高性能反汇编** - 带有控制流分析的快速 CIL 指令解码
- **CIL 编码** - 为方法修改生成带有基于标签的异常处理的 CIL 字节码
- **原生 PE 操作** - 管理导入、导出和原生互操作性功能
- **跨平台** - 适用于 Windows、Linux、macOS 以及任何受 Rust 支持的平台
- **内存安全** - 使用 Rust 构建,提供全面的错误处理和模糊测试
- **丰富的类型系统** - 全面支持泛型、签名和复杂的 .NET 类型
- **静态分析** - SSA 形式、控制流图、数据流分析、调用图和循环检测
- **反混淆** - 30 个优化 pass,支持 ConfuserEx、BitMono、JIEJIE.NET 和 Obfuscar 的 35 项技术,字符串解密,控制流恢复
- **CIL 模拟** - 完整的字节码解释器,带有 600 多个 BCL 桩程序,用于运行时值计算
- **可扩展架构** - 用于自定义分析和工具的模块化设计
## 快速开始
将 `dotscope` 添加到您的 `Cargo.toml` 中:
```
[dependencies]
dotscope = "0.7.0"
```
### 原始访问示例
```
use dotscope::prelude::*;
fn main() -> dotscope::Result<()> {
// Load assembly for raw access
let view = CilAssemblyView::from_path("MyAssembly.dll".as_ref())?;
// Direct access to metadata tables
if let Some(tables) = view.tables() {
let typedef_count = tables.table_row_count(TableId::TypeDef);
println!("TypeDef rows: {}", typedef_count);
}
// Direct heap access
if let Some(strings) = view.strings() {
for (index, string) in strings.iter().take(5) {
println!("String {}: {}", index, string);
}
}
Ok(())
}
```
### 分析示例
```
use dotscope::prelude::*;
fn main() -> Result<(), Box> {
// Load assembly for high-level analysis
let assembly = CilObject::from_path("MyAssembly.dll".as_ref())?;
// Access resolved information
if let Some(module) = assembly.module() {
println!("Module: {}", module.name);
}
// Iterate through resolved methods with type information
let methods = assembly.methods();
println!("Found {} methods", methods.len());
// Examine resolved imports and exports
let imports = assembly.imports();
let exports = assembly.exports();
println!("Imports: {}, Exports: {}", imports.len(), exports.len());
Ok(())
}
```
### 程序集修改示例
```
use dotscope::prelude::*;
fn main() -> dotscope::Result<()> {
// Load assembly for modification
let view = CilAssemblyView::from_path("input.dll".as_ref())?;
let mut assembly = CilAssembly::new(view);
// Add strings to metadata heaps
let string_index = assembly.string_add("Hello from dotscope!")?;
let user_string_index = assembly.userstring_add("Modified assembly")?;
// Add native imports
assembly.add_native_import_dll("kernel32.dll")?;
assembly.add_native_import_function("kernel32.dll", "GetProcessId")?;
// Write modified assembly
assembly.to_file("output.dll")?;
Ok(())
}
```
### 方法构建器示例
```
use dotscope::prelude::*;
fn main() -> dotscope::Result<()> {
// Load assembly for modification
let view = CilAssemblyView::from_path("input.dll".as_ref())?;
let mut assembly = CilAssembly::new(view);
// Add a user string
let msg_index = assembly.userstring_add("Hello World!")?;
let msg_token = Token::new(0x70000000 | msg_index);
// Create method with CIL instructions
let method_token = MethodBuilder::new("MyNewMethod")
.public()
.static_method()
.returns(TypeSignature::Void)
.implementation(|body| {
body.implementation(|asm| {
asm.ldstr(msg_token)?
.pop()? // Simple example: load string then pop it
.ret()
})
})
.build(&mut assembly)?;
// Save the modified assembly
assembly.to_file("output.dll")?;
Ok(())
}
```
### 项目加载器示例
```
use dotscope::project::ProjectLoader;
fn main() -> dotscope::Result<()> {
// Load assembly with automatic dependency resolution
let result = ProjectLoader::new()
.primary_file("MyApp.exe")?
.with_search_path("/usr/lib/mono/4.5")?
.auto_discover(true)
.build()?;
println!("Loaded {} assemblies", result.success_count());
// Access the project with all loaded assemblies
let project = &result.project;
// Get the primary assembly
if let Some(primary) = project.get_primary() {
println!("Types: {}", primary.types().len());
println!("Methods: {}", primary.methods().len());
}
// Cross-assembly type lookup
if let Some(string_type) = project.get_type_by_name("System.String") {
println!("Found System.String with {} methods", string_type.methods.count());
}
// Find type definitions across all assemblies
let object_types = project.find_type_definitions("Object");
println!("Found {} types matching 'Object'", object_types.len());
Ok(())
}
```
## 文档
- **[API 文档](https://docs.rs/dotscope)** - 完整的 API 参考
- **[示例](examples/)** - 针对常见用例的可运行示例
- **[混淆器研究](docs/research/main.md)** - 对受支持的混淆器及其保护技术的详细分析
- **[贡献指南](CONTRIBUTING.md)** - 如何为项目做出贡献
- **[安全政策](SECURITY.md)** - 安全报告与政策
## 架构
`dotscope` 被组织成几个关键模块:
### 核心组件
- **[`prelude`]** - 常用类型的便捷重导出
- **[`metadata`]** - 完整的 ECMA-335 元数据解析和类型系统
- **[`cilassembly`]** - 带有写时复制语义和高级构建器的程序集修改
- **[`assembly`]** - CIL 指令编码/解码、控制流分析和方法体构建
- **[`Error`] 和 [`Result`]** - 全面的错误处理
### 原始访问 (`CilAssemblyView`)
对程序集结构的低级访问提供:
- **直接 PE 解析**:对 PE 头、节和数据目录的原始访问
- **元数据流**:无需对象解析的直接堆访问
- **表迭代**:带有手动索引解析的原始表行访问
- **内存映射数据**:对程序集内容的高效访问
- **基础层**:分析和修改操作的基础
### 分析 (`CilObject`)
具有已解析对象的高级分析提供:
- **已解析的引用**:自动交叉引用解析和对象图
- **类型系统**:.NET 类型、泛型和继承的丰富表示
- **方法体**:带有操作数解析的已解析 IL 指令
- **导入/导出分析**:已解析的依赖项和导出信息
- **便利 API**:用于常见分析任务的易用接口
### 修改 (`CilAssembly`)
可变的程序集编辑提供:
- **堆操作**:在所有元数据堆中添加、更新、移除项目
- **表操作**:通过验证添加、更新、删除元数据表行
- **PE 操作**:管理原生导入、导出和转发器
- **构建器 API**:用于向现有程序集添加类、方法、属性、事件和枚举的高级构建器
- **CIL 生成**:带有标签解析和异常处理的完整 CIL 指令编码,用于方法修改
- **验证**:全面的完整性检查和引用解析
### Assembly 引擎
Assembly 模块提供全面的 CIL 处理:
**解码与分析:**
- **指令解码**:解析单个 CIL 操作码,提供完整的操作数支持
- **控制流分析**:构建基本块和控制流图
- **栈分析**:跟踪栈效果和类型流
- **异常处理**:解析和分析 try/catch/finally 区域
**编码与生成:**
- **指令编码**:从高级指令生成 CIL 字节码
- **标签解析**:自动分支目标和异常处理程序解析
- **方法体构建**:构建带有局部变量和异常处理的完整方法体
- **程序集修改**:用于向现有 .NET 程序集添加新组件的流畅 API
### 分析 (`analysis`)
用于 .NET 方法的静态程序分析基础设施:
- **SSA 构建**:带有支配边界和 phi 插入的 Cytron 等人算法
- **控制流图**:支配树、循环、回边检测和后支配符
- **数据流框架**:带有通用不动点求解器的 SCCP、活跃变量分析、到达定义
- **调用图**:通过 CHA 进行虚分发解析的过程间调用关系
- **代数简化**:表达式规范化和常量折叠
- **范围分析**:整数变量的值范围跟踪
- **污点分析**:跟踪从源到汇的数据流
### 反混淆 (`deobfuscation`)
用于受保护 .NET 程序集的基于 SSA 的反混淆引擎:
- **Pass 管道**:4 阶段调度器(规范化、优化、反混淆、终结),带有不动点迭代
- **30 个转换 Pass**:常量传播、复制传播、GVN、死代码消除、控制流展平还原、不透明谓词移除、强度削减、代数简化、块合并、循环规范化、LICM、跳转线程、内联、委托代理解析、typeof/数组/资源恢复等
- **35 种检测技术**:基于技术的检测,带有可扩展的注册表
- **ConfuserEx 支持**:防篡改、反调试、反转储、常量、控制流、资源、引用代理、标记移除
- **BitMono 支持**:反调试、钩子、垃圾代码、call-to-calli、字符串加密、非托管字符串、PE 修复、重命名
- **JIEJIE.NET 支持**:控制流展平、字符串加密、常量编码、资源加密、typeof 混淆、数组初始化、符号重命名
- **Obfuscar 支持**:字符串隐藏(XOR 解密)、符号重命名、SuppressIldasm 移除
- **代码生成**:带有寄存器合并和 phi 消除的 SSA 到 CIL 转换
- **解密**:基于模拟的字符串和常量解密
### 模拟 (`emulation`)
用于受控 .NET 代码执行的 CIL 字节码解释器:
- **解释器**:支持 213 个 CIL 操作码及完整的操作数处理
- **内存模型**:带有堆、静态变量和映射区域的写时复制地址空间
- **BCL 桩程序**:600 多个方法桩,涵盖 Math、String、Array、Convert、Crypto、IO、Reflection、Collections 等
- **钩子系统**:带有灵活匹配条件的方法前/后拦截
- **异常处理**:带有栈展开和合成异常层次结构的 try/catch/finally
- **Process Builder**:可配置的执行,具有指令、调用深度和内存限制
- **泛型实例化**:带有去重功能的运行时泛型类型/方法实例化
- **接口分发**:基于 IMT 的接口方法解析,带有 VTable 缓存
## 示例
查看 [examples](examples/) 目录,获取包含详细文档的完整可运行示例:
- **[基础用法](examples/basic.rs)** - 从这里开始!带有错误处理的简单程序集加载和检查
- **[程序集修改](examples/modify.rs)** - 堆和表操作编辑程序集的完整指南
- **[元数据分析](examples/metadata.rs)** - 深入探讨程序集元数据和依赖跟踪
- **[反汇编](examples/disassembly.rs)** - CIL 指令反汇编和方法体分析
- **[类型系统](examples/types.rs)** - 使用 .NET 类型、泛型和继承
- **[综合分析](examples/comprehensive.rs)** - 结合所有功能的完整特性分析
- **[方法分析](examples/method_analysis.rs)** - 穷举式单方法检查
- **[底层 API](examples/lowlevel.rs)** - 理解 dotscope 内部结构和原始解析
- **[控制流](examples/decode_blocks.rs)** - 基本块构建和流分析
- **[代码注入](examples/injectcode.rs)** - 使用 MethodBuilder 将新方法注入到现有程序集中
- **[原始程序集视图](examples/raw_assembly_view.rs)** - 直接访问 PE 头、元数据流和堆
- **[项目加载器](examples/project_loader.rs)** - 加载带有自动依赖解析的程序集
- **[分析](examples/analysis.rs)** - 查看 SSA 形式、反汇编、控制流图和调用图
- **[反混淆](examples/deobfuscate.rs)** - 用于反混淆支持 ConfuserEx、BitMono、JIEJIE.NET 和 Obfuscar 的 .NET 程序集的 CLI 工具
每个示例都包含详细文档,解释了:
- **它教授什么** - 关键学习目标和概念
- **何时使用** - 实际应用和用例
- **前置条件** - 所需的背景知识
- **API 模式** - 一致且可用于生产的代码示例
有关推荐的学习路径,请参阅 [examples README](examples/README.md)。
## 使用场景
`dotscope` 非常适合:
- **逆向工程**:分析 .NET 恶意软件和脆弱软件
- **安全研究**:发现漏洞和安全问题
- **程序集修补**:修改程序集以进行检测、挂钩或增强
- **代码分析**:静态分析和质量指标
- **反编译**:构建反编译器和分析工具
- **开发工具**:创建程序集编辑器、分析器和构建工具
- **教育**:学习 .NET 内部原理和 PE 格式
- **反混淆**:从受保护的 .NET 程序集中移除混淆
- **数字取证**:在数字取证中检查 .NET 程序集
## 安全
安全是首要任务:
- **内存安全**:基于 Rust 的内存安全保证构建
- **模糊测试**:使用 cargo-fuzz 进行持续模糊测试
- **输入验证**:对所有输入进行严格验证
- **审计跟踪**:定期的依赖项审计
有关更多信息,请参阅我们的[安全政策](SECURITY.md)。
## 标准合规性
`dotscope` 实现了公共语言基础结构 (CLI) 的 **ECMA-335 规范**(第 6 版)。所有元数据结构、CIL 指令和类型系统特性均符合此标准。
### 参考文献
- [ECMA-335 标准](https://ecma-international.org/wp-content/uploads/ECMA-335_6th_edition_june_2012.pdf) - 官方 CLI 规范
- [.NET 运行时](https://github.com/dotnet/runtime) - Microsoft 的参考实现
## 测试与质量
我们通过以下方式保持高代码质量:
- **全面的测试套件**:单元、集成和模糊测试
- **持续集成**:在多个平台上进行自动化测试
- **代码覆盖率**:>90% 的测试覆盖率目标
- **静态分析:Clippy、rustfmt 和审计
- **性能测试**:定期基准测试和回归检测
### 运行测试
```
# Development cycle(推荐频繁使用)
make dev # Format, lint, and test
# 完整 CI 模拟
make ci # Complete CI checks
# 安全与质量
make audit # Security audit
make coverage # Generate coverage report
```
### 扩展测试
```
# 本地 fuzzing(60秒)
make fuzz
# 扩展 fuzzing(手动)
cd fuzz && cargo +nightly fuzz run cilobject --release -- -max_total_time=1800
# 所有质量检查
make check-all
```
## 未来特性
我们正不断努力改进 `dotscope`。以下是计划中的未来特性:
### 核心改进
- 防止恶意构造文件导致的巨大内存分配
- 程序集链接与合并
- 将完整 Assembly 存储为/从 JSON 加载
- 非嵌入资源支持
### 高级分析
- 基于表达式的不透明谓词求解
- 针对虚拟化混淆器的 VM 去虚拟化
- 额外的混淆器支持
## 贡献
我们欢迎您的贡献!有关详细信息,请参阅我们的[贡献指南](CONTRIBUTING.md)。
### 快速贡献检查清单
- 检查现有 issue 和 PR
- 为新功能编写测试
- 更新文档
- 确保 CI 通过
- 遵循提交信息约定
## 许可证
本项目根据 Apache 许可证 2.0 版获得许可。
有关详细信息,请参阅 [LICENSE-APACHE](LICENSE-APACHE) 或 。
### 负责任的使用政策
`dotscope` 的开发和提供仅用于以下目的:
- **安全研究** - 分析恶意软件、漏洞和安全威胁
- **恶意软件分析** - 出于防御目的对恶意软件进行逆向工程
- **教育用途** - 学习 .NET 内部原理、CIL 和 PE 结构
- **防御工具** - 构建安全工具和保护措施
**禁止用途**:除非您已获得权利持有人的明确授权,或适用法律允许此类使用,否则您不得使用 `dotscope` 分析、反混淆、逆向工程或修改受知识产权保护(包括但不限于商业软件、专有应用程序,或此类分析将违反软件许可条款或适用法律的任何软件)的软件。
**免责声明**:`dotscope` 的作者和贡献者不对用户选择如何使用本软件负责。用户有全责确保其使用 `dotscope` 符合所有适用的法律、法规和许可协议。使用 `dotscope` 即表示您承认您对自己的行为以及因使用本软件而产生的任何后果承担全部责任。
## 致谢
- Rust 社区提供的优秀工具和库
- Microsoft 提供的 ECMA-335 规范
- [goblin](https://github.com/m4b/goblin) 项目为 PE 解析提供的灵感
## 支持
- **Bug 报告**:[GitHub Issues](https://github.com/BinFlip/dotscope/issues)
- **功能请求**:[GitHub Issues](https://github.com/BinFlip/dotscope/issues)
- **问题讨论**:[GitHub Discussions](https://github.com/BinFlip/dotscope/discussions)
- **安全问题**:admin{at}binflip.rs
标签:CIL字节码, DNS重绑定攻击, ECMA-335, PE文件解析, Rust, SSA, TLS抓取, Wayback Machine, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 代码混淆与还原, 元数据分析, 内存安全, 反汇编, 可视化界面, 控制流分析, 控制流图, 方法注入, 无Windows依赖, 程序集修改, 网络流量审计, 脱壳, 软件安全, 逆向工程, 通知系统, 静态分析