Skip to content

MASTG-TECH-0007: Explorando o Pacote do Aplicativo

Uma vez que você tenha coletado o nome do pacote do aplicativo que deseja analisar, você irá começar a reunir informações sobre ele. Primeiro, obtenha o APK conforme explicado em Obtendo e Extraindo Apps.

Arquivos APK são na verdade arquivos ZIP que podem ser descompactados usando um utilitário de descompressão padrão como unzip. No entanto, recomendamos usar Ferramenta Apktool, que adicionalmente decodifica o AndroidManifest.xml e desmonta os binários do aplicativo (classes.dex) para código smali:

$ apktool d UnCrackable-Level3.apk
$ tree
.
├── AndroidManifest.xml
├── apktool.yml
├── lib
├── original
│   ├── AndroidManifest.xml
│   └── META-INF
│       ├── CERT.RSA
│       ├── CERT.SF
│       └── MANIFEST.MF
├── res
...
└── smali

Os seguintes arquivos são extraídos:

  • AndroidManifest.xml: contém a definição do nome do pacote do aplicativo, nível de API alvo e mínimo API level, configuração do aplicativo, componentes do aplicativo, permissões, etc.
  • original/META-INF: contém os metadados do aplicativo
    • MANIFEST.MF: armazena hashes dos recursos do aplicativo
    • CERT.RSA: o(s) certificado(s) do aplicativo
    • CERT.SF: lista de recursos e o resumo SHA-1 das linhas correspondentes no arquivo MANIFEST.MF
  • assets: diretório contendo ativos do aplicativo (arquivos usados dentro do aplicativo Android, como arquivos XML, arquivos JavaScript e imagens), que o AssetManager pode recuperar
  • classes.dex: classes compiladas no formato de arquivo DEX, que a máquina virtual Dalvik/Android Runtime pode processar. DEX é o bytecode Java para a Dalvik Virtual Machine. É otimizado para dispositivos pequenos
  • lib: diretório contendo bibliotecas de terceiros que fazem parte do APK
  • res: diretório contendo recursos que não foram compilados no resources.arsc
  • resources.arsc: arquivo contendo recursos pré-compilados, como arquivos XML para o layout

Como a descompactação com o utilitário padrão unzip deixa alguns arquivos como o AndroidManifest.xml ilegíveis, é melhor descompactar o APK usando Ferramenta Apktool.

$ ls -alh
total 32
drwxr-xr-x    9 sven  staff   306B Dec  5 16:29 .
drwxr-xr-x    5 sven  staff   170B Dec  5 16:29 ..
-rw-r--r--    1 sven  staff    10K Dec  5 16:29 AndroidManifest.xml
-rw-r--r--    1 sven  staff   401B Dec  5 16:29 apktool.yml
drwxr-xr-x    6 sven  staff   204B Dec  5 16:29 assets
drwxr-xr-x    3 sven  staff   102B Dec  5 16:29 lib
drwxr-xr-x    4 sven  staff   136B Dec  5 16:29 original
drwxr-xr-x  131 sven  staff   4.3K Dec  5 16:29 res
drwxr-xr-x    9 sven  staff   306B Dec  5 16:29 smali

O Android Manifest

O Android Manifest é a principal fonte de informação, ele inclui muitas informações interessantes, como o nome do pacote, as permissões, componentes do aplicativo, etc.

Aqui está uma lista não exaustiva de algumas informações e as palavras-chave correspondentes que você pode pesquisar facilmente no Android Manifest apenas inspecionando o arquivo ou usando grep -i <palavra-chave> AndroidManifest.xml:

Consulte os capítulos mencionados para saber mais sobre como testar cada um desses pontos.

Binário do Aplicativo

O binário do aplicativo (classes.dex) pode ser encontrado no diretório raiz do pacote do aplicativo. É um arquivo chamado DEX (Dalvik Executable) que contém código Java compilado. Devido à sua natureza, após aplicar algumas conversões, você poderá usar um decompilador para produzir código Java. Também vimos a pasta smali que foi obtida após executarmos o apktool. Ela contém o bytecode Dalvik desmontado em uma linguagem intermediária chamada smali, que é uma representação legível por humanos do executável Dalvik.

Consulte Revisão de Código Java Descompilado para obter mais informações sobre como fazer engenharia reversa de arquivos DEX.

Binário do Aplicativo Compilado

Em alguns casos, pode ser útil recuperar o binário do aplicativo compilado (.odex).

Primeiro, obtenha o caminho para o diretório de dados do aplicativo:

adb shell pm path com.example.myapplication
package:/data/app/~~DEMFPZh7R4qfUwwwh1czYA==/com.example.myapplication-pOslqiQkJclb_1Vk9-WAXg==/base.apk

Remova a parte /base.apk, adicione /oat/arm64/base.odex e use o caminho resultante para extrair o base.odex do dispositivo:

adb root
adb pull /data/app/~~DEMFPZh7R4qfUwwwh1czYA==/com.example.myapplication-pOslqiQkJclb_1Vk9-WAXg==/oat/arm64/base.odex

Observe que o diretório exato será diferente dependendo da sua versão do Android. Se o arquivo /oat/arm64/base.odex não for encontrado, pesquise manualmente no diretório retornado por pm path.

Bibliotecas Nativas

Você pode inspecionar a pasta lib no APK:

$ ls -1 lib/armeabi/
libdatabase_sqlcipher.so
libnative.so
libsqlcipher_android.so
libstlport_shared.so

ou do dispositivo com objection:

...g.vp.owasp_mobile.omtg_android on (google: 8.1.0) [usb] # ls lib
Type    ...  Name
------  ...  ------------------------
File    ...  libnative.so
File    ...  libdatabase_sqlcipher.so
File    ...  libstlport_shared.so
File    ...  libsqlcipher_android.so

Por enquanto, essas são todas as informações que você pode obter sobre as bibliotecas nativas, a menos que você comece a fazer engenharia reversa delas, o que é feito usando uma abordagem diferente da usada para reverter o binário do aplicativo, pois esse código não pode ser decompilado, apenas desmontado. Consulte Análise de Código Nativo Desmontado para obter mais informações sobre como fazer engenharia reversa dessas bibliotecas.

Outros Recursos do Aplicativo

Normalmente vale a pena dar uma olhada no restante dos recursos e arquivos que você pode encontrar na pasta raiz do APK, pois às vezes eles contêm informações adicionais valiosas, como key stores, bancos de dados criptografados, certificados, etc.