
r2frida v6.2.0
Radare2 和 Frida 强强联手。
r2frida
描述
为 radare2 自带 frida 的独立插件,允许使用 r2 命令(但不限于)Frida 脚本来检测本地或远程进程。
radare 项目提供了一套完整的逆向工程工具链,它得到积极维护,提供了完善的功能,并可通过其他编程语言和工具扩展其特性。
Frida 是一个动态检测工具包,通过注入你自己的 JavaScript 代码(可选地还可以与脚本通信)来轻松检查并操控正在运行的进程。
特性
- 运行未经修改的 Frida 脚本(使用
:.命令) - 在任何进程中执行 C、JavaScript 或 TypeScript 代码片段
- 可附加、派生或启动本地或远程系统中的进程
- 列出段、符号、导出、协议、类、方法
- 在 agent 内或宿主机上搜索内存中的值
- 通过简短命令替换方法实现或创建钩子
- 在目标进程中加载库和框架
- 支持 Dalvik、Java、ObjC、Swift 和 C 接口
- 操作文件描述符和环境变量
- 向进程发送信号、继续执行、设置断点
- r2frida io 插件同时也是文件系统 fs 和 debug 后端
- 使用 r2pipe 自动化 r2 和 frida
- 读/写进程内存
- 调用函数、系统调用和原始代码片段
- 通过 USB 或 TCP/IP 连接到 frida-server
- 枚举应用和进程
- 跟踪寄存器、函数参数
- 在 x64、arm32 和 arm64 架构的 Linux、Windows、macOS、iOS 和 Android 上经过测试
- 不需要宿主机安装 frida(无需 frida-tools)
- 通过运行在 agent 中的插件扩展 r2frida 命令
- 更改页面权限、修补代码和数据
- 按名称或地址解析符号,并将其作为标记导入 r2
- 从 agent 中在宿主机上运行 r2 命令
- 在远程目标进程内部使用 r2 API 并运行 r2 命令
- 使用
:dbAPI 设置本地断点 - 使用
r_fsAPI 访问远程文件系统
安装
推荐通过 r2pm 安装 r2frida:
$ r2pm -ci r2frida
无需编译的二进制构建版本将很快在 r2pm 和 r2env 中得到支持。同时,欢迎从 Releases 页面 下载最新构建。
编译
依赖
- radare2
- pkg-config(Windows 上不需要)
- curl 或 wget
- make、gcc
- npm、nodejs(很快将被移除)
在 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
Windows
- 安装 meson 和 Visual Studio
- 将最新 radare2 发布版本的 zip 解压到 r2frida 根目录
- 将其重命名为
radare2(而不是 radare2-x.y.z) - 使 VS 编译器在 PATH 中可用(
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
如果你希望在 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,以及在使这一结合得以实现所需的一切技术细节上进行讨论。谢谢你。