ForAllSecure/bncov
GitHub: ForAllSecure/bncov
Binary Ninja 插件,用于导入、可视化和脚本化分析动态执行覆盖率数据,帮助研究人员理解代码路径执行情况。
Stars: 136 | Forks: 17
# bncov - 用于覆盖率分析和可视化的可脚本化 Binary Ninja 插件
bncov 提供了一个可脚本化的接口,用于将覆盖率信息与 Binary Ninja 的静态分析和可视化功能相结合。除了可视化之外,bncov 中的抽象还允许对覆盖率进行编程推理。它的设计既支持交互式 GUI 使用,也可以作为更大分析任务和独立脚本的组件。

这个插件是作为回馈社区的一种方式提供的,不是 Mayhem 产品的一部分。如果你对 Mayhem(结合了符号执行和模糊测试的系统)感兴趣,请访问 [forallsecure.com](http://forallsecure.com)。
## 更新日志 (CHANGELOG)
2023 年 2 月:现已支持 drcov 格式版本 3。
2021 年 10 月:API 的一些变更:
- 添加了一个基于 Binary View 键控的 `ctx` 对象以及辅助函数 `bncov.get_ctx` 和 `bncov.get_covdb`,以支持 UI 中的多二进制文件用例,现在你可以跨标签页交互式地使用 bncov 了!
- 将旧的辅助函数 `bncov.get_bv`/`bncov.get_covdb` 分别更改为 `bncov.make_bv`/`bncov.make_covdb`,用于从目标文件制作 Binary View 以及从二进制文件和覆盖率目录制作 covdb。
- 所有与函数相关的 covdb 成员函数现在默认使用函数起始地址而不是名称作为键,因为函数起始地址是唯一的,并且在许多应用程序中更可用。额外的可选参数或辅助函数实现了现有的行为。
- 放弃 Python2 支持
- 为“懒人”添加了 `download_dynamorio.py`
- 轻微的生活质量修复
## 安装
最简单的方法是通过 Binary Ninja 插件管理器安装!
通过插件管理器安装时的唯一区别是,当你看到 `import bncov` 时,你需要写成 `import ForAllSecure_bncov as bncov`。
或者:
- 将此目录克隆或复制到你的 binja 插件文件夹中。
([此处有更详细的说明](https://docs.binary.ninja/guide/plugins/index.html#using-plugins))
- (可选)pip install msgpack,如果你想启用加载/保存覆盖率数据库文件的功能。
## 使用方法
查看 [教程](/tutorial/) 以获取完整的演练或如何立即开始使用此仓库中已包含的数据!
首先收集 DynamoRIO 的 drcov 格式的覆盖率信息
([示例脚本](/dr_block_coverage.py))。
在 Binary Ninja GUI 中使用:
1. 打开目标二进制文件,然后使用 `bncov/Coverage Data/Import *` 中的命令之一导入覆盖率文件,可以从 Tools 菜单或上下文(右键单击)菜单访问。
2. 探索覆盖率可视化,并通过右键单击菜单或使用内置解释器(`import bncov` 后跟 `covdb = bncov.get_covdb(bv)`)探索其他分析。
脚本编写:
1. 确保 bncov 的父目录在你的模块搜索路径中,或者在脚本顶部将其添加到 sys.path,如下所示:
`sys.path.append(os.path.split(os.path.normpath('/path/to/bncov'))[0])`
2. `import bncov` 并使用 `coverage.py` 中的 CoverageDB 类编写脚本,查看 `scripts` 文件夹以获取示例。
## 截图
导入包含跟踪文件的覆盖率目录,以查看以热图方式着色的块:被大多数跟踪覆盖的块(蓝色)或被少数跟踪覆盖的块(红色)。额外的上下文命令(右键菜单)包括边缘高亮和每个函数的块覆盖率报告。
* 监视目录,以便在出现新覆盖率文件时自动高亮显示新的覆盖率结果

* 一目了然地查看哪些块仅被一个或少数跟踪覆盖(越红越稀有,越蓝越常见)

* 通过可视化或脚本快速发现稀有功能

* 识别哪些块具有在跟踪中未覆盖的出边

* 查看关于感兴趣功能的覆盖率报告或哪些功能可能未被触及,或者编写你自己的分析脚本进行无头(headless)运行。

## 注意事项
目前,该插件仅处理块覆盖率,并接收 drcov 格式或 "module+offset" 格式的文件。仓库中包含 `dr_block_coverage.py`,可用于生成覆盖率文件,只需通过环境变量指定你的 DynamoRIO 安装位置(或修改脚本),它就可以处理输入目录。DynamoRIO 二进制包可以在[这里](https://github.com/DynamoRIO/dynamorio/wiki/Downloads)找到,或者你可以使用包含的 `download_dynamorio.py` 脚本。请参阅[教程](/tutorial/)以获取完整的演练。
请在 GitHub 上将任何功能请求/错误作为 issue 提出,我们欢迎任何意见或反馈。
## 脚本编写
bncov 的设计允许用户直接与插件使用的数据结构进行交互。有关更多想法,请参阅 `scripts/` 目录。
* 有用的 CoverageDB 成员:
* trace_dict(将文件名映射到基本块起始地址集合)
* block_dict(将基本块起始地址映射到包含它的文件)
* total_coverage(被覆盖的基本块起始地址集合)
* 有用的 CoverageDB 函数:
* get_traces_from_block(addr) - 获取覆盖起始地址为 addr 的基本块的文件。
* get_rare_blocks(threshold) - 获取被 <= 'threshold' 个跟踪覆盖的块
* get_frontier() - 获取具有未被覆盖出边的块
* get_functions_from_blocks(blocks, by_name=False) - 返回将函数起始/名称映射到其包含的块的字典
* get_traces_from_function(function_start) - 返回在指定函数中具有覆盖率的跟踪集合
* get_traces_from_function_name(function_name, demangle=False) - 返回在指定函数中具有覆盖率的跟踪集合
* 你可以使用 Binary Ninja 的 python 控制台和内置的 python 集合操作,配合 bncov.highlight_set() 在 Binary Ninja UI 中进行自定义高亮。
标签:Binary Ninja, DrCov, GUI, Mayhem, Mutation, Python, 二进制分析, 云安全运维, 云资产清单, 代码覆盖率, 可视化, 插件, 无后门, 符号执行, 覆盖率分析, 逆向工具, 逆向工程