Smali - Decompiling/[Modifying]/Compiling
À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
Fast Way
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
Decompile the APK
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).
Mudar código smali
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.
Recompilar o APK
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
Assine o novo APK
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:
Otimizar nova aplicação
zipalign é uma ferramenta de alinhamento de arquivos que fornece uma otimização importante para arquivos de aplicação Android (APK). Mais informações aqui.
Assine o novo APK (novamente?)
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).
Modificando Smali
Para o seguinte código Java Hello World:
O código Smali seria:
O conjunto de instruções Smali está disponível aqui.
Mudanças Leves
Modificar valores iniciais de uma variável dentro de uma função
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:
Operações Básicas
Mudanças Maiores
Registro
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.
Toasting
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.
Last updated