O APK.SH é um script bash que facilita a engenharia reversa do Android Apps, automatizando algumas tarefas repetitivas, como puxar, decodificar, reconstruir e corrigir um APK.
O APK.SH basicamente usa o APKTool para desmontar, decodificar e reconstruir recursos e algum ataque para automatizar o processo de injeção de gadgets do FRIDA. Ele também suporta pacotes de aplicativos/apks divididos.
⬅️ Puxar um apk de um dispositivo é simples como em execução ./apk.sh pull <package_name>
? Decodificar um apk é simples como em execução ./apk.sh decode <apk_name>
? A reconstrução de um apk é simples como em execução ./apk.sh build <apk_dir>
apk.sh pull Pull um apk de um dispositivo. Ele suporta pacotes de aplicativos/APKs divididos, o que significa que os APKs divididos serão unidos em um único APK (isso é útil para corrigir). Se o pacote for um pacote de aplicativos/apk dividido, o apk.sh combinará os APKs em um único apk, corrigindo todos os identificadores de recursos públicos.
apk.sh patch um apk para carregar o frida-gadget.so no início.
Frida-gadget.so é uma biblioteca compartilhada de Frida que deve ser carregada por programas a serem instrumentados (quando o modo de operação injetado não é adequado). Simplesmente carregando a biblioteca, ele permitirá que você interaja com ele usando ferramentas existentes baseadas em Frida, como o Frida-Trace. Ele também suporta uma abordagem totalmente autônoma, onde pode executar scripts do sistema de arquivos sem qualquer comunicação externa.
Patching um apk é simples como em execução ./apk.sh patch <apk_name> --arch arm .
Você pode especificar uma configuração de gadgets de Frida em um json ./apk.sh patch <apk_name> --arch arm --gadget-conf <config.json>
Se você encontrar erros apktool d "já estagiados", como no #30, poderá passar o sinalizador --only-main-classes -que será passado para apktool ao decodificar seu APK.
Na interação padrão, o Frida Gadget expõe uma interface compatível com Frida-Server, ouvindo no local: 27042 por padrão. Para alcançar a instrumentação precoce Frida, deixe o bloco de funções do construtor do gadget até você attach() ao processo, ou ligar para resume() depois de passar pelo spawn() -> attach() -> ...apply instrumentation... etapas.
Se você não deseja esse comportamento de bloqueio e deseja que o programa inicialize, ou prefere ouvir em uma interface ou porta diferente, você pode personalizá -lo através de um arquivo de configuração JSON.
A configuração padrão é:
{
"interaction" : {
"type" : " listen " ,
"address" : " 127.0.0.1 " ,
"port" : 27042 ,
"on_port_conflict" : " fail " ,
"on_load" : " wait "
}
} Você pode passar o arquivo de configuração do gadget para apk.sh com a opção --gadget-conf .
Uma configuração normalmente sugerida pode ser:
{
"interaction" : {
"type" : " script " ,
"path" : " /data/local/tmp/script.js " ,
"on_change" : " reload "
}
}script.js pode ser algo como:
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
Adicione o código a seguir para imprimir para logcat a saída do console.log de qualquer script do compartilhamento de código do FRIDA ao usar o tipo de interação do 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> especifique a arquitetura de destino, obrigatória ao remendar.
-g, --gadget-conf <json_file> Especifique um arquivo de configuração FRIDA-GADGET, opcional ao remendar.
-n, --net Adicione uma configuração de segurança de rede permissiva ao criar, opcional. Pode ser usado com patch, puxar e renomear também.
-s, --safe não decodifique recursos ao decodificar (ou seja, apktool -r). Não pode ser usado ao remendar.
-d, --no-dis não desmonte Dex, opcional ao decodificar (ou seja, apktool -s). Não pode ser usado ao remendar.
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-nsecurity/frida-scripting-guide/frida-scripting-guide