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)
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.
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!
nossa cara muito bom mesmo, obrigado me ajudou muito em meus estudos…
tenho um blog sobre android tb de uma olhada..
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.
Então…
Agente vai poder converter .apk para .jar???
Olá,
Sim, é o que os procedimentos que relacionei acima fazem.
Abraço,
Edison
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
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!
E com isso agente pode rodar aplicativos do Android em outro smartphone?
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.
Caro, somente consegui visualizar o arquivo final convertido. Como edita-lo ?
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!
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?
Já tentou abrir o arquivo em um editor ? Agora basta você ler o código fonte!
Com o AXMLPrinter2 é possível converter os outros xml contido no res ou é necessário um outro procedimento?
Olá Alexandre,
É necessário outro procedimento.
Você precisa utilizar o apktool.
Abraço,
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?
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.
eu travei em CONVERTENDO O ARQUIVO DE CLASSES alguem pode me ajudar?
Olá Lucas,
Qual sua dúvida?
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.
Como adaptar tudo que foi convertido pra ser trabalhado com o ECLIPSE?
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
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
Edison,
Você tem algum procedimento para os APKs que tem os odex junto?
Olá Alexandre, não tenho.
Se descobrir algo, compartilhe por favor.
Abraço
Ola, beleza , entao , apos as modificações nos arquivos .src como compilar para retorna-los a .jar ? Dá uma força ai. Obrigado
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!
Talvez esse aplicativo te ajude: http://forum.xda-developers.com/showthread.php?t=1910873
Você pode baixá-lo daqui: http://broodplank.net/files/APKtoJava_RC2.rar
[ ] ´s
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
Sim. Você precisa ter o Java instalado no seu computador. Você pode fazer o download aqui: http://www.java.com/pt_BR/download/
[ ] ´s
Legal, Muito Legal, mas como converter o .java e dex novamente, alguém sabe?
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.
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
Pode fazer o download aqui: http://jd.benow.ca/
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á!
Olá Joana. O APK to Java, (https://github.com/broodplank/APKtoJava), tem uma opção para fazer isso. Mas não acredito que irá funcionar. Sem falar que o Eclipse já entrou em desuso. Não existe trabalho fácil.
Tem como trabalhar com esses arquivos no Eclipse para edição ou não é possível?
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.