DavidCatalan/fridacov
GitHub: DavidCatalan/fridacov
基于 Frida 的 JavaScript 模块,用于在动态插桩脚本中添加代码覆盖率采集功能并生成 Lighthouse 兼容的 drcov 文件。
Stars: 26 | Forks: 1
# 简介
该项目是在业余时间为学习目的而创建的。在分析某些 Windows 恶意软件时,我意识到能够向标准代码覆盖率工具添加一些自定义插桩逻辑可能会很有趣。因此,这个项目旨在通过实验 Frida 来创建一个模块,以便在现有工具无法满足的使用场景中获取代码覆盖率信息。
要了解更多关于所提到的工具(它们可能更适合您的需求),请务必查看 [Lighthouse](https://github.com/gaasedelen/lighthouse)。该仓库包含 [frida-drcov.py](https://github.com/gaasedelen/lighthouse/tree/master/coverage/frida),这是本项目的起点。特别感谢其作者 [yrp604](https://github.com/yrp604) 以及维护 Lighthouse 和 [Frida](https://github.com/frida/frida) 的社区所做的出色工作。
该项目由 2 个 JS 模块组成:
* **fridacov.js**:用于从进程中检索覆盖率信息的插桩代码。旨在被包含所需额外逻辑的插桩脚本导入。
* **covdump.js**:收集覆盖率信息并生成 drcov 文件以供 Lighthouse 加载。旨在被 frida 工具导入,需要 NodeJS 绑定(查看 [frida-drcov.py](https://github.com/gaasedelen/lighthouse/tree/master/coverage/frida) 了解 Python 代码)。
### 注意
我不是专业的 NodeJS/JS 开发人员,实际上我只在配合 Frida 时才使用它。如果您在代码中发现任何愚蠢的错误(potato),或者任何对 Frida API 的误用,请告诉我,正如前面所说,该项目的主要目标是学习。
# 需求
* Frida 和 NodeJS 绑定。
* 您自己使用 V8 runtime 的工具。```session.enableJit()```
# 用法
## fridacov.js
将其导入到您的插桩代码中。该脚本导出一个名为 **cover** 的函数,该函数接收以下参数:
* **threadList**:要获取覆盖率信息的 TID 数组。可以使用 \['all'\](如 [frida-drcov.py](https://github.com/gaasedelen/lighthouse/tree/master/coverage/frida) 中所示)
* **whitelist**:模块名称列表。来自其他模块的基本块将被丢弃。也接受 \['all'\]。
* **interceptNew**:同时也跟踪新线程,目前仅限 Windows。默认为 false。
* **customModules**:模块对象数组。允许定义自定义模块以从中获取覆盖率。(例如,在解包程序进程的上下文中执行的被解压 dll)。默认为空数组。**工作中(WORK IN PROGRESS)**,目前只能为这种用例获取部分覆盖率信息,因为看起来有相当数量的基本块在开始时丢失了。
代码示例:
```
const fridacov = require("./fridacov.js");
[..]
const threadlist = ['all'];
const moduleWhitelist = ['all'];
const intercetpNew = true;
const customModules = [{
path: 'C:\...', // You need to provide a path to the file you are going to apply the coverage info to
or IDA/Lighthouse will complain. You can put whatever and edit the resulting log file manually.
base: ptr(0xDEADBEEF),
size: ptr(0x666),
}, {...}];
fridacov.cover(threadList, moduleWhitelist, interceptNew, customModules);
[...]
```
要使其工作,您需要运行 [frida-compile](https://github.com/frida/frida-compile) 并将生成的脚本注入到目标进程中。
```
frida-compile instrumentationScriptRequiringFridaCov.js -o compiled.js
```
## covdump.js
将其导入到您的 Frida 工具中,将必要的代码添加到您的消息逻辑中,并调用 covdump.save() 来生成日志文件。
```
const covdump = require('./covdump.js');
[...]
script.message.connect((message, data) => {
[...]
} else if (message.payload.type === "bbs") {
console.log("[+] Receiving coverage info");
covdump.collect(data);
} else if (message.payload.type === "mmap") {
console.log("[+] Module info received.");
covdump.setModuleInfo(message.payload.content);
}
});
[...]
covdump.save();
```
# 演示用例
希望从被 Gootkit 解密、加载并执行的 dll 中获取覆盖率信息,且在原始样本的上下文中进行。经过几行插桩代码后,您可以到达 payload 的 EP(入口点),然后开始覆盖率记录。

将生成的日志文件加载到 Lighthouse 后。

尽管在此过程中丢失了一些基本块(悲伤的故事)。

标签:Conpot, DAST, Docker支持, drcov, Frida, GNU通用公共许可证, Hook技术, JS模块, Lighthouse, Node.js, Windows安全, 二进制分析, 云安全运维, 云资产清单, 代码覆盖率, 恶意软件分析, 插桩, 数据可视化, 自定义脚本, 自定义脚本, 逆向工程