Smali - Decompiling/[Modifying]/Compiling
Às vezes é interessante modificar o código do aplicativo para acessar informações ocultas para você (talvez senhas bem ofuscadas ou flags). Nesse caso, pode ser interessante decompilar o apk, modificar o código e recompilá-lo.
Referência de Opcodes: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
Forma Rápida
Usando o Visual Studio Code e a extensão APKLab, você pode decompilar, modificar, recompilar, assinar e instalar automaticamente o aplicativo sem executar nenhum comando.
Outro script que facilita muito essa tarefa é https://github.com/ax/apk.sh
Decompilar o APK
Usando o APKTool, você pode acessar o código smali e recursos:
Se o apktool apresentar algum erro, tente instalar a última versão
Alguns arquivos interessantes que você deve procurar são:
res/values/strings.xml (e todos os xmls dentro de res/values/*)
AndroidManifest.xml
Qualquer arquivo com a extensão .sqlite ou .db
Se o apktool
tiver problemas ao decodificar o aplicativo, 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 estiver em um recurso e não no código-fonte, você não terá o problema (você também não descompilará os recursos).
Alterar o código Smali
Você pode alterar instruções, alterar o valor de algumas variáveis ou adicionar novas instruções. Eu altero o código Smali usando VS Code, então você instala a extensão smalise e o editor irá informar se alguma instrução estiver incorreta. Alguns exemplos podem ser encontrados aqui:
Ou você pode ver abaixo algumas alterações no Smali explicadas.
Recompilar o APK
Após modificar o código, você pode recompilar o código usando:
Ele irá compilar o novo APK dentro da pasta dist.
Se o apktool lançar um erro, tente instalar a última versão
Assine o novo APK
Em seguida, você precisa gerar uma chave (será solicitada uma senha e algumas informações que você pode preencher aleatoriamente):
Finalmente, assin o novo APK:
Otimizar nova aplicação
zipalign é uma ferramenta de alinhamento de arquivos que fornece otimização importante para arquivos de aplicativos Android (APK). Mais informações aqui.
Assinar 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 OBSERVE QUE VOCÊ SÓ PRECISA ASSINAR O APLICATIVO UMA VEZ COM jarsigner (antes do zipalign) OU COM apksigner (após o 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.
Alterações 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 novas:
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ê deseja inserir o código de log 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, seriam v10 e v11, lembre-se de que começa em v0).
Altere o código da função de log 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 (altere 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