IDA安装
通过在ida的python console输入下面代码获取plugin路径(下面获取的一般是C盘的用户路径,C:\Users\XXXX\AppData\Roaming\Hex-Rays\IDA Pro\plugins),或者你直接放到IDA根目录的plugins文件夹
1 | import idaapi, os; print(os.path.join(idaapi.get_user_idadir(), "plugins")) |
知道路径后将lighthouse项目的plugins文件夹的lighthouse文件夹和lighthouse_plugin.py放到plugins目录即可
重新打开IDA,就可以看到加载文件那里多了Code coverage file
覆盖率文件生成
DynamoRIO
DynamoRIO就是针对windows,很简单(我使用的是DynamoRIO-Windows-8.0.0-1,据说Lighthouse默认使用的drcov文件版本为version 2,但是最新版的DynamoRIO生成的drcov文件的版本为version 3)
1 | bin64\drrun.exe -t drcov -- XXX.exe |
pin
官方指南: https://github.com/gaasedelen/lighthouse/blob/develop/coverage/pin/README.md
下载pin tools: https://www.intel.com/content/www/us/en/developer/articles/tool/pin-a-binary-instrumentation-tool-downloads.html
注意: 下载最新版的无法编译通过,我当时下载的Pin3.13,可以编译通过
编译:
cd lighthouse/coverage/pin
export PIN_ROOT=/root/pin-3.13 #上面下载后解压的pin的路径
export PATH=$PATH:$PIN_ROOT
make # 默认编译intel64
make TARGET=ia32 # 指定编译ia32
pin覆盖率获取
1 | ~/tools/pin-3.13/pin -t obj-intel64/CodeCoverage.so -- ./src/target ./testfile |
使用 -w 命令行标志,可以指示pintool仅对您指定的模块进行插桩,可以加快速度,也大大减少收集的数据量。
1 | ~/tools/pin-3.13/pin -t obj-intel64/CodeCoverage.so -w target -- ./src/target ./testfile |
而且-w可以有多个
1 | ~/tools/pin-3.13/pin -t obj-intel64/CodeCoverage.so -w target -w libcrypto.so.1.1 -- ./src/target ./testfile |
通过frida收集
Frida在移动平台上的支持最好,如iOS或Android,声称对Windows、MacOS、Linux和QNX提供一些支持。实际上, frida-drcov.py 只应用于收集移动应用程序的覆盖数据。
安装Frida
1 | pip install frida |
一旦安装了Frida,可以使用frida-drcov.py
脚本来收集正在运行的进程的覆盖率
1 | python frida-drcov.py <process name | pid> |
默认会生成frida-cov.log覆盖率文件
使用 -o 标志,可以指定覆盖率日志文件的自定义名称/位置:
1 | python frida-drcov.py -o more-coverage.log foo |
以htop为例,首先启动htop,之后执行下面命令
1 | python frida-drcov.py htop |
结束掉htop,之后再结束上面命令,即可生成frida-cov.log,就可以导入到IDA了。