apk.sh est un script bash qui facilite les applications Android d'ingénierie inverse, automatisant certaines tâches répétitives comme le tirage, le décodage, la reconstruction et le correctif d'un APK.
Apk.sh utilise essentiellement ApkTool pour démonter, décoder et reconstruire des ressources et quelques bash pour automatiser le processus d'injection du gadget Frida. Il prend également en charge les bundles d'App / Split APK.
⬅️ tirer un APK d'un appareil est simple comme en cours d'exécution ./apk.sh pull <package_name>
? Décoder un APK est simple comme exécutant ./apk.sh decode <apk_name>
? Rebuilder un APK est simple comme fonctionnant ./apk.sh build <apk_dir>
apk.sh pull Tirez un APK d'un appareil. Il prend en charge les bundles d'App / Split APK, ce qui signifie que les APK fendus seront rejoints dans un seul APK (ceci est utile pour le correctif). Si le package est un bundle d'applications / APK Split, APK.sh combinera les APK en un seul APK, fixant tous les identificateurs de ressources publiques.
apk.sh patch Patch un APK pour charger Frida-Gadget.So au début.
Frida-gadget.s est donc une bibliothèque partagée de Frida destinée à être chargée par des programmes à instrumenter (lorsque le mode de fonctionnement injecté ne convient pas). En chargeant simplement la bibliothèque, il vous permettra d'interagir avec lui en utilisant des outils basés sur Frida existants comme Frida-Trace. Il prend également en charge une approche entièrement autonome où il peut exécuter les scripts du système de fichiers sans aucune communication extérieure.
Le correctif d'un APK est simple comme exécutant ./apk.sh patch <apk_name> --arch arm .
Vous pouvez CALSO spécifier une configuration de gadget Frida dans un ./apk.sh patch <apk_name> --arch arm --gadget-conf <config.json>
Si vous rencontrez des erreurs apktool d "déjà internées" comme dans le n ° 30, vous pouvez passer le drapeau --only-main-classes , qui sera transmis à apktool lors du décodage de votre apk.
Dans l'interaction par défaut, Frida Gadget expose une interface compatible Frida-Server, écoutant sur localhost: 27042 par défaut. Afin d'atteindre l'instrumentation précoce, Frida, laissez le bloc de fonction du constructeur de Gadget jusqu'à ce que vous attach() au processus, ou appelez resume() après avoir parcouru le spawn() -> attach() -> ...apply instrumentation...
Si vous ne voulez pas ce comportement de blocage et que vous souhaitez laisser le programme démarrer correctement, ou si vous préférez qu'il écoute sur une interface ou un port différente, vous pouvez le personnaliser via un fichier de configuration JSON.
La configuration par défaut est:
{
"interaction" : {
"type" : " listen " ,
"address" : " 127.0.0.1 " ,
"port" : 27042 ,
"on_port_conflict" : " fail " ,
"on_load" : " wait "
}
} Vous pouvez transmettre le fichier de configuration du gadget à apk.sh avec l'option --gadget-conf .
Une configuration généralement suggérée peut être:
{
"interaction" : {
"type" : " script " ,
"path" : " /data/local/tmp/script.js " ,
"on_change" : " reload "
}
}script.js pourrait être quelque chose comme:
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
Ajoutez le code suivant à imprimer pour logcat la sortie console.log de n'importe quel script à partir du codes de codes Frida lors de l'utilisation du type d'interaction de script.
// 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> Spécifiez l'architecture cible, obligatoire lors du correctif.
-g, --gadget-conf <json_file> Spécifiez un fichier de configuration Frida-Gadget, facultatif lors du correctif.
-n, --net Ajoutez une configuration de sécurité réseau permissive lors de la construction, facultative. Il peut également être utilisé avec le patch, la traction et le renommée.
-s, --safe ne décode pas les ressources lors du décodage (c'est-à-dire apktool -r). Ne peut pas être utilisé lors du correctif.
-d, --no-dis ne démontez pas Dex, facultatif lors du décodage (c'est-à-dire apktool -s). Ne peut pas être utilisé lors du correctif.
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://neoogeo2.gitbook.io/adventures-on-security/frida-scripting-guide/frida-scripting-guide