
Macht Reverse Engineering von Android-Apps einfacher, indem es wiederkehrende Aufgaben wie das Herunterladen, Dekodieren, Rebuilden und Patchen einer APK automatisiert.
apk.sh ist ein Bash-Skript, das die Reverse-Engineering von Android-Apps erleichtert, indem es einige sich wiederholende Aufgaben wie das Ziehen, Dekodieren, Neuerstellen und Patchen einer APK automatisiert.
apk.sh verwendet im Wesentlichen apktool zum Disassemblieren, Dekodieren und Neuerstellen von Ressourcen sowie etwas Bash, um den frida-Gadget-Injektionsprozess zu automatisieren. Es unterstützt auch App Bundles/Split-APKs.
⬅️ Das Ziehen einer APK von einem Gerät ist so einfach wie das Ausführen von ./apk.sh pull <paket_name>
🔧 Das Dekodieren einer APK ist so einfach wie das Ausführen von ./apk.sh decode <apk_name>
🔩 Das Neuerstellen einer APK ist so einfach wie das Ausführen von ./apk.sh build <apk_verzeichnis>
apk.sh pull zieht eine APK von einem Gerät.
Es unterstützt App Bundles/Split-APKs, was bedeutet, dass Split-APKs in einer einzigen APK zusammengeführt werden (dies ist nützlich zum Patchen).
Wenn das Paket ein App Bundle/Split-APK ist, kombiniert apk.sh die APKs zu einer einzigen APK und korrigiert alle öffentlichen Ressourcen-IDs.
apk.sh patch patcht eine APK, um frida-gadget.so beim Start zu laden.
frida-gadget.so ist eine gemeinsam genutzte Bibliothek von Frida, die dazu bestimmt ist, von Programmen geladen zu werden, die instrumentiert werden sollen (wenn der Injektionsmodus nicht geeignet ist). Durch einfaches Laden der Bibliothek können Sie mit vorhandenen Frida-basierten Tools wie frida-trace interagieren. Es unterstützt auch einen vollständig autonomen Ansatz, bei dem es Skripte vom Dateisystem ausführen kann, ohne externe Kommunikation.
Das Patchen einer APK ist so einfach wie das Ausführen von ./apk.sh patch <apk_name> --arch arm.
Sie können auch eine Frida-Gadget-Konfiguration in einer JSON-Datei angeben: ./apk.sh patch <apk_name> --arch arm --gadget-conf <config.json>
Wenn Sie "already interned" apktool d-Fehler wie in #30 erhalten, können Sie das Flag --only-main-classes übergeben, das beim Dekodieren Ihrer APK an apktool weitergeleitet wird.
In der Standard-Interaktion stellt Frida Gadget eine frida-server-kompatible Schnittstelle bereit, die standardmäßig auf localhost:27042 lauscht. Um eine frühe Instrumentierung zu erreichen, lässt Frida die Konstruktorfunktion von Gadget blockieren, bis Sie entweder attach() auf den Prozess aufrufen oder resume() nach den üblichen spawn() -> attach() -> ...Instrumentierung anwenden...-Schritten.
Wenn Sie dieses blockierende Verhalten nicht möchten und möchten, dass das Programm sofort startet, oder wenn Sie möchten, dass es auf einer anderen Schnittstelle oder einem anderen Port lauscht, können Sie dies über eine JSON-Konfigurationsdatei anpassen.
Die Standardkonfiguration ist:
{
"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 typischerweise empfohlene Konfiguration könnte sein:
{
"interaction": {
"type": "script",
"path": "/data/local/tmp/script.js",
"on_change":"reload"
}
}
script.js könnte so etwas sein:
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 console.log-Ausgabe jedes Skripts aus dem frida codeshare bei Verwendung des Skript-Interaktionstyps an logcat auszugeben.
// 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 APK von Gerät/Emulator ziehen.
decode APK dekodieren.
build APK neu erstellen.
patch APK patchen.
rename APK-Paket umbenennen.
-a, --arch <arch> Zielarchitektur angeben, erforderlich beim Patchen.
-g, --gadget-conf <json_datei> Eine Frida-Gadget-Konfigurationsdatei angeben, optional beim Patchen.
-n, --net Fügt beim Erstellen eine permissive Netzwerksicherheitskonfiguration hinzu, optional. Kann auch mit patch, pull und rename verwendet werden.
-r, --no-res Ressourcen beim Dekodieren nicht dekodieren (d.h. apktool -r), optional. Kann beim Patchen verwendet werden.
-s, --no-src Dex beim Dekodieren nicht disassemblieren (d.h. apktool -s), optional. Kann beim Patchen verwendet werden.
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