Início > 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!

About these ads
  1. 20/06/2011 às 5:07 PM | #1

    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 às 12:50 PM | #2

    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 às 10:15 PM | #3

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

  4. 30/07/2011 às 6:56 PM | #5

    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 às 8:08 PM | #6

      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 às 12:19 AM | #7

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

    • 01/08/2011 às 8:15 PM | #8

      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 às 10:02 AM | #9

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

    • 19/09/2011 às 9:03 AM | #10

      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 às 9:51 AM | #11

    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?

  8. Alexandre
    16/11/2011 às 8:48 AM | #13

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

  9. Elizandro
    18/12/2011 às 5:46 PM | #15

    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 às 10:08 PM | #16

      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 às 1:11 PM | #17

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

  11. lucas
    04/01/2012 às 6:13 PM | #19

    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 às 8:28 PM | #20

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

    • 12/03/2012 às 9:40 PM | #21

      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 às 6:22 PM | #22

    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 às 11:25 AM | #23

    Edison,

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

  15. fabio ferreira c s
    14/11/2012 às 12:46 AM | #25

    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 às 2:10 AM | #26

    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 às 8:25 AM | #28

    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 às 7:29 PM | #30

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

  19. IALE
    07/08/2013 às 5:31 PM | #31

    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.

  1. No trackbacks yet.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

%d blogueiros gostam disto: