为 radare2 自带 frida 的独立插件,允许使用 r2 命令(但不限于)Frida 脚本来检测本地或远程进程。
radare 项目提供了一套完整的逆向工程工具链,它得到积极维护,提供了完善的功能,并可通过其他编程语言和工具扩展其特性。
Frida 是一个动态检测工具包,通过注入你自己的 JavaScript 代码(可选地还可以与脚本通信)来轻松检查并操控正在运行的进程。
:. 命令):db API 设置本地断点r_fs API 访问远程文件系统推荐通过 r2pm 安装 r2frida:
$ r2pm -ci r2frida
无需编译的二进制构建版本将很快在 r2pm 和 r2env 中得到支持。同时,欢迎从 Releases 页面 下载最新构建。
在 GNU/Debian 上需要安装以下软件包:
$ sudo apt install -y make gcc libzip-dev nodejs npm curl pkg-config git
$ git clone https://github.com/nowsecure/r2frida.git
$ cd r2frida
$ make
$ make user-install
radare2(而不是 radare2-x.y.z)preconfigure.bat)configure.bat,然后运行 make.bat要进行测试,使用 r2 frida://0,因为在 frida 中附加到 pid0 是一个在本地运行的特殊会话。现在你可以运行 :? 命令来获取可用命令列表。
$ r2 'frida://?'
r2 frida://[action]/[link]/[device]/[target]
* action = list | apps | attach | spawn | launch
* link = local | usb | remote host:port
* device = '' | host:port | device-id
* target = pid | appname | process-name | program-in-path | abspath
本地:
* frida://? # 显示此帮助
* frida:// # 列出本地进程
* frida://0 # 附加到 frida-helper(无需 spawn)
* frida:///usr/local/bin/rax2 # 要生成的绝对路径
* frida://rax2 # 同上,假设 local/bin 在 PATH 中
* frida://spawn/$(program) # 在当前系统中生成新进程
* frida://attach/(target) # 附加到当前宿主机上的目标 PID
USB:
* frida://list/usb// # 列出第一个 USB 设备上的进程
* frida://apps/usb// # 列出第一个 USB 设备上的应用
* frida://attach/usb//12345 # 附加到第一个 USB 设备上指定 PID
* frida://spawn/usb//appname # 在第一个解析到的 USB 设备上生成应用
* frida://launch/usb//appname # 在第一个 USB 设备上生成并恢复应用
远程:
* frida://attach/remote/10.0.0.3:9999/558 # 通过 TCP 远程 frida-server 附加到 PID 558
环境变量:(使用 `%` 命令在运行时更改环境)
R2FRIDA_SAFE_IO=0|1 # 解决 Android/thumb 上 Frida 的一个 bug 的变通方法
R2FRIDA_DEBUG=0|1 # 用于调试参数解析行为
R2FRIDA_COMPILER_DISABLE=0|1 # 禁用新的 frida typescript 编译器(`:. foo.ts`)
R2FRIDA_AGENT_SCRIPT=[file] # r2frida agent 脚本文件的路径
$ r2 frida://0 # 等同于 frida -p 0,连接到一个本地会话
你可以按名称或 PID 附加、派生或启动任何程序。以下命令将附加到第一个名为 rax2 的进程(在另一个终端中运行 rax2 - 来测试这一行)
$ r2 frida://rax2 # 附加到第一个名为 `rax2` 的进程
$ r2 frida://1234 # 附加到指定 PID
使用二进制文件的绝对路径来生成进程:
$ r2 frida:///bin/ls
[0x00000000]> :dc # 继续执行目标程序
也支持带参数:
$ r2 frida://"/bin/ls -al"
对于 iOS/Android 应用的 USB 调试,使用以下操作。注意 spawn 可以用 launch 或 attach 替换,进程名可以是 bundleid 或 PID。
$ r2 frida://spawn/usb/ # 枚举设备
$ r2 frida://spawn/usb// # 枚举第一个 iOS 设备上的应用
$ r2 frida://spawn/usb//Weather # 运行天气应用
以下是最常用的命令,你需要学习它们,并在后面加上 ? 来获取子命令帮助。
:i # 获取目标的信息(PID、名称、家目录、架构、位数等)
.:i* # 将目标进程的详细信息导入本地 r2
:? # 显示所有可用命令
:dm # 列出映射。使用 `:dm|head` 并 seek 到程序基地址
:iE # 列出当前二进制文件的导出(seek)
:dt fread # 跟踪 'fread' 函数
:dt-* # 删除所有跟踪
r2frida 插件运行在 agent 端,并通过 r2frida.pluginRegister API 注册。
有关更多示例插件脚本,请参阅 plugins/ 目录。
[0x00000000]> cat example.js
r2frida.pluginRegister('test', function(name) {
if (name === 'test') {
return function(args) {
console.log('Hello Args From r2frida plugin', args);
return 'Things Happen';
}
}
});
[0x00000000]> :. example.js # 加载插件脚本
:. 命令的工作原理类似于 r2 的 . 命令,但在 agent 内部运行。
:. a.js # 运行注册插件的脚本
:. # 列出插件
:.-test # 按名称卸载插件
:.. a.js # 永久运行脚本(分离后继续运行)
如果你希望在 Termux 上在 Android 本地安装和使用 r2frida,由于某些符号解析问题,库依赖方面会有一些注意事项。使其工作的方法是在 Termux 的 libdir 之前,将 LD_LIBRARY_PATH 环境变量扩展到指向系统目录。
$ LD_LIBRARY_PATH=/system/lib64:$LD_LIBRARY_PATH r2 frida://...
确保你使用的是现代版本的 r2(最好是最近发布的版本或 git 版本)。
运行 r2 -L | grep frida 来验证插件是否已加载。如果没有输出内容,请使用 R2_DEBUG=1 环境变量来获取调试信息以查明原因。
如果你在编译 r2frida 时遇到问题,可以使用 r2env 或从 GitHub Releases 页面获取发布构建版本。请注意,只有大版本号必须匹配,例如 r2-5.7.6 可以加载在任何 5.7.0 到 5.7.8 版本之间编译的插件。
+---------+
| radare2 | radare2 工具,位于其余部分之上
+---------+
:
+----------+
| io_frida | r2frida io 插件
+----------+
:
+---------+
| frida | Frida 宿主机 API 及与目标交互的逻辑
+---------+
:
+-------+
| app | 被 Frida 通过 JavaScript 检测的目标进程
+-------+
本插件由 pancake 又名 Sergi Alvarez(radare2 的作者)为 NowSecure 开发。
我要感谢 Ole André 编写并维护了 Frida,并且非常友好地主动修复 bug,以及在使这一结合得以实现所需的一切技术细节上进行讨论。谢谢你。