Frida の使い方のチュートリアルとバグのまとめ
前科
Androidを習い始めてからFridaやXposedをよく使いますが、オンラインの独学への道のりは難しく、その過程で多くの問題に遭遇したので、今後の復習のために勉強ノートにしたいと思います。ゆっくり更新
学習で遭遇するより重要な Web サイトは次のとおりです。
Frida 公式ドキュメント
Frida 紹介の概要
Frida 公式 github
フリーダのインストール
インストールプロセス
詳細な写真のプロセスはFrida Getting Started Summaryで見ることができます
私の個人的なインストール経験と組み合わせた要約プロセスは次のとおりです。
フリーダのコンピューターへのインストール:
frida
必要な環境、python3をインストールします。frida
モジュールをインストールし、pip install frida- をインストールするには
frida-tools
、pip install frida-tools
フリーダの電話へのインストール:
- 携帯電話のアーキテクチャを確認してください。
adb shell cat /proc/cpuinfo
私が 64 ビットであるか
、CPU プロセッサの数adb shell getprop ro.product.cpu.abi
を取得するためにわかります: . armeabi-v7a (32 ビット ARM デバイス). arm64-v8a (64 ビット ARM デバイス)- Download
frida-sever
、公式ダウンロード アドレス: https://github.com/frida/frida/releases。ダウンロードを高速化するにはプロキシが必要になる場合があります。
最初に、pip install によってコンピューターにインストールされている frida のバージョンを確認します。frida --version
次に、携帯電話のアーキテクチャを確認し、適切なダウンロード バージョンを選択します。- ダウンロードした
frida-server
圧縮パッケージを解凍し、解凍したファイルを で携帯電話にadb push 文件 /data/local/tmp(手机位置)
入れます。frida-server
携帯電話に保存するための実行権限を付与し、su
権限に注意しないと先に進めません。adb shell
携帯電話のコマンドライン入力、su
権限取得、保存frida-server
場所入力、cd /data/local/tmp
実行権限付与に使用chmod 777 文件名
走る
./文件名
実行 (管理者権限なし、つまり、su
レポートは使用されませんPermission Denied
)- コンピューター側で別のコマンド ラインを開始し、それを使用して、電話側で実行されているプログラム
frida-ps -U | grep frida
があるかどうかを確認しますfrida
(Windows システムで使用されますfrida-ps -U | findstr frida
)。- 後はスクリプトを書いて実行するだけです(ポートフォワーディングが必要です)
ファーウェイの携帯電話
セグメンテーション違反
SELinux ポリシーをカーネルに保存できません: メモリ不足です セグメンテーション エラー
一部の Huawei 携帯電話 (Huawei 携帯電話のみかどうかはわかりません) を使用するとFrida
、エラーが報告される場合がありますUnable to save SELinux policy to the kernel: Out of memory Segmentation fault
. インターネットで解決するには 2 つの方法があります。
- Setenforce 0 詳細はリンク先https://github.com/frida/frida/issues/473
を参照、現在成功できるかどうかは不明- 詳細については、カーネルを再コンパイルします。リンクを参照してください
https://github.com/frida/frida/issues/1039Huawei
Honor 6x カーネルのコンパイルと変更 PTRACE xposed/frida をインストールし、ro.debuggable レコードを開きます
私が使用するテスト マシンは华为P10
、Frida を実行すると、携帯電話とコンピューターの間の接続が切断される可能性があるというものです. Segmentation fault
再接続して、もう一度または数回実行しようとすると、レポートのみが表示されます , セグメントFrida
エラーUnable to save SELinux policy to the kernel: Out of memory
はありません、その後の使用には影響しません。
magisk
再ルートを使用した後、エラーは発生しません。
注:这里具体情况我也不是很清楚,只是记录一下我的经历,或可给需要的人提供些信息
フリーダ基本チュートリアル
実行中のプロセス: python を例にとります (インストールは完了しています)
- コンピューター側でスクリプト hookApi.py を記述します
- コンピューター側のポート転送、使用方法
adb forward tcp:27043 tcp:27043
、およびadb forward tcp:27042 tcp:27042
コマンド- 携帯電話で frida を実行し、
PC で携帯電話に接続しroot
、frida ファイルが保存されているフォルダーに入り、./文件名
起動 (実行できない場合は、ファイル名を chmod 777 することを忘れないでください) し、&
バックグラウンドで起動します。- コンピューター側で python hookApi.py を使用する
ポート転送コマンド
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
フリーダフック
Frida Hook が使用する JS スクリプトの書き方 (公式チュートリアル: JavaScript API )
フリーダ フック Java 関数
var my_class = Java.use('%s');
console.log("%s test")
my_class.%s.overload(%s).implementation = function(){
var ret = this.%s.overload(%s).apply(this, arguments);
var para_string = 'param: '
for(var i=0; i<arguments.length;i++){
para_string += arguments[i] + ' ' //函数参数获取
}
}
hook 类中类时要使用$符号链接类,例如Hook android.provider.Settings$Secure类
Frida フック クラスの静的関数
Frida フック クラスのすべての関数
フリーダフック ネイティブ層
ネイティブ レイヤーとはほとんど関係がありません. この部分については、Frida Getting Started Summary のフック ネイティブ レイヤーを参照してください。
フリーダの高度なチュートリアル
私の Frida の使用はまだ比較的基本的なものであり、学習する必要がある場合は後で追加します
Frida ファイルの読み書き
js コードでファイルを直接読み書きできますが、注意が必要です。
読み書き権限がない場合は、Android によってアプリケーションに割り当てられたファイル ストレージの場所しか読み取れません。
var file = new File("/sdcard/text.txt","a+");//a+表示追加内容,此处的模式和c语言的fopen函数模式相同
file.write(content + "\n");
file.flush()
file.close();
フリーダ python インターフェイス
Frida JS スクリプトを作成した後、上位インターフェイスに python と JS を注入できます。私が最もよく使用するのは python スクリプトです。
現在開いているアプリのパッケージ名を取得する
adb shell dumpsys window | findstr mCurrentFocus
python フリーダを起動
import frida
PACKAGE = "com.didiglobal.passenger"
frida_session = None
global script
script = None
if __name__ == '__main__':
device = frida.get_device_manager().enumerate_devices()[-1]
resume = False
try:
frida_session = device.attach(PACKAGE)
print("[INFO] Attach Success" )
except Exception as e:
pid = device.spawn(PACKAGE)
frida_session = device.attach(pid)
resume = True
print("[INFO] Spawn and attach success")
load_script()
# 注入js脚本,其中
# script = frida_session.create_script(hook_script)
# script.load()
if resume:
device.resume(pid)
sys.stdin.read(1)
script.unload()
exit(0)
Python プロセスと Frida 間の通信
jsコードで関数を使用し、send
外部のpythonプロセスでon_message
受信関数を使用すると、send
送信されたデータがjson形式で出力されます
def on_message(message, data):
if 'send' == message['type']:
save_message(message['payload'])
def create_hookjs():
jscode = """
console.log("Script loaded successfully");
Java.perform(function(){
var jni_env = Java.vm.getEnv();
send(jni_env);
return ret;
}
"""
return jscode
def load_script():
global script
if script is not None:
script.unload()
hook_script = create_hookjs()
script = frida_session.create_script(hook_script)
script.on('message', on_message)
script.load()
コンソールはコマンド ラインの印刷に使用され、その機能には、ログ、警告、エラーの 3 つのレベルがあります。
エラー概要
更新が遅い
1. ポート転送 frida.ServerNotRunningError: リモート frida-server に接続できません
エラー メッセージ:
frida.ServerNotRunningError: リモート frida-server に接続できません
ポート転送を設定する
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
2. Frida エラー: 住所が無効です
エラーメッセージ:
{“タイプ”:“エラー”,“説明”:“エラー: 無効なアドレス”,“スタック”:“エラー: 無効なアドレス\n Object.value [パッチコードとして] (frida/runtime/core.js:170: 1)\n Jt で (frida/node_modules/frida-java-bridge/lib/android.js:945:1)\n zt.activate で (frida/node_modules/frida-java-bridge/lib/android.js: 998:1)\n Ut.replace (frida/node_modules/frida-java-bridge/lib/android.js:1045:1)\n Function.set [実装として] (frida/node_modules/frida-java- bridge/lib/class-factory.js:1010:1)\n Function.set [実装として] (frida/node_modules/frida-java-bridge/lib/class-factory.js:925:1)\n at installLaunchTimeoutRemovalInstrumentation (/internal-agent.js:249:24)\n at init (/internal-agent.js:33:3)\n at c.perform (frida/node_modules/frida-java-bridge/lib/vm. js:11:1)\n at g._performPendingVmOps (frida/node_modules/frida-java-bridge/index.js:238:1)","fileName":“frida/runtime/core.js”,“lineNumber”:170,“columnNumber”:1}
解決策: SELinux を無効にする
$ su
$ setenforce 0
3. ポートが使用されています 起動できません: アドレス 127.0.0.1:27042 へのバインド エラー: アドレスは既に使用されています
開始できませ
ん: アドレス 127.0.0.1:27042 へのバインド中にエラーが発生しました: アドレスは既に使用されています
バックグラウンドで frida を実行しているため、ここでこの問題が発生します。そのため、frida を再実行すると、
frida-ps -U | findstr frida
コマンドが使用され、ここでまだ実行されていることがわかります。
4. 接続に失敗しました: pid xxxx のプロセスが frida-agent の読み込みを拒否したか、注入中に終了しました
添付
に失敗しました: pid xxx のプロセスが frida-agent の読み込みを拒否したか、注入中に終了しました
frida をバックグラウンドで実行するように設定しましたが、途中で停止して再度使用すると、このような問題が発生するため、ルート ID を使用しkill xxx(frida-pid)
て
より良いチュートリアル
フリーダ紹介まとめ
フリーダからエントリーまで - Android逆新人のフリーダ食べ方
FRIDA-APIの使い方:rpc、Process、Module、Memoryの使い方と例