AdvDebug/Brovan
GitHub: AdvDebug/Brovan
基于 Unicorn 引擎的用户态 x86/x64 二进制模拟器,提供交互式调试体验,专为恶意软件分析与逆向工程设计。
Stars: 2 | Forks: 1

# Brovan
*"像兄弟一样进行模拟"* - *专为你的模拟服务而生。*
[](https://dotnet.microsoft.com/)
[](https://learn.microsoft.com/dotnet/csharp/)
Brovan 是一个 C# 用户态二进制模拟器,用于在受控的模拟环境中检查和运行 x86/x64 程序。它支持 PE、ELF、内存转储以及无识别文件格式的原始文件。
它适用于恶意软件分析、逆向工程、二进制文件调试,或用于通常情况下了解程序正在执行的操作,而无需直接在宿主机 CPU 上执行其指令。
# 预览

## 为什么选择 Brovan?
Brovan 为你提供了一种亲自动手的方法来加载二进制文件、观察其行为,并从交互式 shell 中完全控制执行过程。
你可以使用它来:
* 分析可疑的 Windows 二进制文件
* 检查 PE 头、节区、导入表、导出表、函数和字符串
* 逐条指令单步执行模拟代码
* 跟踪 syscall 行为
* 监控函数调用
* 检查和修补内存
* 设置断点和观察点
* 快照模拟器状态并在稍后恢复
* 测试二进制文件如何与文件、注册表状态、内存、线程、网络和其他用户态对象进行交互
* 完全控制进程,甚至 Linux 的文件描述符或 Windows 的句柄都可以被完全控制、复制,或者直接从模拟菜单中修改其属性。
## Brovan 提供的功能
* PE、ELF 和 .NET 二进制文件解析支持
* Windows 用户态 PE 模拟(目前暂不支持 Windows 下的 x86 模拟)
* 针对常见 syscall 流程的 Linux/ELF 客户机支持
* 许多 Windows 用户态路径和 Linux 用户态路径的 syscall 建模,未来会支持更多
* 可选择客户机的通用原始二进制文件/blob 加载
* 交互式调试器风格命令 shell
* 内存区域、十六进制转储、反汇编和字符串搜索
* 断点以及读/写/执行观察点
* 快照与恢复支持
* syscall 跟踪和 syscall 规则,可为 syscall 设置自定义行为(甚至可以在不直接修改代码的情况下自行添加未支持的 syscall,但有一定限制)
* 带有参数解码的函数监控
* 针对模拟网络设备的可配置宿主机网络策略
## 构建要求
* .NET 8 SDK
* x64 运行时环境
* `unicorn.dll`/`libunicorn.so` 需放置在 `Resources/` 目录下
* 建议使用 Windows 进行主要的 Windows PE 模拟工作流程
在 Windows 上使用 Visual Studio 生成工具会很有用,因为 Brovan 在可用时会使用 `editbin` 来禁用 CFG(控制流防护),如果不这样做,由于 JIT 的工作原理,unicorn 将无法正常工作。
如果 Brovan 检测到控制流防护 仍在运行,它将自动重启进程并禁用 CFG,因此即使你没有 `editbin`,也依然可以正常运行。
## 构建
```
dotnet build -c Release
```
发布输出将创建在:
```
bin/Release/net8.0/
```
## 使用方法
```
Brovan [options]
[program arguments...]
```
示例:
```
Brovan sample.elf
Brovan --quick sample.exe
Brovan --quick -c "start;run" sample.exe
Brovan --net=none sample.elf
```
Brovan 的选项必须位于目标二进制文件路径之前。二进制文件路径之后的任何内容都将传递给模拟程序。
## CLI 选项
| 选项 | 描述 |
| ------------------ | -------------------------------------------------------------------------- |
| `-q`, `--quick` | 通过跳过更深层的静态分析来更快启动并使用更少的内存。 |
| `-s`, `--silent` | 仅显示来自模拟程序的 stdout。 |
| `-c`, `--command` | 自动运行交互式命令,以 `;` 分隔。 |
| `--net ` | 设置网络策略:`none`、`loopback` 或 `full`。默认值:`loopback`。 |
| `--net-allow ` | 允许特定的 IPv4 或 IPv6 地址。 |
| `-h`, `--help` | 显示帮助信息。 |
## 交互式 shell
Brovan 包含一个交互式调试器风格的 shell,用于控制执行和检查状态。
一些常见(但并非全部)的命令包括:
| 命令 | 描述 |
| -------------------------- | ------------------------------------ |
| `start` | 初始化模拟器。 |
| `run` | 通过调度器运行执行。 |
| `continue` / `c` | 恢复执行。 |
| `step` | 执行一条指令。 |
| `stepover` | 步过单步执行 call 指令。 |
| `dumpregs` | 显示寄存器状态。 |
| `hexdump ` | 转储内存。 |
| `disasm ` | 反汇编内存。 |
| `regions` | 列出已映射的内存区域。 |
| `modules` | 列出已加载的模块。 |
| `findstr` | 搜索内存中的字符串。 |
| `bp` | 管理断点。 |
| `watch` | 管理观察点。 |
| `snap` / `restore` | 保存或恢复模拟器状态。 |
| `bininfo` | 显示解析的二进制文件信息。 |
| `syscall` | 跟踪或控制 syscall 行为。 |
| `funcmon` | 监控函数调用。 |
| `help [command]` | 显示帮助信息。 |
示例:
```
Brovan --quick -c "start;showinstrs;run" sample.exe
```
## 恶意软件分析注意事项
Brovan 可以通过模拟用户态执行并暴露运行时行为来帮助分析恶意软件和可疑二进制文件。谨慎处理未知文件依然非常重要。
Brovan 不能替代经过适当隔离的恶意软件实验室或虚拟机。应将样本视为具有敌意,并采取正常的逆向工程防范措施。
Brovan 不允许模拟程序直接写入真实的宿主机文件系统,客户机端的写入会被重定向到 Brovan 的虚拟文件系统模型中。
但读取操作有所不同,如果客户机二进制文件与宿主环境兼容,Brovan 会以只读方式暴露宿主机文件,因为这是以最兼容的状态运行程序所必需的。程序可能需要诸如 Windows 库和其他模拟所需的运行时文件,这可能会使你面临数据窃取类恶意软件(例如信息窃取器)的风险。但是,这种情况仅在二进制文件与宿主操作系统兼容时发生。如果不兼容,文件读写操作通常会回退到 Brovan 的虚拟文件系统模型中进行。
网络访问由策略控制。默认模式是 `loopback`,但使用 `--net=full` 运行将允许无限制的完全网络行为。对于恶意软件,如果样本接触到由模拟器实现的受支持网络设备,这可能包括数据泄露。在分析未知样本时,除非有意研究其网络行为,否则请使用 `--net=none`。
# 所用依赖
感谢 Iced 库 提供 x86_64 反汇编和汇编支持。
感谢 Unicorn Engine 提供核心模拟器。
# 鸣谢
感谢我的朋友 GittingHubbers 帮助实现了 MLFQ 调度器。
# 许可证
本软件基于 GPL-2.0 许可证授权。标签:DAST, ELF文件分析, Findomain, .NET 8.0, PE文件分析, x86_64模拟, 二进制插桩, 二进制模拟器, 云资产清单, 内存检查与修补, 内存转储分析, 动态二进制分析, 恶意软件分析, 文件格式解析, 断点与监视点, 用户态模拟, 系统调用追踪, 跨平台分析, 逆向工程