以下に説明するすべての手順は macOS Mojave 上で行われます。
pip3 を使用してfrida-tools
インストールする
コマンド$ pip --version
および$ pip3 --version
を実行して、どのpipがPython 3xからのものであるかを確認します。たとえば、次のようなバージョン情報が表示されるはずです。
$ pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
次に、適切なpipコマンドを実行してfrida-tools
インストールします (例: pip3
$ pip3 install frida-tools
成功の出力:
....
Successfully built frida-tools frida
Installing collected packages: colorama, frida, six, wcwidth, prompt-toolkit, pygments, frida-tools
Successfully installed colorama-0.4.1 frida-12.4.7 frida-tools-1.3.2 prompt-toolkit-2.0.9 pygments-2.3.1 six-1.12.0 wcwidth-0.1.7
インストールのテスト
cat
バイナリを一時フォルダー ( /tmp/cat
など) にコピーし、そのディレクトリからcat
実行します。
$ mkdir ~ /frida
$ cp /bin/cat /frida/cat
$ /frida/cat
別のターミナルで、次の内容のファイルexample.py
を作成します。
import frida
def on_message ( message , data ):
print ( "[on_message] message:" , message , "data:" , data )
session = frida . attach ( "cat" )
script = session . create_script ( """'use strict';
rpc.exports.enumerateModules = function () {
return Process.enumerateModulesSync();
};
""" )
script . on ( "message" , on_message )
script . load ()
print ([ m [ "name" ] for m in script . exports . enumerate_modules ()])
次に、以下のコマンドでexample.py
スクリプトを実行します。
$ python3 example.py
出力は次のようになります (プラットフォームとライブラリのバージョンによって異なります)。
[ u'cat' , …, u'ld-2.15.so' ]
Androidのadb
コマンド
adb
デバイスを認識できることを確認します。
$ adb devices -l
これにより、デスクトップ上で adb デーモンが確実に実行されるようになり、USB または WiFi のどちらを介して接続されているかに関係なく、Frida がデバイスを検出して通信できるようになります。
frida-server
インストールします以下の手順は、macOS Majave 上のAndroid エミュレータ Nexus 6P (x86) API 23 に基づいています。
まず、frida-server リリース ページから Android 用の最新のfrida-server
ダウンロードします。たとえば、Android x86
エミュレータの場合は、frida-server-12.4.7-android-x86.xz をダウンロードし、エミュレータで実行する必要があります。
$ adb root # might be required
$ adb push frida-server /data/local/tmp/
$ adb shell " chmod 755 /data/local/tmp/frida-server "
$ adb shell " /data/local/tmp/frida-server & "
最後のステップで、以下のエラーが表示された場合:
Unable to load SELinux policy from the kernel: Failed to open file “/sys/fs/selinux/policy”: Permission denied
次に、root シェルを使用してfrida-server
実行する必要があります。
$ adb shell
angler:/ $ su
angler:/ # /data/local/tmp/frida-server &
[1] 12089
angler:/ #
[1] 12089
frida-server
のプロセス ID です。
次に、デスクトップで基本が機能していることを確認します。走る:
frida-ps -U
これにより、次のようなプロセス リストが表示されます。
PID Name
----- ---------------------------------------------------
721 ATFWD-daemon
4450 adbd
730 [email protected]
407 [email protected]
408 [email protected]
409 [email protected]
410 [email protected]
406 [email protected]
Java ソース コード内のBoolean
値を改ざんするには、 Boolean bTamperingSucces = false;
使用します。 、または興味のあるその他のコード。
apktool
Apktool Web サイトから入手できます。このページ内の手順に従って apktool をインストールしてください。
adb
は Android SDK に同梱されており、ディレクトリ<your-some-path>/Android/sdk/platform-tools/adb
から見つけることができます。
apksigner
、キーストア ファイルを使用して APK に署名します。このツールはディレクトリ<ANDROID_HOME>/Android/sdk/build-tools/28.0.3/apksigner
にあり、使用方法はコマンドライン apksigner に記載されています。
DecompileApk からサンプル プロジェクトのクローンを作成します。
コンパイル済みの APK ファイルDecompileApk/app/release/app-release.apk
を見つけます。
apktoolを使用して逆コンパイルします。
$ cd < your-path > /DecompileApk/app/release/
$ apktool d --no-res -f app-release.apk
以下の出力が表示されます
I: Using Apktool 2.4.0 on app-release.apk
I: Copying raw resources...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
smali コード ディレクトリでDecompileApk/app/release/app-release/smali/com/arophix/decompileapk/MainActivity.smali
を探し、以下のコードを見つけます。
const / 4 p1 , 0x0
0x0
( false
を意味する) を0x1
( true
意味する) に変更して、ファイルを保存するだけです。
apktool を使用して改ざんされた APK をビルドする。
apktool b app - release
以下の出力が表示されるはずです
I: Using Apktool 2.4.0
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether resources has changed...
I: Copying raw resources...
I: Copying libs... (/lib)
I: Building apk file...
I: Copying unknown files/dir...
I: Built apk...
dist
ディレクトリから新しくビルドされた APK を見つけますDecompileApk/app/release/app-release/dist/app-release.apk
DecompileApk/app/decompileapk.jks
にあるapksignerとキーストアを使用して APK に署名します (キーストアと APK のパスは状況に応じて変更してください)。
$ < ANDROID_HOME > /sdk/build-tools/28.0.3/apksigner sign --ks ../decompileapk.jks app-release.apk
以下の出力が表示され、パスワード123456
を入力します。
Keystore password for signer # 1:
adb コマンドを使用して署名付き APK をインストールします。
$ adb install < path-to-the-tampered-apk > /app-release.apk
画面に"Hello from C++"
と表示される代わりに、 "Hello, Android reverse engineer!"
と表示されるはずです。 。
Frida を使用した Android Java ソース コードのフック。
hook_java_methods.py からスクリプトを見つけて、以下のコマンドを使用して実行し、開始した Android アプリのボタンをクリックします。
$ python3 hook_java_methods.py
[ * ] Running CTF
[ * ] onClick
[ * ] Called - isPhoneRooted ()
[ * ] onClick
[ * ] Called - isPhoneRooted ()
以下のようなエラーが表示された場合:
$ frida.ServerNotRunningError: unable to connect to remote frida-server: closed
エミュレータ上でfrida-server
起動していることを思い出してください。
一方、エミュレータ画面では、成功した場合、トースト メッセージがDevice not rooted
に変更されるのが表示されるはずです。
Frida を使用して Android C ソース コードをフックします。
APKを逆コンパイルする
まず、apktool を使用して apk を逆コンパイルし、共有ライブラリ (つまりlibnative-lib.so
を抽出します。
$ cd DecompileApk/app/release
$ apktool d --no-res app-release.apk
ターゲットの JNI メソッドを見つける
次に、以下のコマンドを使用して、フックする JNI 関数を見つけます。
$ nm --demangle --dynamic app-release/lib/x86/libnative-lib.so
以下の出力が表示されるはずです。
00004d80 T Java_com_arophix_decompileapk_MainActivity_stringFromJNI
000090b0 T std::bad_typeid::what () const
00005cf0 T std::bad_exception::what () const
00005e70 T std::bad_array_length::what () const
00005df0 T std::bad_array_new_length::what () const
00008ff0 T std::bad_cast::what () const
...
C 関数を名前でフックする
hooknative-by-function-name.py からスクリプトを見つけて、以下のコマンドを使用して実行し、起動した Android アプリのボタンをクリックします。
$ python3 hooknative-by-function-name.py
[ * ] Running Arophix Hook Test ...
Java_com_arophix_decompileapk_MainActivity_stringFromJNI called with:
ret: 0x200019
以下のようなエラーが表示された場合:
$ frida.ServerNotRunningError: unable to connect to remote frida-server: closed
エミュレータ上でfrida-server
起動していることを思い出してください。
一方、エミュレータ画面では、テキストがFrida is hooking this displayed text from Native layer by function name.
成功すれば。
アドレスによるフック C 関数
hooknative-by-function-address.py からスクリプトを見つけて、以下のコマンドを使用して実行し、起動した Android アプリのボタンをクリックします。
$ python3 hooknative-by-function-address.py
[ * ] Running Arophix Hook Test ...
[+] membase: 0xb2acd000
[+] addressOfStringFromJni: 0xb2ad1d80
[++] addressOfStringFromJni: 0xb2ad1d80
ret: 0x19
以下のようなエラーが表示された場合:
$ frida.ServerNotRunningError: unable to connect to remote frida-server: closed
エミュレータ上でfrida-server
起動していることを思い出してください。
一方、エミュレータ画面では、テキストがFrida is hooking this displayed text from Native layer by function address.
成功すれば。