持久化 Frida 脚本

FIRERPA 为您提供了持久化 Frida 脚本的能力,您可以通过相关接口便捷地注入脚本,FIRERPA 的脚本管理器会自动为您管理注入的脚本。即使您的脚本异常退出,或者 APP 进程退出,FIRERPA 仍然会在您的 APP 下次打开之时自动为您重新注入脚本。

安装脚本

将脚本安装到目标应用,安装后脚本会立即注入到该应用。安装的脚本会自动进入脚本管理器,管理器会持续监控并重新注入脚本状态进行重新注入。

注意

脚本管理器只允许每个应用同时注入一个脚本,您不能一次对同一应用注入多个脚本。

app = d.application("com.android.settings")
app.attach_script(script, runtime=ScriptRuntime.RUNTIME_QJS, standup=5)

script 参数为您需要注入的 Frida 脚本内容(支持字节码),runtime 参数为对应的运行时环境(默认 qjs),standup 参数表示延迟注入时间,即仅在应用进程启动 5 秒后才进行注入(时间从进程创建开始计算),此参数最低为 1 秒,最高为 300 秒,避免过早地注入应用进程引起崩溃或其他竞争条件问题。在 spawn 模式下,该参数应始终设为 0。

该接口也支持 spawn 模式注入,但是请注意,使用 spawn 模式可能会中断您的 UI 操作流,因为一旦您使用 spawn 模式,在注入脚本异常或者应用退出的情况下,该模式会自动重新启动应用从而对您的界面操作产生干扰。如果您需要使用 spawn 模式,请使用如下参数。

app = d.application("com.android.settings")
app.attach_script(script, runtime=ScriptRuntime.RUNTIME_QJS, spawn=True, standup=0)

需要注意 spawn 模式与普通模式有区别:普通模式下,应用若因某些原因退出,普通模式会等待应用启动后再执行注入,不会擅自启动应用,因此您可能需要自行通过代码或手动启动应用才能继续注入。而在 spawn 模式下,即使应用退出,也会自动启动应用并执行注入。

取消安装

移除已经安装在应用中的 Frida 脚本,该脚本也会从应用进程中卸载。同时,FIRERPA 的脚本管理器将不再监控该脚本的运行状态,也不会在脚本异常后重新执行注入操作。

app = d.application("com.android.settings")
app.detach_script()

检查是否安装

判断应用是否已安装脚本,您可以根据返回值决定是否需要重新安装。

app = d.application("com.android.settings")
app.is_attached_script()

检查是否注入

检查您安装的脚本当前是否已经注入应用进程。因为即使执行了安装,若应用未启动或脚本存在错误,脚本可能并未注入到应用进程。您可以根据返回值判断是否需要启动相关应用或检查注入脚本是否存在语法错误。

app = d.application("com.android.settings")
app.is_script_alive()

查看脚本日志

您脚本中的 console.log 等相关控制台日志以及脚本的报错信息均可查看,但需要提前在 FIRERPA 启动时进行设置,请参阅 查看日志 章节了解如何设置日志文件。下面假设您已将日志文件设置为 /data/local/tmp/server.log。在需要查看脚本日志时,可以执行以下命令,该命令会过滤出所有注入脚本的日志信息。您也可以通过 tail -f 等命令来持续追踪日志。

grep SCRIPT /data/local/tmp/server.log

脱机持久化

脱机持久化是指您可以将 Frida 脚本作为配置文件放置到手机上,FIRERPA 启动后会自动加载您的 Frida 脚本。您完全不需要使用上述 API 接口进行注入、取消等操作,只需要将脚本文件以特定格式编写并放置到固定目录即可。该功能会实时监控目录,实时加载、卸载和更新脚本。对脚本目录中文件的直接编辑修改也会实时生效。下面是一个简单的 YAML 配置示例,该配置对应的脚本内容为 console.log("Hello From Yaml Script")

enable: true
application: "com.android.settings"
version: "2.10"
user: 0
runtime: "qjs"
script: !!binary "Y29uc29sZS5sb2coIkhlbGxvIEZyb20gWWFtbCBTY3JpcHQiKQ=="
emit: "http://myserver/reportData"
encode: "none"
standup: 10
spawn: false

提示

以上是一个完整的脱机脚本示例,编写完成后,请将上述内容的配置文件保存为 {file_name}.yaml 并放置到设备上的 ~/modules/script 文件夹,系统将会自动加载您的配置。系统会自动检测 ~/modules/script 目录的改动,如果您更新或删除了 yaml 配置,系统也会相应地自动更新或取消注入脚本。

字段描述

字段描述
enable是否启用此脚本
application注入脚本的应用 ID(如 com.android.settings)
version注入脚本支持的应用版本("N/A" 表示不限版本)
user若为多开应用,请指定对应的用户 ID(通常为 999)
script脚本内容(base64 编码),支持文本或二进制格式(请按模板编写)
runtime脚本运行时(qjs、v8)
standup延迟注入时间(自进程启动时计算)
spawn使用 spawn 模式(启用后将忽略 standup)
encode数据上报时的编码方式(zlib 或 none)
emit数据上报的目标 URL

更多关于 emit 数据上报功能,请参阅 使用 Frida 上报数据 章节。