Home > Programação, Segurança > Engenharia Reversa de Aplicativos Android

Engenharia Reversa de Aplicativos Android

A Engenharia Reversa de aplicativos pode ser útil em algumas situações, principalmente em questões concernentes à segurança da informação. Escrevi este artigo com base no que aprendi em um dos posts do Thomas Cannon.

Para realizar esta tarefa é necessário ter o Java instalado, bem como o Toolkit de Desenvolvimento do Android (SDK) e alguns outros programas específicos que relacionei abaixo. Os procedimentos mostrados aqui foram realizados em um Windows, mas poderiam ser realizados também no Linux ou Mac.

OBTENDO O APLICATIVO

A primeira etapa é obter o arquivo, cuja extensão é apk, do aplicativo em questão. Alguns podem ser obtidos direto da página da empresa/desenvolvedor enquanto outros estão disponíveis apenas via Android Market. Neste último caso, se você já tentou, vai chegar a conclusão que não é possível efetuar o download do Market para o seu PC. O jeito é pegar o aplicativo já instalado em um smartphone ou tablet.

Também tentei instalar aplicativos do Market em dispositivos virtuais, aqueles emuladores utilizados no desenvolvimento, sem sucesso. Como o acesso ao shell dos emuladores já ocorre por padrão com o usuário root, seria fácil obter qualquer aplicativo instalado nele. Também não insisti muito nesta idéia. Se você já tentou isso e teve sucesso, por favor, colabore com comentários.

Como alternativa resolvi fazer o root do meu smartphone (Galaxy S) utilizando o Super One Click. Uma vez que o Shell Root foi instalado com sucesso as coisas ficaram bem mais fáceis.

Os aplicativos instalados (de “terceiros”) ficam localizados na pasta /data/app enquanto que os que acompanham o aparelho ficam em /system/app. 

Para exemplificar todo processo utilizarei como “alvo” um aplicativo no qual tenho trabalhado já a alguns meses.

O primeiro passo consiste em acessar o shell do Android, que é um sistema operacional Linux, utilizando o adb (utilitário que acompanha o SDK). O comando “adb shell” abrirá o prompt de comando do Android. Observe que no meu caso a sessão foi aberta já com o usuário root (super usuário do sistema). Sem efetuar o Shell Root o comando seria executado como um usuário comum, com poucos privilégios, e logo não funcionaria.

Em seguida, com o shell aberto, listei os aplicativos instalados em /data/app cujo nome contenham mobilemasters (nome que costumo utilizar nos aplicativos que crio). O comando que utilizei para isto foi: “ls -l /data/app/*mobilemaster*“.  Uma vez que o nome completo do aplicativo tenha sido identificado tecle Ctrl+D e Enter para fechar a sessão e efetue o “download” para o PC com o comando:  “adb pull /data/app/br.com.mobilemasters.money-1.apk  c:\temp

A partir deste momento você poderá seguir o processo simplificado (caso esteja utilizando Windows) ou poderá acompanhar passo a passo, fazendo tudo manualmente. Ambas alternativas estão descritas a seguir.

PROCESSO SIMPLIFICADO (Somente Windows) new

Baixe o Aplicativo APK to Java, na página do GitHub.  O aplicativo é muito fácil e intuitivo por si só e dispensa comentários.  Você pode conhecer mais projetos do mesmo desenvolvedor em sua página pessoal.

APKtoJava

MANUALMENTE, PASSO A PASSO

O formato de um arquivo apk é igual ao de um arquivo zip. Então, utilizando um descompactador, extraia o conteúdo do arquivo para uma pasta qualquer. O conteúdo da pasta será semelhante a este:

Se você tentar ler o arquivo AndroidManifest.xml não conseguirá. É necessário convertê-lo para um formato legível através do programa AXMLPrinter2. Baixe o programa e salve-o na mesma pasta onde descompactou o arquivo apk. Então execute o seguinte comando para converter:

java -jar ./AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest-convertido.xml

É necessário que o java esteja instalado e sua pasta configurada na varíavel de ambiente PATH para que o comando seja executado.

Agora o arquivo AndroidManifest-convertido.xml já pode ser lido sem nenhum problema.

CONVERTENDO O ARQUIVO DE CLASSES

A próxima etapa consiste em converter o arquivo classes.dex para o formato de pacote do java (jar). Baixe o aplicativo dex2jar, salve-o também na mesma pasta descompactando-o em dex2jar, e execute o seguinte comando:

dex2jar\dex2jar.bat classes.dex

O arquivo classes.dex.dex2jar.jar será gerado, contendo os byte codes das classes. Daqui em diante o processo de engenharia reversa é o mesmo utilizado em aplicativos Java.

CONVERTENDO BYTE CODES EM CÓDIGO FONTE

A última etapa consiste em converter o arquivo jar gerado para código fonte Java.

Baixe o programa Java Decompiler, descompacte-o e execute o aplicativo jd-gui.exe. Ao abrir o aplicativo clique no botão Abrir  e selecione o arquivo classes.dex.dex2jar.jar recém gerado. Agora o código fonte das classes já pode ser visualizado conforme mostra a imagem a seguir:

Utilize Ctrl+Alt+S para salvar todos os arquivos ou Ctrl+S para um único de código fonte.

E isto é tudo!

  1. 20/06/2011 at 5:07 PM

    nossa cara muito bom mesmo, obrigado me ajudou muito em meus estudos…
    tenho um blog sobre android tb de uma olhada..

  2. 22/06/2011 at 12:50 PM

    Para quem travou no “CONVERTENDO O ARQUIVO DE MANIFESTO”
    Iniciar>Executar> digite: “cmd”>OK
    Irá abrir o prompt de comando. E deve aparecer isto: “C:\Documents and Settings\User>”
    Para você executar o programa AXMLPrinter2 você deve estar na pasta aonde ele se encontra. Por exemplo “C:\Documents and Settings\User\Desktop\Android>”.

    No Prompt de Comando:
    Devemos guiar até a pasta Android usando o comando “cd”
    cd Desktop >tecla Enter
    Após este comando devemos ter: “C:\Documents and Settings\User\Desktop>”
    cd Android > tecla Enter
    Após este comando devemos ter: “C:\Documents and Settings\User\Desktop\Android”

    Ai sim poderemos executar o AXMLPrinter
    java -jar ./AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest-convertido.xml

    Feito isto você deve ter o arquivo AndroidManifest-convertido.xml na pasta Android.

  3. 18/07/2011 at 10:15 PM

    Então…
    Agente vai poder converter .apk para .jar???

    • 18/07/2011 at 11:08 PM

      Olá,

      Sim, é o que os procedimentos que relacionei acima fazem.

      Abraço,

      Edison

  4. 30/07/2011 at 6:56 PM

    amigo, estou com um aplicativo feito por um cara na italia, ele faz stremaing, mas o arquivo que deve conter a linha de comando com o endereço e porta do servidor esta neste formato libaacarray.so e nao consigo editar. se eu te mandar o APK vc consegue ler este arquivo ? quando abre ele fica tudo ilegivel.

    obrigado pela força amigo e parabens pelo tutorial

    • 01/08/2011 at 8:08 PM

      Olá,

      A extensão .so diz respeito a bibliotecas compiladas em C/C++.

      Infelizmente eu não conheço uma forma de fazer engenharia reversa disso e nem como você pode editar o binário e modificar.

      O jeito vai ser pesquisar.

      Boa sorte!

  5. 31/07/2011 at 12:19 AM

    E com isso agente pode rodar aplicativos do Android em outro smartphone?

    • 01/08/2011 at 8:15 PM

      Olá Felipe,

      Com isso você pode aprender como algo é feito em Android.

      Um aplicativo Android vai funcionar somente em outro Android, pelo menos até a presente data.

      Lembro-me de ter lido sobre um projeto que pretende rodar aplicativos Android no PC, mas não tenho acompanhado.

      Abraço.

  6. fabio
    17/09/2011 at 10:02 AM

    Caro, somente consegui visualizar o arquivo final convertido. Como edita-lo ?

    • 19/09/2011 at 9:03 AM

      Olá Fábio,

      No Java Decompiler, tecle Ctrl+Alt+S para salvar tudo o que você está visualizando para um arquivo, com extensão .jar (zip). Depois, descompacte o arquivo salvo para uma pasta e você poderá editar normalmente.

      Você perceberá que nem sempre será possível compilar o código resultante da engenharia reversa sem corrigí-lo.

      Abraço e boa sorte!

  7. DTSk8
    11/10/2011 at 9:51 AM

    Oi, sou meio novato na area xD

    Então fiz tudo certo mas no final gerei um arquivo no formato .src!

    o que que fiz de errado?

    • 12/10/2011 at 12:33 PM

      Já tentou abrir o arquivo em um editor ? Agora basta você ler o código fonte!

  8. Alexandre
    16/11/2011 at 8:48 AM

    Com o AXMLPrinter2 é possível converter os outros xml contido no res ou é necessário um outro procedimento?

    • 16/11/2011 at 8:54 AM

      Olá Alexandre,

      É necessário outro procedimento.

      Você precisa utilizar o apktool.

      Abraço,

  9. Elizandro
    18/12/2011 at 5:46 PM

    Teoricamente eu poderia usar esse método para traduzir um aplicativo que está em outra língua para o português e depois compilar novamente, instalar no celular android e ver a aplicação rodando normalmente já traduzida em português?

    • 18/12/2011 at 10:08 PM

      Olá Elizandro,

      Sim. Neste caso específico, já que não é necessário entender o que o aplicativo faz, você poderia utilizar o apktool. Ele explode o conteúdo de um .apk em um diretório já convertendo os arquivos de recurso (pasta res). Depois de efetuar as modificações, basta fazer o processo reverso, empacotando o diretório em um apk e pronto.

      Abraço.

  10. lucas
    04/01/2012 at 1:11 PM

    eu travei em CONVERTENDO O ARQUIVO DE CLASSES alguem pode me ajudar?

  11. lucas
    04/01/2012 at 6:13 PM

    bem eu baixei o dex2jar e veio um arquivo zip chamado:dex2jar-0.0.7.9-SNAPSHOT (1).zip eu descompactei e o coloquei na pasta do apk mais quando eu digitei o comando no cmd ele deu erro.eu fiz tudo certo(eu acho)alguem pode me explicar melhor e que sou meio novo no assunto.se possivel poderiam me enviar um link de um video tutorial.desde ja agradeço.

  12. herbert
    12/03/2012 at 8:28 PM

    Como adaptar tudo que foi convertido pra ser trabalhado com o ECLIPSE?

    • 12/03/2012 at 9:40 PM

      Olá Hebert.

      Esta não é uma tarefa nada fácil. Vou tentar criar um post sobre este assunto assim que tiver um tempo disponível.

      Abraço

  13. jefferson
    14/05/2012 at 6:22 PM

    o que e o Java instalado ?
    como funsiona comando java -jar ./AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest-convertido.xml nas / siguinifica uma pasta ?
    vc pode faser um video

  14. Alexandre Yamamoto
    18/09/2012 at 11:25 AM

    Edison,

    Você tem algum procedimento para os APKs que tem os odex junto?

    • 18/09/2012 at 7:34 PM

      Olá Alexandre, não tenho.

      Se descobrir algo, compartilhe por favor.

      Abraço

  15. fabio ferreira c s
    14/11/2012 at 12:46 AM

    Ola, beleza , entao , apos as modificações nos arquivos .src como compilar para retorna-los a .jar ? Dá uma força ai. Obrigado

  16. jefferson
    03/01/2013 at 2:10 AM

    alguem pode me ajudar, fiz tudo só não consigo converter classes.dex para classes.dex.dex2jar.jar . alguem pode tentar me explicar denovo ! ficaria muito grato se alguem me ajudasse!

  17. Alexandre Costa
    17/01/2013 at 8:25 AM

    Boas!

    Estou com um problema. Relativamente a “CONVERTENDO O ARQUIVO DE MANIFESTO” estou com um problema.
    Já fui a linha de comandos, executei todos os passos indicados e escrevi:
    java -jar ./AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest-convertido.xml

    Ocorreu-me este erro: ‘java nao é reconhecido como um comando interno ou externo, programa operacional ou ficheiro bath.’

    Alguem me conhece ajudar sobre como resolver este problema?

    Terá a ver com o java?

    Obrigado!

    Cumprimentos

  18. MS
    26/01/2013 at 7:29 PM

    Legal, Muito Legal, mas como converter o .java e dex novamente, alguém sabe?

  19. IALE
    07/08/2013 at 5:31 PM

    E ai, valeu mesmo consegui fazer tudo certinho, Só faltou explicar melhor para quem é mais leigo, como incluir a variavel de ambiente e que os códigos devem ser executados no CMD, e antes de serem executados deve-se acessar a pasta onde estão os programas baixados pelo CMD também Vlw.

  20. Macedo
    02/02/2015 at 1:22 AM

    Olá! Estou tendo dificuldade para fazer o download do programa java decompiler! Tentei fazer o download em outros sites e não encontrei o programa.

    grato

  21. Joana
    06/02/2015 at 1:15 AM

    Excelente Matéria! A melhor que eu li e que funcionou. Em outros site, não funcionava, só frustava! Parabéns!!

    Edison, há alguma possibilidade de converter esses arquivos e trabalhar no Eclipse?

    Agradeço desde já!

  22. carlos
    26/02/2015 at 1:30 PM

    Tem como trabalhar com esses arquivos no Eclipse para edição ou não é possível?

    • 26/02/2015 at 1:56 PM

      Olá Carlos. O APK to Java, (https://github.com/broodplank/APKtoJava), tem uma opção para fazer isso. Mas não acredito que irá funcionar. Existem ferramentas para fazer pequenas alterações no APK, sem fazer a engenharia reversa. Eventualmente você pode considerar isso.

  1. No trackbacks yet.

Leave a reply to lucas Cancel reply