APK.SHは、リバースエンジニアリングのAndroidアプリを簡単にするBASHスクリプトであり、APKを引く、デコード、再構築、パッチするなどの繰り返しタスクを自動化します。
APK.SHは基本的にAPKTOOLを使用して、リソースといくつかのバッシュを分解、デコード、再構築して、FRIDAガジェットインジェクションプロセスを自動化します。また、アプリバンドル/分割APKをサポートしています。
deviceデバイスからapkを引くのは簡単です./apk.sh pull <package_name>
? APKをデコードすることは、実行するのが簡単です./apk.sh decode <apk_name>
? APKを再構築することは、実行されるのは簡単です./apk.sh build <apk_dir>
apk.sh pullます。アプリバンドル/分割APKをサポートします。つまり、分割APKは単一のAPKで結合されます(これはパッチングに役立ちます)。パッケージがアプリバンドル/分割APKである場合、APK.SHはAPKを単一のAPKに結合し、すべてのパブリックリソース識別子を修正します。
apk.sh patch 、frida-gadget.soを開始するためにAPKをパッチします。
Frida-Gadget.soは、計装されるプログラムによってロードされることを意図したFridaの共有ライブラリです(注入された動作モードが適切でない場合)。ライブラリを単にロードするだけで、Frida-Traceなどの既存のFridaベースのツールを使用してライブラリと対話することができます。また、外部の通信なしでファイルシステムからスクリプトを実行できる完全に自律的なアプローチをサポートします。
APKの./apk.sh patch <apk_name> --arch armを適用することは、実行されるのは簡単です。
calsoは、json ./apk.sh patch <apk_name> --arch arm --gadget-conf <config.json>でFridaガジェット構成を指定できます。
#30のように「すでにインターンされている」 apktool dエラーに遭遇した場合、APKをデコードするときにapktoolに渡される--only-main-classesフラグを渡すことができます。
デフォルトのインタラクションでは、Frida GadgetはFrida-Server互換性のあるインターフェイスを公開し、DefaultでLocalHost:27042を聴きます。早期の計装を達成するために、FridaはGadgetのコンストラクター機能ブロックをプロセスにattach()か、通常のspawn() - > attach() - > ...apply instrumentation...手順を通過した後、 resume()を呼び出します。
このブロッキング動作が必要で、プログラムをすぐに起動したい場合、または別のインターフェイスまたはポートでリスニングすることを好む場合は、JSON構成ファイルを使用してこれをカスタマイズできます。
デフォルトの構成は次のとおりです。
{
"interaction" : {
"type" : " listen " ,
"address" : " 127.0.0.1 " ,
"port" : 27042 ,
"on_port_conflict" : " fail " ,
"on_load" : " wait "
}
}ガジェット構成ファイルを--gadget-confオプションでapk.shに渡すことができます。
典型的に提案された構成は次のとおりです。
{
"interaction" : {
"type" : " script " ,
"path" : " /data/local/tmp/script.js " ,
"on_change" : " reload "
}
}script.jsは次のようなものかもしれません:
var android_log_write = new NativeFunction (
Module . getExportByName ( null , '__android_log_write' ) ,
'int' ,
[ 'int' , 'pointer' , 'pointer' ]
) ;
var tag = Memory . allocUtf8String ( "[frida-script][ax]" ) ;
var work = function ( ) {
setTimeout ( function ( ) {
android_log_write ( 3 , tag , Memory . allocUtf8String ( "ping @ " + Date . now ( ) ) ) ;
work ( ) ;
} , 1000 ) ;
}
work ( ) ;
android_log_write ( 3 , tag , Memory . allocUtf8String ( ">--(O.o)-<" ) ) ; adb push script.js /data/local/tmp
./apk.sh patch <apk_name> --arch arm --gadget-conf <config.json>
adb install file.gadget.apk
次のコードを追加して印刷して、スクリプトインタラクションタイプを使用するときに、Frida Codeshareからのスクリプトのconsole.log出力をlogcatします。
// print to logcat the console.log output
// see: https://github.com/frida/frida/issues/382
var android_log_write = new NativeFunction (
Module . getExportByName ( null , '__android_log_write' ) ,
'int' ,
[ 'int' , 'pointer' , 'pointer' ]
) ;
var tag = Memory . allocUtf8String ( "[frida-script][ax]" ) ;
console . log = function ( str ) {
android_log_write ( 3 , tag , Memory . allocUtf8String ( str ) ) ;
} apk.sh [SUBCOMMAND] [APK FILE|APK DIR|PKG NAME] [FLAGS]
apk.sh pull [PKG NAME] [FLAGS]
apk.sh decode [APK FILE] [FLAGS]
apk.sh build [APK DIR] [FLAGS]
apk.sh patch [APK FILE] [FLAGS]
apk.sh rename [APK FILE] [PKG NAME] [FLAGS]
pull Pull an apk from device/emulator.
decode Decode an apk.
build Re-build an apk.
patch Patch an apk.
rename Rename the apk package.
-a, --arch <arch>ターゲットアーキテクチャを指定し、パッチするときは必須です。
-g, --gadget-conf <json_file> Frida-Gadget構成ファイルを指定します。
-n, --net 、構築時に許容ネットワークセキュリティ構成を追加します、オプション。パッチ、プル、名前を変更することもできます。
-s, --safeデコード時にリソースをデコードしません(つまり、apktool -r)。パッチを当てるときは使用できません。
-d, --no-dis dexを分解しないでください、デコード時にオプション(つまり、apktool -s)。パッチを当てるときは使用できません。
https://frida.re/docs/gadget/
https://lief-project.github.io/doc/latest/tutorials/09_frida_lief.html
https://koz.io/using-frida-on-android-without-root/
https://github.com/sensepost/exply/
https://github.com/nickstadb/patch-apk/
https://neo-geo2.gitbook.io/adventures-on-security/frida-scripting-guide/frida-scripting-guide