APK.SH ist ein Bash -Skript, das Reverse Engineering Android Apps erleichtert und einige sich wiederholende Aufgaben wie das Ziehen, Dekodieren, Wiederaufbau und Patching einer APK automatisiert.
apk.sh nutzt apktool im Grunde, um Ressourcen zu zerlegen, zu dekodieren und wieder aufzubauen, und etwas Bash, um den Frida -Gadget -Injektionsprozess zu automatisieren. Es unterstützt auch App -Bündel/Split -APKs.
⬅️ Ein APK aus einem Gerät ist einfach wie auszuführen ./apk.sh pull <package_name>
? Das Dekodieren einer APK ist einfach wie auszuführen ./apk.sh decode <apk_name>
? Das Wiederaufbau einer APK ist einfach wie läuft ./apk.sh build <apk_dir>
apk.sh pull eine APK von einem Gerät ab. Es unterstützt App -Bündel/Split -APKs, was bedeutet, dass geteilte APKs in einer einzelnen APK verbunden werden (dies ist nützlich für das Patching). Wenn es sich bei dem Paket um ein App -Bundle/Split -APK handelt, kombiniert APK.sh die APKs zu einem einzelnen APK und behebt alle öffentlichen Ressourcenkennungen.
apk.sh patch Patch eine APK zum Laden von Frida-gadget.so beim Start.
Frida-gadget.So ist eine Frida-gemeinsame Bibliothek von Frida, die von Programmen geladen werden soll, die instrumentiert werden sollen (wenn der injizierte Betriebsart nicht geeignet ist). Durch einfaches Laden der Bibliothek können Sie mithilfe vorhandener Frida-basierter Tools wie Frida-Trace mit ihr interagieren. Es unterstützt außerdem einen vollständig autonomen Ansatz, bei dem Skripte ohne Kommunikation aus dem Dateisystem ausgeführt werden können.
Das Patching einer APK ist einfach wie das Ausführen ./apk.sh patch <apk_name> --arch arm .
Sie können Calso in einem json ./apk.sh patch <apk_name> --arch arm --gadget-conf <config.json> eine Frida-Gadget-Konfiguration angeben.
Wenn Sie auf "bereits internierte" apktool d Fehler wie in #30 stoßen, können Sie die Flagge --only-main-classes übergeben, die beim Dekodieren Ihrer APK an apktool übergeben wird.
In der Standardinteraktion enthält Frida Gadget eine Frida-Server-kompatible Schnittstelle, die standardmäßig auf Localhost: 27042 zuhört. Um eine frühzeitige Instrumentierung zu erreichen, lassen Sie die Konstruktor -Funktionsfunktion von Gadget, bis Sie entweder attach() , oder rufen Sie resume() auf, nachdem Sie die übliche spawn() -> attach() -> ...apply instrumentation... Schritte an.
Wenn Sie dieses Blockierungsverhalten nicht möchten und das Programm so starten möchten, oder Sie es vorziehen möchten, wenn Sie eine andere Schnittstelle oder einen anderen Port anhören, können Sie dies über eine JSON -Konfigurationsdatei anpassen.
Die Standardkonfiguration lautet:
{
"interaction" : {
"type" : " listen " ,
"address" : " 127.0.0.1 " ,
"port" : 27042 ,
"on_port_conflict" : " fail " ,
"on_load" : " wait "
}
} Sie können die Gadget-Konfigurationsdatei mit der Option --gadget-conf an apk.sh übergeben.
Eine typisch vorgeschlagene Konfiguration könnte sein:
{
"interaction" : {
"type" : " script " ,
"path" : " /data/local/tmp/script.js " ,
"on_change" : " reload "
}
}script.js könnte so etwas wie:
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
Fügen Sie den folgenden Code hinzu, um die Ausgabe von console.log -Ausgabe eines jeden Skripts aus dem Frida -Codeshare zu drucken, wenn Sie den Skript -Interaktionstyp verwenden.
// 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> Geben Sie die Zielarchitektur an, obligatorisch beim Patching.
-g, --gadget-conf <json_file> Geben Sie eine Frida-Gadget-Konfigurationsdatei an, die beim Patching optional ist.
-n, --net Fügen Sie beim Erstellen eine zulässige Netzwerksicherheitskonfiguration hinzu. Es kann auch mit Patch, Zug und Umbenennen verwendet werden.
-s, --safe dekodieren beim Dekodieren keine Ressourcen (dh apktool -r). Kann beim Patchen nicht verwendet werden.
-d, --no-dis zerlegen Dex nicht, optional beim Dekodieren (dh apktool -s). Kann beim Patchen nicht verwendet werden.
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/objection/
https://github.com/nickstadb/patch-apk/
https://neo-geo2.gitbook.io/adventures-on-security/frida-scripting-guide/frida-scripting-guide