Lighthouse 是一款功能强大的代码覆盖率浏览器,适用于 IDA Pro 和 Binary Ninja,为软件研究人员提供独特的交互式控制,使其无需符号或源代码即可研究原生应用程序的执行映射。
本项目在 IDA 的 2017 年插件竞赛 中获得第二名,并因其对安全研究行业的贡献而在 2021 年 Pwnie Awards 中获得提名。
特别感谢 @0vercl0k 提供的灵感。
Lighthouse 是一款跨平台(Windows、macOS、Linux)的 Python 2/3 插件。它没有任何第三方依赖,使代码既便携又易于安装。
请根据您使用的反汇编器使用以下说明。
import idaapi, os; print(os.path.join(idaapi.get_user_idadir(), "plugins"))/plugins/ 文件夹的内容复制到所列目录中。Lighthouse 可以通过 Binary Ninja 的插件管理器安装,支持 v3.5 及更新版本。
Edit -> Preferences -> Manage PluginsEnable 按钮。正确安装后,反汇编器中会出现几个新的菜单项。这些是用户加载覆盖率数据并开始使用 Lighthouse 的入口点。
Lighthouse 能够加载几种不同“风格”的覆盖率数据。要生成可加载到 Lighthouse 中的覆盖率数据,请查看本仓库 coverage 目录中的 README。
在使用 Lighthouse 时,它会在反汇编器中所有可用的代码查看器上“着色”当前活动的覆盖率数据。具体来说,这将应用于您的线性反汇编、图形和反编译器窗口。
在 Binary Ninja 中,仅支持线性反汇编、图形和 IL 视图。随着功能稳定,对 Binary Ninja 中反编译器输出着色的支持将在不久的将来添加到 Lighthouse 中。
覆盖率概览是一个可停靠的窗口部件,一旦覆盖率数据加载到 Lighthouse 中就会打开。
这个交互式窗口部件提供了已加载覆盖率数据的函数级视图。它还包含许多工具,用于管理已加载数据并驱动更高级形式的覆盖率分析。
右键单击覆盖率概览中的表格将弹出一个上下文菜单,其中包含一些基本功能,用于从表格中提取信息,或作为逆向工程过程的一部分操作数据库。
如果您认为还有其他有用的操作可以添加到此上下文菜单中,请提交 issue,它们将被考虑纳入 Lighthouse 的未来版本。
已加载的覆盖率和用户构建的组合可以通过覆盖率组合框进行选择或删除。
Lighthouse 可以生成基本的 HTML 覆盖率报告。示例报告可在此处查看。
覆盖率概览窗口的底部是覆盖率 shell。此 shell 可用于执行基于逻辑的操作,以组合或操作已加载的覆盖率集合。
此功能在探索多次运行之间程序执行的关系时非常有用。换句话说,该 shell 可用于在覆盖率集合之间“diff”执行情况,并提取出在其各自部分的噪声中被掩盖的更深层含义。
覆盖率组合,或如上所示的 Composing,是通过组合 shell 上的简单表达式语法和“简写”覆盖率符号(A 到 Z)实现的。
|, &, ^, -A, B, C, ..., Z, *(...)A 和覆盖率 B 之间共享的执行代码:A & B
A 独有的执行代码:A - B
A 或 B 独有但 C 没有的执行代码:(A | B) - C
表达式可以具有任意长度或复杂度,但组合的求值可能从右到左进行。因此,对于可能产生歧义的表达式,建议使用括号。
此外,还有一种“热 Shell”模式,可以实时异步求值并缓存用户组合。
热 shell 是进入无引导探索组合关系的自然入口。
使用 shell,您可以通过在查询前加上 / 来搜索和过滤覆盖率表中列出的函数。
shell 的头部将显示仅根据剩余函数计算出的更新覆盖率百分比。这在分析特定函数族的覆盖率时非常有用。
在 shell 中输入地址或函数名可用于跳转到表格中相应的函数条目。
在使用 Lighthouse 时,您可以右键单击任何基本块(或指令),并使用“Coverage Xref”操作来查看哪些覆盖率集合执行了所选块。双击任何列出的条目将立即切换到该覆盖率集合。
这与“Coverage Batch”功能配合得很好,后者允许您快速将数千个覆盖率文件加载并聚合到 Lighthouse 中。交叉引用一个块并选择一个“集合”将从磁盘加载“有罪”集合作为新的覆盖率集合,供您独立于批次进行探索。
Lighthouse 附带两个默认主题——一个“浅色”主题和一个“深色”主题。根据您的反汇编器当前使用的颜色,Lighthouse 将尝试选择看起来最合适的主题。
主题文件以简单的 JSON 格式存储在磁盘上,并且高度可配置。如果您对默认主题或颜色不满意,可以创建自己的主题并将其放入用户主题目录中。
Lighthouse 将记住您的主题偏好,以供将来加载和使用。
如果时间和动力允许,未来工作可能包括:
我欢迎外部贡献、issue 和功能请求。如果您希望它们被考虑纳入未来版本,请向本仓库的 develop 分支提交任何 pull request。