这是一个包含大量裸机好料的大版本。Barebone agent 使用 Rust 编写并嵌入 GumJS devkit, 之前只支持 XNU。现在它也能运行在 Linux 内核中,由一个小型 C shim 提供内核粘合层。
agent 被打包为 .ko:使用 insmod 加载,然后通过 /dev/frida 交换带长度前缀的 GVariant 消息。
将 Barebone 后端配置为使用该传输,并在设备上运行 frida-server --device=barebone。
下图是它在我的 Pixel 6 Pro 上运行的样子:

为你的设备构建模块
发布页面提供了面向 none-arm64-softfloat 目标的 GumJS devkit。你不需要自行构建 Gum。
下面的步骤将为 Pixel 6 Pro 制作 frida-agent.ko。其他 arm64 Linux 系统使用相同步骤,只需换用不同内核。
请在 x86-64 Linux 主机上完成构建。内核构建树中包含 x86-64 程序。
-
安装工具:
sudo apt-get install build-essential clang binutils-aarch64-linux-gnu rustup target add aarch64-unknown-none rustup component add rust-srcclang 必须为 19 或更高版本。GCC 未实现软浮点 ABI。
-
下载源码:
git clone --recurse-submodules https://github.com/frida/frida-core.git cd frida-core -
下载 devkit:
version=17.17.0 base=https://github.com/frida/frida/releases/download/$version curl -LO $base/frida-gumjs-devkit-$version-none-arm64-softfloat.tar.xz mkdir -p ~/gumjs-devkit tar -C ~/gumjs-devkit -xf frida-gumjs-devkit-$version-none-arm64-softfloat.tar.xz -
下载 SDK:
releng/deps.py sync sdk none-arm64-softfloat_nopic ~/sdk-none-arm64-softfloat_nopicSDK 包含 picolibc 和 compiler-rt builtins。devkit 需要它们。
-
从设备读取内核版本:
adb shell uname -r 6.1.145-android14-11-gc1de4747ac59-ab14219743名称以 GKI commit 和构建号结尾。这里的 commit 是
c1de4747ac59,构建号是14219743。 -
下载内核文件:
commit=c1de4747ac59 build=14219743 ci=https://ci.android.com/builds/submitted/$build/kernel_aarch64/latest/raw mkdir -p ~/kernel-prepared ~/kernel-source curl -sSL $ci/modules_prepare_outdir.tar.gz | tar -xz -C ~/kernel-prepared curl -sSL $ci/kernel_aarch64_Module.symvers -o ~/kernel-prepared/Module.symvers curl -sSL https://android.googlesource.com/kernel/common/+archive/$commit.tar.gz \ | tar -xz -C ~/kernel-source -
构建模块:
make -C src/barebone/agent/linux \ FRIDA_SDK=$HOME/sdk-none-arm64-softfloat_nopic \ GUMJS_DEVKIT_DIR=$HOME/gumjs-devkit \ AGENT_LD=aarch64-linux-gnu-ld \ AGENT_AR=aarch64-linux-gnu-ar \ AGENT_NM=aarch64-linux-gnu-nm \ AGENT_OBJCOPY=aarch64-linux-gnu-objcopy \ KDIR=$HOME/kernel-source \ KOUT=$HOME/kernel-prepared \ LLVM=1 -
加载模块:
adb push src/barebone/agent/linux/frida-agent.ko /data/local/tmp/ adb shell su -c 'insmod /data/local/tmp/frida-agent.ko'
该模块只能加载到与构建时完全相同的内核上。内核会精确比较版本字符串。即便是同一内核分支的不同构建也无法工作。
更多信息请阅读module README。
完整更改日志:
- gumjs:修复 JS 内部的原生故障被后续处理器恢复后,分离时挂起的问题。 现在当线程存活时,我们会重新平衡 Interceptor 事务,而不是将其结束两次。感谢 @pandasauce 报告此问题并帮助追查。
- arm64:检测跳入正在重定位的范围的分支,防止 Interceptor 重写某个分支后,使其落在自身重定向补丁中间。 感谢 @WHW0x455 提供此修复。
- python:修复
attach()的linker_notifier_offsets关键字参数,恢复Script.enable_debugger()的默认端口,并恢复对远程设备和相关 API 的证书选项进行编组。 - barebone:支持将 agent 作为 Linux 内核模块运行。agent 现在以
.ko形式在目标内部启动, 暴露用于传输的字符设备,并可通过普通的frida-server --device=barebone实例访问。 - deps:添加一个由 picolibc 和 compiler-rt 组成的软浮点裸机 SDK。这为
none-arm64-softfloat变体提供了在通用寄存器中传递浮点值方面保持一致的 libc 和运行时。 - deps:在 CI 中构建软浮点 SDK,在花时间安装工具链之前检查已发布的 bundle,将 libc 头文件排除在 devkit 头文件外, 使用 SDK 作为 sysroot,并确保配置时的链接检查能正确解析 libc。
- deps:升级 GLib、libffi 和 QuickJS,以获得 freestanding 修复、向量汇编器指令修复、优先级爬升解析器和相应的 x18 修复。
- arm64:在软浮点目标上,通过为
memcpy、指针扫描和 Interceptor 的寄存器重排使用标量回退,避免 FP 和 SIMD 代码。 - gumjs:在裸机上限制 QuickJS 栈,重新启用其栈检查,使解析器在耗尽这类主机可能提供的小栈之前停止。
oleavr