MASTG-TOOL-0031 Frida
Frida は Ole André Vadla Ravnås によって書かれたフリーでオープンソースの動的コード計装ツールキットで、QuickJS JavaScript エンジン (以前は Duktape と V8) を計装されたプロセスに注入することで機能します。Frida は Android と iOS (および その他のプラットフォーム) のネイティブアプリで JavaScript のスニペットを実行できます。
インストール
Frida をローカルにインストールするには、以下を実行するだけです。
pip install frida-tools
また詳細については インストールページ を参照してください。
動作モード
コードはいくつかの方法で注入できます。たとえば、Xposed は Android アプリローダーを永続的に変更し、新しいプロセスが開始されるたびに独自のコードを実行するためのフックを提供します。 対照的に、Frida はプロセスメモリに直接コードを書き込むことでコードインジェクションを実装します。実行中のアプリにアタッチすると、以下のようになります。
Frida は ptrace を使用して実行中のプロセスのスレッドをハイジャックします。このスレッドはメモリのチャンクを割り当て、ミニブートストラッパーを投入するために使用されます。
ブートストラッパーは新しいスレッドを開始し、デバイス上で動作している Frida デバッグサーバーに接続し、Frida エージェント (
frida-agent.so
) を含む共有ライブラリをロードします。エージェントはツール (Frida REPL やカスタム Python スクリプトなど) への双方向通信チャネルを確立します。
ハイジャックされたスレッドは元の状態に復元された後に再開し、プロセスの実行は通常通り続行します。
Frida アーキテクチャ, 情報源: https://www.frida.re/docs/hacking/
Frida には三つの動作モードがあります。
Injected: これは frida-server が iOS または Android デバイスでデーモンとして実行されている場合の最も一般的なシナリオです。frida-core は TCP で公開され、デフォルトで localhost:27042 でリッスンします。このモードでの実行は、ルート化や脱獄を行われていないデバイスでは不可能です。
Embedded: これはデバイスがルート化や脱獄を行われていない (権限のないユーザーとして ptrace を使用できない) 場合です。あなたには手作業で、または objection などのサードパーティツールを介して、アプリに frida-gadget ライブラリを埋め込むことにより、インジェクションを行う責任があります。
Preloaded:
LD_PRELOAD
やDYLD_INSERT_LIBRARIES
に似ています。frida-gadget を自律的に実行し、ファイルシステム (Gadget バイナリが存在する場所への相対パスなど) からスクリプトをロードするように設定できます。
API
選択したモードに関係なく、Frida JavaScript API を使用して、実行中のプロセスおよびそのメモリとやり取りできます。基本的な API には以下のものがあります。
Interceptor: Interceptor API を使用する場合、Frida は関数のプロローグにトランポリン (別名インラインフック) を注入します。これはカスタムコードへのリダイレクトを引き起こし、コードを実行して、元の関数に戻ります。私たちの目的には非常に効果的ですが、これはかなりのオーバーヘッド (トランポリンに関連したジャンプとコンテキストスイッチによる) をもたらし、元のコードを上書きしてデバッガと同様に動作 (ブレークポイントの設定) を行うため、透過的であるとはみなすことはできず、たとえば定期的に独自のコードのチェックサムを行うアプリケーションによって、同様の方法で検出される可能性があることに注意してください。
Stalker: トレースの要件に透明性、パフォーマンス、高い粒度を含む場合には、Stalker が選択すべき API です。Stalker API でコードをトレースする場合、Frida はジャストインタイムの動的再コンパイルを (Capstone を使用して) 活用します。スレッドが次の命令を実行しようとすると、Stalker はメモリを割り当て、オリジナルのコードをコピーし、計装のためにそのコピーをカスタムコードとインタレースします。最後に、そのコピーを実行します (オリジナルのコードはそのままにしておくので、アンチデバッグチェックは回避します)。このアプローチは計装のパフォーマンスを大幅に向上し、トレース時に非常に高い粒度を可能にします (CALL または RET 命令のみをトレースするなど)。より詳細については Frida の作者 Ole によるブログ投稿 "Anatomy of a code tracer" [#vadla] をご覧ください。Stalker の使用例としては who-does-it-call や diff-calls などがあります。
Java: Android で作業する場合、この API を使用して、ロードされたクラスを列挙したり、クラスローダーを列挙したり、特定のクラスインスタンスを作成して使用したり、ヒープをスキャンしてクラスのライブインスタンスを列挙することなどができます。
ObjC: iOS で作業する場合、この API を使用して、登録されているすべてのクラスのマッピングを取得したり、特定のクラスやプロトコルのインスタンスを登録または使用したり、ヒープをスキャンしてクラスのライブインスタンスを列挙することなどができます。
Frida 17
Frida 17 では、Frida の GumJS ランタイム内にバンドルされていたランタイムブリッジ (frida-{objc,swift,java}-bridge
) を削除するなど、重大な変更 をもたらしています。つまり、必要なブリッジは frida-pm install
を使用して明示的にインストールする必要があります。
frida-pm install frida-java-bridge
ただし、コマンド frida
と frida-trace
には Java, Objective-C, Swift ブリッジがあらかじめバンドルされているので、これらのコンテキストでは手動でインストールしなくても使用できます。ブリッジの詳細については Frida ドキュメント を参照してください。
Frida はネイティブ API に変更を加えました。これらの変更により既存のスクリプトの一部が動作しなくなる可能性がありますが、より読みやすくパフォーマンスの高いコードを書くことができるようになります。たとえば、Process.enumerateModules()
は Module
オブジェクトの配列を返すようになり、それらを直接操作できるようになりました。
for (const module of Process.enumerateModules()) {
console.log(module.name);
}
削除されたもう一つの API は Module.getSymbolByName
で、これは多くのスクリプトで使用されています。シンボルがどのモジュールにあるか分かっているかどうかに応じて、以下の二つの代替手段のいずれかを使用できます。
// If you know the module
Process.getModuleByName('libc.so').getExportByName('open')
// If you don't (i.e., the old Module.getSymbolByName(null, 'open'); )
Module.getGlobalExportByName('open');
詳細については Frida 17.0.0 リリースノート を参照してください。
ツール
また Frida は Frida API 上に構築されたシンプルなツールもいくつか提供しており、pip 経由で frida-tools をインストールした後、ターミナルからすぐに利用できます。たとえば、以下があります。
Frida CLI (
frida
) を使用して、スクリプトのプロトタイピングや試行錯誤のシナリオをすばやく実行できます。frida-ps
はデバイス上で動作しているすべてのアプリ (またはプロセス) の名前、識別子、PID を含むリストを取得します。frida-ls-devices
は Frida サーバーやエージェントを実行している接続されたデバイスをリストします。frida-trace
は iOS アプリの一部であるメソッド、または Android ネイティブライブラリ内に実装されているメソッドをすばやくトレースします。
さらに、以下のようなオープンソースの Frida ベースのツールもいくつかあります。
Grapefruit: iOS 用のランタイムアプリケーション計装ツールキット。
Fridump: Android と iOS の両方に対応したメモリダンプツール。
objection: ランタイムモバイルセキュリティ評価フレームワーク。
r2frida: 強力な radare2 のリバースエンジニアリング機能と Frida の動的計装ツールキットを統合したプロジェクト。
JNITrace: ネイティブライブラリによる Android JNI ランタイムメソッドの使用を追跡するツール。
ガイド全体でこれらのツールをすべて使用します。
これらのツールはそのまま使用することも、ニーズに合わせて調整することも、API の使用方法に関する優れた例とすることもできます。例としてこれらを使用すると、独自のフックスクリプトを作成するときや、リバースエンジニアリングワークフローをサポートするイントロスペクションツールを構築するときに非常に役立ちます。
Last updated
Was this helpful?