Frida の使い方のチュートリアルとバグのまとめ

前科

Androidを習い始めてからFridaやXposedをよく使いますが、オンラインの独学への道のりは難しく、その過程で多くの問題に遭遇したので、今後の復習のために勉強ノートにしたいと思います。ゆっくり更新

学習で遭遇するより重要な Web サイトは次のとおりです。
Frida 公式ドキュメント
Frida 紹介の概要
Frida 公式 github

フリーダのインストール

インストールプロセス

詳細な写真のプロセスはFrida Getting Started Summaryで見ることができます

私の個人的なインストール経験と組み合わせた要約プロセスは次のとおりです。

フリーダのコンピューターへのインストール:

  1. frida必要な環境、python3をインストールします。
  2. fridaモジュールをインストールし、pip install frida
  3. をインストールするにはfrida-tools、pip install frida-tools

フリーダの電話へのインストール:

  1. 携帯電話のアーキテクチャを確認してください。adb shell cat /proc/cpuinfo私が 64 ビットであるか
    ここに画像の説明を挿入、CPU プロセッサの数adb shell getprop ro.product.cpu.abiを取得するためにわかります: . armeabi-v7a (32 ビット ARM デバイス). arm64-v8a (64 ビット ARM デバイス)ここに画像の説明を挿入
  2. Download frida-sever、公式ダウンロード アドレス: https://github.com/frida/frida/releases。ダウンロードを高速化するにはプロキシが必要になる場合があります。
    最初に、pip install によってコンピューターにインストールされている frida のバージョンを確認します。frida --version次に、携帯電話のアーキテクチャを確認し、適切なダウンロード バージョンを選択します。
  3. ダウンロードしたfrida-server圧縮パッケージを解凍し、解凍したファイルを で携帯電話にadb push 文件 /data/local/tmp(手机位置)入れます。
  4. frida-server携帯電話に保存するための実行権限を付与し、su権限に注意しないと先に進めません。adb shell携帯電話のコマンドライン入力、su権限取得、保存frida-server場所入力、cd /data/local/tmp実行権限付与に使用chmod 777 文件名

走る

  1. ./文件名実行 (管理者権限なし、つまり、suレポートは使用されませんPermission Denied)
  2. コンピューター側で別のコマンド ラインを開始し、それを使用して、電話側で実行されているプログラムfrida-ps -U | grep fridaがあるかどうかを確認しますfrida(Windows システムで使用されますfrida-ps -U | findstr frida)。
  3. 後はスクリプトを書いて実行するだけです(ポートフォワーディングが必要です)

ファーウェイの携帯電話

セグメンテーション違反

SELinux ポリシーをカーネルに保存できません: メモリ不足です セグメンテーション エラー

ファーウェイの携帯電話
一部の Huawei 携帯電話 (Huawei 携帯電話のみかどうかはわかりません) を使用するとFrida、エラーが報告される場合がありますUnable to save SELinux policy to the kernel: Out of memory Segmentation fault. インターネットで解決するには 2 つの方法があります。

  1. Setenforce 0 詳細はリンク先https://github.com/frida/frida/issues/473
    を参照、現在成功できるかどうかは不明
  2. 詳細については、カーネルを再コンパイルします。リンクを参照してください
    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 を例にとります (インストールは完了しています)

  1. コンピューター側でスクリプト hookApi.py を記述します
  2. コンピューター側のポート転送、使用方法adb forward tcp:27043 tcp:27043、およびadb forward tcp:27042 tcp:27042コマンド
  3. 携帯電話で frida を実行し、
    PC で携帯電話に接続しroot、frida ファイルが保存されているフォルダーに入り、./文件名起動 (実行できない場合は、ファイル名を chmod 777 することを忘れないでください) し、&バックグラウンドで起動します。
  4. コンピューター側で 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の使い方と例

おすすめ

転載: blog.csdn.net/m0_54352040/article/details/115734161