Smali - Decompiling/[Modifying]/Compiling
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Às vezes, é interessante modificar o código do aplicativo para acessar informações ocultas para você (talvez senhas ou flags bem ofuscadas). Então, pode ser interessante descompilar o apk, modificar o código e recompilá-lo.
Referência de Opcodes: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
Usando Visual Studio Code e a extensão APKLab, você pode descompilar automaticamente, modificar, recompilar, assinar e instalar o aplicativo sem executar nenhum comando.
Outro script que facilita muito essa tarefa é https://github.com/ax/apk.sh
Usando APKTool você pode acessar o código smali e recursos:
Se o apktool der algum erro, tente instalar a versão mais recente
Alguns arquivos interessantes que você deve olhar são:
res/values/strings.xml (e todos os xmls dentro de res/values/*)
AndroidManifest.xml
Qualquer arquivo com extensão .sqlite ou .db
Se o apktool
tiver problemas para decodificar a aplicação, dê uma olhada em https://ibotpeaches.github.io/Apktool/documentation/#framework-files ou tente usar o argumento -r
(Não decodificar recursos). Então, se o problema estava em um recurso e não no código-fonte, você não terá o problema (você também não decompilará os recursos).
Você pode mudar instruções, mudar o valor de algumas variáveis ou adicionar novas instruções. Eu mudo o código Smali usando VS Code, você então instala a extensão smalise e o editor lhe dirá se alguma instrução está incorreta. Alguns exemplos podem ser encontrados aqui:
Ou você pode ver abaixo algumas mudanças Smali explicadas.
Após modificar o código, você pode recompilar o código usando:
Ele compilará o novo APK dentro da pasta dist.
Se apktool gerar um erro, tente instalar a versão mais recente
Então, você precisa gerar uma chave (você será solicitado a fornecer uma senha e algumas informações que pode preencher aleatoriamente):
Finalmente, assine o novo APK:
zipalign é uma ferramenta de alinhamento de arquivos que fornece uma otimização importante para arquivos de aplicação Android (APK). Mais informações aqui.
Se você preferir usar apksigner em vez de jarsigner, você deve assinar o apk após aplicar a otimização com zipalign. MAS NOTE QUE VOCÊ SÓ PRECISA ASSINAR A APLICAÇÃO UMA VEZ COM jarsigner (antes do zipalign) OU COM aspsigner (depois do zipalign).
Para o seguinte código Java Hello World:
O código Smali seria:
O conjunto de instruções Smali está disponível aqui.
Algumas variáveis são definidas no início da função usando o opcode const, você pode modificar seus valores ou pode definir novos:
Recomendações:
Se você for usar variáveis declaradas dentro da função (declaradas v0,v1,v2...) coloque essas linhas entre o .local <número> e as declarações das variáveis (const v0, 0x1)
Se você quiser colocar o código de logging no meio do código de uma função:
Adicione 2 ao número de variáveis declaradas: Ex: de .locals 10 para .locals 12
As novas variáveis devem ser os próximos números das variáveis já declaradas (neste exemplo devem ser v10 e v11, lembre-se que começa em v0).
Altere o código da função de logging e use v10 e v11 em vez de v5 e v1.
Lembre-se de adicionar 3 ao número de .locals no início da função.
Este código está preparado para ser inserido no meio de uma função (mude o número das variáveis conforme necessário). Ele irá pegar o valor de this.o, transformá-lo em String e então fazer um toast com seu valor.
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)