11 KiB
Smali - Decompilando/[Modificando]/Compilando
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Você trabalha em uma empresa de cibersegurança? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Confira os PLANOS DE ASSINATURA!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e para o repositório hacktricks-cloud.
Às vezes, é interessante modificar o código do aplicativo para acessar informações ocultas para você (talvez senhas bem ofuscadas ou flags). 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
Forma rápida
Usando o Visual Studio Code e a extensão APKLab, você pode descompilar, modificar, recompilar, assinar e instalar o aplicativo automaticamente sem executar nenhum comando.
Outro script que facilita muito essa tarefa é https://github.com/ax/apk.sh****
Descompilar o APK
Usando o APKTool, você pode acessar o código smali e recursos:
apktool d APP.apk
Se o apktool apresentar algum erro, tente instalar a versão mais recente.
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 extensão .sqlite ou .db
Se o apktool
tiver problemas para 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 (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 o VS Code, então você instala a extensão smalise e o editor informará se alguma instrução estiver incorreta.
Alguns exemplos podem ser encontrados aqui:
Ou você pode ver abaixo algumas alterações do Smali explicadas.
Recompilar o APK
Depois de modificar o código, você pode recompilar o código usando:
apktool b . #In the folder generated when you decompiled the application
Ele irá compilar o novo APK dentro da pasta dist.
Se o apktool apresentar um erro, tente instalar a versão mais recente.
Assinar o novo APK
Em seguida, você precisa gerar uma chave (será solicitada uma senha e algumas informações que você pode preencher aleatoriamente):
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
Finalmente, assinem o novo APK:
jarsigner -keystore key.jks path/to/dist/* <your-alias>
Otimizar nova aplicação
zipalign é uma ferramenta de alinhamento de arquivos que fornece uma otimização importante para arquivos de aplicativos Android (APK). Mais informações aqui.
zipalign [-f] [-v] <alignment> infile.apk outfile.apk
zipalign -v 4 infile.apk
Assinar o novo APK (novamente?)
Se você preferir usar o [apksigner](https://developer.android.com/studio/command-line/apksigner)** em vez do jarsigner, você deve assinar o apk após aplicar a otimização com zipaling**. MAS ATENÇÃO QUE** VOCÊ SÓ PRECISA ASSINAR O APLICATIVO UMA VEZ** COM jarsigner (antes do zipalign) OU COM aspsigner (depois do zipalign).
apksigner sign --ks key.jks ./dist/mycompiled.apk
Para o seguinte código Java Hello World:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
O código Smali equivalente seria:
.class public LHelloWorld;
.super Ljava/lang/Object;
.method public static main([Ljava/lang/String;)V
.registers 2
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1, "Hello, World!"
invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
return-void
.end method
To modify the behavior of the code, we can modify the Smali code directly. For example, we can change the string that is printed to the console by modifying the const-string
instruction:
const-string v1, "Goodbye, World!"
After modifying the Smali code, we need to repackage the APK and sign it again before installing it on a device.
public static void printHelloWorld() {
System.out.println("Hello World")
}
O código Smali seria:
.method public static printHelloWorld()V
.registers 2
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1, "Hello World"
invoke-virtual {v0,v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
return-void
.end method
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 definir novas:
#Number
const v9, 0xf4240
const/4 v8, 0x1
#Strings
const-string v5, "wins"
Operações Básicas
#Math
add-int/lit8 v0, v2, 0x1 #v2 + 0x1 and save it in v0
mul-int v0,v2,0x2 #v2*0x2 and save in v0
#Move the value of one object into another
move v1,v2
#Condtions
if-ge #Greater or equals
if-le #Less or equals
if-eq #Equals
#Get/Save attributes of an object
iget v0, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I #Save this.o inside v0
iput v0, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I #Save v0 inside this.o
#goto
:goto_6 #Declare this where you want to start a loop
if-ne v0, v9, :goto_6 #If not equals, go to: :goto_6
goto :goto_6 #Always go to: :goto_6
Mudanças Maiores
Registro (Logging)
#Log win: <number>
iget v5, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I #Get this.o inside v5
invoke-static {v5}, Ljava/lang/String;->valueOf(I)Ljava/lang/String; #Transform number to String
move-result-object v1 #Move to v1
const-string v5, "wins" #Save "win" inside v5
invoke-static {v5, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I #Logging "Wins: <num>"
Recomendações:
- Se você for usar variáveis declaradas dentro da função (declaradas v0,v1,v2...), coloque essas linhas entre o .local <number> e as declarações das variáveis (const v0, 0x1)
- Se você quiser colocar o código de registro 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 de que começa em v0).
- Altere o código da função de registro 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, em seguida, fazer um toast com seu valor.
const/4 v10, 0x1
const/4 v11, 0x1
const/4 v12, 0x1
iget v10, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I
invoke-static {v10}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;
move-result-object v11
invoke-static {p0, v11, v12}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v12
invoke-virtual {v12}, Landroid/widget/Toast;->show()V
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Você trabalha em uma empresa de segurança cibernética? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Confira os PLANOS DE ASSINATURA!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e para o repositório hacktricks-cloud.