MASTG-TECH-0017: Descompilação de Código Java
Ao realizar a engenharia reversa de um aplicativo Android, certifique-se de sempre identificar todos os locais de interesse em relação à lógica da aplicação e utilizar as técnicas corretas para realizar a engenharia reversa deles. Nesta técnica, focaremos no bytecode DEX, que é armazenado em um ou mais arquivos classes<x>.dex no diretório principal do APK. No entanto, aplicativos Android também podem conter código em outros arquivos que serão interpretados por um componente do sistema (por exemplo, uma WebView) ou por bibliotecas nativas empacotadas.
Descompilar o bytecode DEX para Java normalmente é um processo simples, e muitos descompiladores existem que podem fornecer código quase idêntico ao código-fonte original. No entanto, algumas informações são inerentemente perdidas durante a compilação, então o código recuperado nunca será uma correspondência perfeita. Entretanto, se o código foi propositalmente ofuscado (ou se foram aplicadas técnicas anti-descompilação que quebram ferramentas), o processo de engenharia reversa pode ser muito demorado e improdutivo. Isso também se aplica a aplicativos que contêm código nativo. Eles ainda podem sofrer engenharia reversa, mas o processo não pode ser trivialmente automatizado e exige conhecimento de detalhes de baixo nível.
Embora o bytecode DEX e o bytecode Java não sejam iguais, eles podem ser convertidos entre si. Como resultado, aplicativos Android podem ser descompilados usando descompiladores Java, primeiro convertendo os arquivos .dex em arquivos .jar e depois descompilando os arquivos .jar. Como um aplicativo pode ter múltiplos arquivos .dex, este é um processo tedioso, e felizmente muitos descompiladores têm suporte nativo para arquivos .apk, cuidando desse processo para você. Alguns descompiladores também funcionam diretamente no bytecode DEX, em vez de convertê-lo primeiro para bytecode Java.
Devido à longa herança de aplicativos Java, muitos descompiladores podem ser usados para descompilar aplicativos Android. Embora existam descompiladores Android comerciais muito robustos, há descompiladores gratuitos que rivalizam com os comerciais em muitos aspectos. O descompilador gratuito mais popular é jadx, que está em desenvolvimento ativo. Se o jadx falhar ao descompilar uma parte do código, a alternativa mais fácil é Visualizador de Bytecode, que combina seis descompiladores diferentes em uma única aplicação (JD-GUI, Procyon, CFR, Fernflower, Krakatau e JADX-Core). Ambos os descompiladores têm suporte nativo para arquivos .apk, e embora possa parecer que o bytecodeviewer é a melhor escolha, o jadx tem muito mais funcionalidades de UI que oferecem uma experiência de usuário muito mais agradável do que o bytecodeviewer.
Aviso
A descompilação pode sempre falhar, seja devido à manipulação intencional dos arquivos .dex, ou simplesmente devido a bugs nos descompiladores. Se todos os descompiladores falharem, você sempre pode recorrer à técnica Desmontagem de Código em Smali.
Vamos dar uma olhada na versão descompilada do Android UnCrackable L1 em alguns descompiladores diferentes:
Usando jadx-gui¶
Você pode abrir um arquivo APK iniciando o jadx-gui e usando a interface gráfica, ou especificando diretamente o APK ao iniciar o jadx-gui:
jadx-gui Uncrackable-Level1.apk

O Jadx-gui geralmente se sai muito bem ao descompilar aplicativos Android. Se a descompilação não for bem-sucedida, ele também suporta múltiplos modos de fallback que podem ser ativados na parte inferior do painel (SMALI, Simple, Fallback).
Usando jadx¶
Além de abrir o binário com jadx-gui, também é possível usar o núcleo do jadx para descompilar o código para o sistema de arquivos. Depois, você pode usar seu editor de código favorito para examinar o código:
jadx -d decompiled UnCrackable-Level1.apk
É possível especificar qual classe descompilar, em vez de descompilar toda a aplicação. Isso pode ser feito com o argumento --single-class:
jadx --single-class sg.vantagepoint.uncrackable1.MainActivity UnCrackable-Level1.apk
INFO - loading ...
INFO - Saving class 'sg.vantagepoint.uncrackable1.MainActivity' to file '/home/owasp/UnCrackable-Level1/sources/sg/vantagepoint/uncrackable1/MainActivity.java'
INFO - done
O Jadx também tem uma funcionalidade que permite criar um projeto gradle a partir do código descompilado. Este projeto gradle pode então ser aberto com Android Studio. Note que você não será capaz de compilar realmente a aplicação devido à perda de informações durante a compilação original, mas ainda pode usar as poderosas funcionalidades de IDE do Android Studio para analisar o código descompilado.
jadx -d decompiled -e UnCrackable-Level1.apk
Usando Bytecodeviewer¶

O Bytecodeviewer pode mostrar diferentes descompiladores lado a lado. No exemplo acima, Fernflower e CFR são mostrados. Mesmo que o código seja equivalente, há diferenças entre os dois resultados de descompilação. Por exemplo, o CFR tende a usar informações de tipo disponíveis ao nomear variáveis, enquanto o Fernflower simplesmente usa var{index}.
Consulte a seção Revisão de Código Java Descompilado para aprender como proceder ao inspecionar o código Java descompilado.