返回更新列表
新发布Aug 10, 2026

r2frida v6.2.0

Radare2 和 Frida 强强联手。

分享

r2frida

Radare2 和 Frida 强强联合 ci radare2

描述

radare2 自带 frida 的独立插件,允许使用 r2 命令(但不限于)Frida 脚本来检测本地或远程进程。

radare 项目提供了一套完整的逆向工程工具链,它得到积极维护,提供了完善的功能,并可通过其他编程语言和工具扩展其特性。

Frida 是一个动态检测工具包,通过注入你自己的 JavaScript 代码(可选地还可以与脚本通信)来轻松检查并操控正在运行的进程。

特性

  • 运行未经修改的 Frida 脚本(使用 :. 命令)
  • 在任何进程中执行 C、JavaScript 或 TypeScript 代码片段
  • 可附加、派生或启动本地或远程系统中的进程
  • 列出段、符号、导出、协议、类、方法
  • 在 agent 内或宿主机上搜索内存中的值
  • 通过简短命令替换方法实现或创建钩子
  • 在目标进程中加载库和框架
  • 支持 Dalvik、Java、ObjC、Swift 和 C 接口
  • 操作文件描述符和环境变量
  • 向进程发送信号、继续执行、设置断点
  • r2frida io 插件同时也是文件系统 fsdebug 后端
  • 使用 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 命令
  • 使用 :db API 设置本地断点
  • 使用 r_fs API 访问远程文件系统

安装

推荐通过 r2pm 安装 r2frida:

$ r2pm -ci r2frida

无需编译的二进制构建版本将很快在 r2pmr2env 中得到支持。同时,欢迎从 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 可以用 launchattach 替换,进程名可以是 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,以及在使这一结合得以实现所需的一切技术细节上进行讨论。谢谢你。

分类