持久化 Frida 脚本¶
LAMDA 为您提供了持久化 Frida 脚本的能力,您可以通过相关接口便捷的注入脚本,LAMDA 的脚本管理器会自动为您管理注入的脚本。即使您的脚本异常退出或者 APP 进程退出,LAMDA 仍然会在您的 APP 下次打开之时自动为您重新注入脚本。该功能 7.80 版本引入。
安装脚本¶
您可以使用此接口来将您的脚本安装到相关应用,您安装到该应用的脚本将会在安装后立即注入相关应用。安装的脚本会自动进入脚本管理器,管理器将会为您时刻监控并重新注入。需要注意,脚本管理器只允许每个 APP 注入一个脚本,您无法对相同应用注入多个脚本。
app = d.application("com.android.settings")
app.attach_script(script, runtime=ScriptRuntime.RUNTIME_QJS, standup=5)
script 参数为您需要注入的 frida 脚本内容(支持字节码),runtime 为对应的 runtime,默认为 qjs
,standup 参数意义为仅当 APP 进程启动 5 秒后才进行注入(时间从进程创建开始计算),此参数最低为 1 秒,最高为 300 秒,避免过早的注入应用进程而引起崩溃等其他的竞争性条件问题,在 spawn 模式时,该参数应始终为 0。
该接口也支持 spawn 模式注入,但是请注意,使用 spawn 模式可能会中断您的 UI 操作流(如果您需要同时操作 UI 的话),因为一旦您使用 spawn 模式,在注入脚本异常或者应用退出的情况下,该模式会自动重新唤起应用从而会对您的界面操作产生干扰,如果您需要使用 spawn 模式,请使用如下参数。
app = d.application("com.android.settings")
app.attach_script(script, runtime=ScriptRuntime.RUNTIME_QJS, spawn=True, standup=0)
需要注意 spawn 模式与普通模式有区别,普通模式下,应用如果因为某些原因退出,普通模式将一直等到应用启动才会执行注入,不会擅自启动应用,所以可能需要您自行通过代码或者手动的方式启动应用才会继续注入。而在 spawn 模式下,即使应用退出,也会自动启动应用并执行注入。
取消安装¶
本接口将会移除已经安装在应用中的 Frida 脚本,该脚本也将被从应用进程脱离,同时 LAMDA 的脚本管理器也将不再监控该脚本的健康状态,也不会在脚本异常后继续进行重新注入等相关操作。
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
等相关控制台日志以及脚本的报错信息均可查看,但是您需要提前在启动时进行设置,请在启动 LAMDA 服务 (launch.sh) 时添加如下的命令参数,该参数会将服务的所有日志记录到 server.log 文件中。
--logfile=/data/local/tmp/server.log
随后,在需要查看日志的时候执行如下命令,这将过滤出所有的注入脚本的日志信息。
grep SCRIPT /data/local/tmp/server.log
脱机持久化¶
脱机持久化是指您可以将您的 FRIDA 脚本作为配置文件放置到手机上,在 LAMDA 启动后会自动加载您的 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
上述示例脚本配置中每个配置项的详细解释
enable 是否启用此脚本
application 注入脚本的应用ID(如 com.android.setting)
version 注入脚本支持应用的版本( "N/A" 代表不限版本)
user 如果是多开应用,请指定为多开应用的用户ID(通常为 999)
script 脚本的内容,支持文本或者 binary,如果您不熟悉 yaml,请按照如上格式将原始脚本 base64 编码后替换字符串
runtime 脚本的 runtime
standup 延迟注入的时间(从进程启动时间计算)
spawn 使用 spawn 模式(将会忽略 standup)
encode 如果脚本存在数据上报,在此指定编码(zlib/none)
emit 如果脚本存在数据上报,在此指定目的
以上是一个完整的脱机脚本示例,编写完成后,请将上述内容的配置文件保存名称为 {file_name}.yaml
的文件并放置到设备的 /data/usr/modules/script
文件夹,系统将会自动加载您的配置。系统会自动检测 /data/usr/modules/script
目录的改动,如果您更新或者删除了 yaml 配置,系统也会自动更新或者取消注入您的脚本。