Frida スクリプトの永続化¶
FIRERPA は Frida スクリプトを永続化する機能を提供します。関連インタフェースを通じて手軽にスクリプトを注入でき、FIRERPA のスクリプトマネージャが注入されたスクリプトを自動管理します。スクリプトが異常終了した場合やアプリプロセスが終了した場合でも、FIRERPA はアプリが次回起動されたときに自動でスクリプトを再注入します。
スクリプトのインストール¶
スクリプトを対象アプリにインストールします。インストール後、スクリプトは直ちにそのアプリに注入されます。インストールされたスクリプトは自動的にスクリプトマネージャに登録され、マネージャがスクリプトの状態を継続的に監視し、必要に応じて再注入します。
注目
スクリプトマネージャは、1つのアプリに対して同時に1つのスクリプトのみ注入できます。同じアプリに複数のスクリプトを同時に注入することはできません。
app = d.application("com.android.settings")
app.attach_script(script, runtime=ScriptRuntime.RUNTIME_QJS, standup=5)
script パラメータは注入する Frida スクリプトの内容(バイトコードもサポート)を指定します。runtime パラメータは対応するランタイム環境(デフォルトは qjs)を指定します。standup パラメータは注入の遅延時間(秒)を表し、アプリのプロセスが起動してから指定秒数後にのみ注入を行います(時間はプロセス生成から計測)。このパラメータは最小1秒、最大300秒で、早すぎる注入によるクラッシュや競合状態を回避します。スポーンモードでは、このパラメータは常に0に設定してください。
このインタフェースはスポーンモード注入もサポートしますが、注意点として、スポーンモードを使用するとUI操作フローが中断される可能性があります。なぜなら、スポーンモードでは、注入スクリプトに異常が発生した場合やアプリが終了した場合に、自動的にアプリが再起動されるため、画面上の操作に干渉する可能性があるからです。スポーンモードを使用する必要がある場合は、以下のパラメータを使用してください。
app = d.application("com.android.settings")
app.attach_script(script, runtime=ScriptRuntime.RUNTIME_QJS, spawn=True, standup=0)
スポーンモードと通常モードの違いに注意してください。通常モードでは、アプリが何らかの理由で終了した場合、通常モードはアプリが起動するのを待ってから注入を実行し、勝手にアプリを起動することはありません。そのため、注入を継続するにはコードによる操作や手動でのアプリ起動が必要になる場合があります。一方、スポーンモードでは、アプリが終了しても自動的にアプリを起動し、注入を実行します。
インストールの解除¶
アプリにインストールされている 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 起動後に自動的にそのスクリプトを読み込む機能です。上記の 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 設定を更新または削除すると、システムがそれに応じて自動的にスクリプトの注入を更新または解除します。
フィールド説明¶
データ報告 (emit) 機能の詳細については、Frida を使用したデータ報告 の章を参照してください。