gaasedelen/lighthouse

GitHub: gaasedelen/lighthouse

一款用于 IDA Pro 和 Binary Ninja 的代码覆盖率可视化插件,帮助逆向工程师在无源码环境下直观分析原生程序的执行路径映射。

Stars: 2509 | Forks: 330

# Lighthouse - 逆向工程师的覆盖率浏览器

Lighthouse Plugin

## 概述 Lighthouse 是一个强大的代码覆盖率浏览器,适用于 [IDA Pro](https://www.hex-rays.com/products/ida/) 和 [Binary Ninja](https://binary.ninja/),为软件研究人员提供了独特的交互式控件,以便在没有符号或源代码的情况下研究原生应用程序的执行映射。 该项目在 IDA 的 [2017 年插件大赛](https://hex-rays.com/contests_details/contest2017/)中获得第二名,并因对安全研究行业的贡献随后在 2021 年 Pwnie Awards 中获得[提名](https://pwnies.com/lighthouse/)。 特别感谢 [@0vercl0k](https://twitter.com/0vercl0k) 提供的灵感。 ## 版本发布 * v0.9 -- Python 3 支持,自定义覆盖率格式,覆盖率交叉引用,主题子系统,更多功能。 * v0.8 -- Binary Ninja 支持,HTML 覆盖率报告,一致的样式,许多调整和错误修复。 * v0.7 -- Frida,C++ 反修饰 (demangling),上下文菜单,函数前缀,调整和错误修复。 * v0.6 -- Intel pintool,圈复杂度,批量加载,错误修复。 * v0.5 -- 搜索,IDA 7 支持,许多改进和稳定性提升。 * v0.4 -- 大多数计算现在都是异步的,错误修复。 * v0.3 -- 覆盖率组合,交互式组合 Shell。 * v0.2 -- 多文件支持,性能改进,错误修复。 * v0.1 -- 初始版本 # 安装 Lighthouse 是一个跨平台 (Windows, macOS, Linux) 的 Python 2/3 插件。它零第三方依赖,使得代码既便携又易于安装。 请根据您的反汇编器使用以下说明进行安装。 ## IDA 安装 1. 在 IDA 的 Python 控制台中,运行以下命令以找到其插件目录: - `import idaapi, os; print(os.path.join(idaapi.get_user_idadir(), "plugins"))` 2. 将此代码库的 `/plugins/` 文件夹的内容复制到列出的目录中。 3. 重启您的反汇编器。 ## Binary Ninja 安装 Lighthouse 可以通过 Binary Ninja 的插件管理器安装,支持 v3.5 及更新版本。 1. 通过导航以下子菜单打开 Binary Ninja 的插件管理器: - `Edit` -> `Preferences` -> `Manage Plugins` 2. 在插件管理器中搜索 Lighthouse,然后点击右下角的 `Enable` 按钮。 3. 重启您的反汇编器。 # 使用方法 一旦安装完成,反汇编器中将出现一些新的菜单项。这些是用户加载覆盖率数据并开始使用 Lighthouse 的入口点。

Lighthouse Menu Entries

Lighthouse 能够加载几种不同“风味”的覆盖率数据。要生成可以加载到 Lighthouse 中的覆盖率数据,请查看此代码库覆盖率目录中的 [README](https://github.com/gaasedelen/lighthouse/tree/master/coverage)。 ## 覆盖率绘制 在使用 Lighthouse 时,它会在反汇编器中所有可用的代码查看器上“绘制”活动的覆盖率数据。具体来说,这将应用于您的线性反汇编、图形和反编译窗口。

Lighthouse Coverage Painting

在 Binary Ninja 中,仅支持线性反汇编、图形和 IL 视图。随着该功能趋于稳定,Binary Ninja 中对反编译输出的绘制支持将在*不久的将来*添加到 Lighthouse 中。 # 覆盖率概览 Coverage Overview 是一个可停靠的小部件,一旦覆盖率加载到 Lighthouse 中就会打开。

Lighthouse Coverage Overview

这个交互式小部件提供了已加载覆盖率数据的函数级视图。它还包含许多工具,用于管理已加载的数据并驱动更高级形式的覆盖率分析。 ## 上下文菜单 右键单击 Coverage Overview 中的表格将产生一个上下文菜单,其中包含一些基本的便利功能,用于从表格中提取信息,或作为逆向工程过程的一部分操作数据库。

Lighthouse Context Menu

如果您认为有任何其他操作可能有助于添加到此上下文菜单中,请提交 issue,它们将被考虑用于 Lighthouse 的未来版本。 ## 覆盖率下拉框 已加载的覆盖率和用户构建的组合可以通过覆盖率下拉框进行选择或删除。

Lighthouse Coverage ComboBox

## HTML 覆盖率报告 Lighthouse 可以生成基础的 HTML 覆盖率报告。可以在此处查看示例报告[点击查看](https://rawgit.com/gaasedelen/lighthouse/master/testcase/report.html)。

Lighthouse HTML Report

# 覆盖率 Shell 在覆盖率概览窗口的底部是覆盖率 Shell。这个 Shell 可用于执行基于逻辑的操作,以组合或操作已加载的覆盖率集合。

Lighthouse Coverage Composition

此功能在探索多次运行之间的程序执行关系时极其有用。换句话说,该 Shell 可用于对覆盖率集合之间的执行进行“diff(差异对比)”,并提取出被各个部分的噪声所掩盖的深层含义。 ## 组合语法 如上所示,覆盖率组合(或称 *Composing*)是通过组合 Shell 上的简单表达式语法和“速记”覆盖率符号(A 到 Z)来实现的。 ### 语法标记 * 逻辑运算符:`|, &, ^, -` * 覆盖率符号:`A, B, C, ..., Z, *` * 括号:`(...)` ### 组合示例 1. 覆盖率 `A` 和覆盖率 `B` 之间 *共享* 的已执行代码: ``` A & B ``` 2. 仅对覆盖率 `A` *唯一* 的已执行代码: ``` A - B ``` 3. 对 `A` 或 `B` 唯一,但对 `C` 不唯一的已执行代码: ``` (A | B) - C ``` 表达式可以是任意长度或复杂度,但组合的求值可能会从右向左进行。因此,对于可能有歧义的表达式,建议使用括号。 ## 热力 Shell 此外,还有一种“热力 Shell”模式,可以实时异步评估和缓存用户的组合。

Lighthouse Hot Shell

热力 Shell 充当了通向组合关系非引导式探索的自然入口。 ## 搜索 使用 Shell,您可以通过在查询前加上 `/` 来搜索和过滤覆盖率表中列出的函数。

Lighthouse Search

Shell 的头部将显示仅根据剩余函数计算的更新后的覆盖率 %。这在分析特定函数族的覆盖率时非常有用。 ## 跳转 在 Shell 中输入地址或函数名称可用于跳转到表中相应的函数条目。

Lighthouse Jump

# 覆盖率交叉引用 在使用 Lighthouse 时,您可以右键单击任何基本块(或指令)并使用“Coverage Xref”操作来查看哪些覆盖率集合执行了选定的块。双击任何列出的条目将立即切换到该覆盖率集合。

Lighthouse Xref

这与“Coverage Batch”功能配合得很好,该功能允许您快速将数千个覆盖率文件加载并聚合到 Lighthouse 中。交叉引用一个块并选择一个“集合”将从磁盘加载该“有罪”的集合作为一个新的覆盖率集合,以便您独立于批次进行探索。 # 主题 Lighthouse 附带两个默认主题——一个“light(浅色)”主题和一个“dark(深色)”主题。根据您的反汇编器当前使用的颜色,Lighthouse 将尝试选择看起来最合适的主题。

Lighthouse Themes

主题文件以简单的 JSON 形式存储在磁盘上,并且高度可配置。如果您对默认主题或颜色不满意,可以创建自己的主题并简单地将它们放入用户主题目录中。 Lighthouse 会记住您的主题偏好,以便未来加载和使用。 # 未来工作 如果时间和动力允许,未来的工作可能包括: * 催促 Vector35 修复 Binary Ninja 中的 HLIL 高亮 ([bug](https://github.com/Vector35/binaryninja-api/issues/2584)) * ~~异步组合、绘制、元数据收集~~ * ~~多文件/覆盖率支持~~ * 基于性能分析的热力图/绘制 * 覆盖率和性能分析树状图 * ~~额外的覆盖率源、跟踪格式等~~ * 改进的伪代码绘制 * ~~Lighthouse 控制台访问~~,无头模式使用 * ~~自定义主题~~ * ~~Python 3 支持~~ 我欢迎外部贡献、问题和功能请求。如果您希望它们被考虑用于未来的版本,请向此代码库的 `develop` 分支提交 Pull Request。 # 作者 * Markus Gaasedelen ([@gaasedelen](https://twitter.com/gaasedelen))
标签:Binary Ninja 插件, Docker支持, Frida, IDA Pro 插件, Intel Pin, Python, TLS抓取, 二进制分析, 云安全运维, 云资产清单, 代码覆盖率, 恶意代码分析, 插件, 无后门, 无源码分析, 汇编, 覆盖率可视化, 软件安全, 逆向工具, 逆向工程, 配置文件