Como fazer engenharia reversa em apps Android

Android Pirata

Ao longo do tempo que venho dando palestras e cursos sobre a plataforma Android, muitos estudantes me perguntam a respeito de engenharia reversa em aplicativos Android.

Como fazer?

Como se proteger?

O que acontece perante a lei?

E por aí vai. Neste post tratarei exclusivamente de uma técnica bem simples de fazer a decompilação de aplicativos Android instalados (ou não) em seu dispositivo móvel (celular, tablet, etc). Na verdade o procedimento é bem simples e pretendo em posts futuros falar de como proteger o seu app dessas práticas. Saliento que recomendo tal prática apenas para fins de estudo, para entender como os apps foram feitos, etc e que não me responsabilizo pelo que você vai fazer com esse conhecimento.

Veremos neste artigo:

* OBS: estava com muita preguiça e não quis tirar prints do processo. Mas garanto que é bem óbvio, então sigam o passo-a-passo com os programas que eu citar em mãos.

O que é Engenharia Reversa?

Para quem não sabe, engenharia reversa é a prática de, a partir do código executável de um sistema, obter o código fonte original, permitindo em alguns casos até mesmo modificá-lo e recompilá-lo novamente para distribuição, o que muitas vezes é o tipo de prática maliciosa que os crackers utilizam para burlar os executáveis dos jogos de computador. Em linguagens de programação compiladas como C, ou até mesmo em linguagens híbridas como Java e C#, o processo de reversão da engenharia consiste em ler o código binário do arquivo CLASS/DLL/EXE/etc e convertê-lo de volta para seu equivalente em Java/C/C#/etc. Simples assim.

O primeiro passo para se realizar engenharia reversa de uma app Android é ter o arquivo .APK do aplicativo que se deseja ver o código-fonte. Caso você tenha pego este aplicativo na Internet (fora da Google Play), pule os dois próximos tópicos. Caso contrário, leia pois é importante.

Como se tornar um administrador do SO Android (Rooting)

Por padrão, o Android não permite acesso do usuário, ou mesmo das aplicações, aos recursos do sistema operacional, incluindo aqui os aplicativos instalados. Para manter isto ainda mais “seguro”, a Google Play não permite o download dos aplicativos para um computador tradicional, somente para tablets e smartphones. Entretanto, existe uma prática chamada rooting que elimina os bloqueios de segurança da plataforma e dá ao usuário super-poderes, como um usuário administrador do Android. Para poder ter acesso aos apps instalados no seu smartphone, o primeiro passo é se tornar root do mesmo.

Existem diversos aplicativos para fazer rooting de dispositivos Android. Um que já usei e recomendo é o SuperOneClick da ShortFuse (o site deles não existe mais, use este link para baixar ou algum outro programa de rooting). Ainda que eu tenha usado com sucesso e tenha funcionado perfeitamente, não há garantias de que acontecerá o mesmo para seu smartphone, então não responsabilizo pelo que possa acontecer durante o processo de rooting. Além disso, o processo de rooting elimina a garantia de fábrica dos aparelhos, então só use se sua garantia (geralmente de 1 ano) já acabou.

Uma vez que tenha baixado o SuperOneClick em sua máquina no site que mencionei, vá no seu Android e habilite a opção de Depuração USB (em Configurações -> Aplicativos -> Desenvolvimento -> Depuração USB). Depois, execute o SuperOneClick como administrador e clique no primeiro botão do programa para fazer rooting no seu dispositivo. Isso pode demorar alguns minutos e ele vai reiniciar algumas vezes. Confirme todos diálogos que surgirem (inclusive o de doar dinheiro pros caras, se assim quiser) e ao término do processo, você terá um programinha extra instalado em seu dispositivo, o SuperUser, que dá o privilégio de root para outros aplicativos que você escolher.

Titanium Backup

Como Pegar um app instalado em seu smartphone/tablet Android

Agora que você tem privilégios de administrador, você pode ir na Google Play e baixar o excelente TitaniumBackup (ver na Google Play), um app que permite a você copiar outros apps instalados em seu dispositivo para o cartão SD< fazendo um backup deles (incluindo banco de dados). Para que o Titanium Backup funcione, você deve estar executando ele em um celular rooted (que sofreu o processo de rooting descrito no tópico anterior). Além disso, você não pode estar com o cabo USB conectado no computador, caso contrário ele não conseguirá acessar seu SD para salvar o backup das apps. O TitaniumBackup tem duas versões, mas para nosso exemplo, a versão free é o suficiente.

Uma vez que esteja rodando o Titanium Backup como root no Android (ele te pedirá para fazer isso), clique no botão que diz “Backup/Restauração” e escolha a app que deseja fazer backup. Pronto, você acabou de concluir a primeira etapa do processo. Agora conecte seu smartphone no PC novamente e vá no seu cartão SD, copiando a pasta TitaniumBackup que deve estar dentro dele, com o backup da app.

Como fazer Engenharia Reversa no APK

Com o apk em mãos (independente se usou o TitaniumBackup ou baixou o APK da Internet), você pode trocar sua extensão para .ZIP e dezipá-lo em uma pasta. Sim, o APK é apenas uma pasta compactada. Dentro da nova pasta, estará toda a estrutura de diretórios do projeto do aplicativo, incluindo os arquivos estáticos (assets), os recursos (resources) e as classes Java, que estão compiladas em um arquivo binário chamado classes.dex. .DEX é a extensão do arquivo executável entendido pela máquina virtual Dalvik, do Android. Para poder lê-lo, primeiro temos de convertê-lo para o executável do Java tradicional, o .JAR.

Para converter arquivos DEX para JAR, recomendo a utilização do Dex2Jar, um projeto open-source hospedado no Google Code (página do projeto). Muito simples de usar, copie o classes.dex pra mesma pasta do Dex2Jar, abra o prompt do DOS, navegue até o diretório do Dex2Jar e execute o comando (sem aspas) “dex2jar.bat classes.dex” e ele criará um classes_dex2jar.jar. Para abrir o arquivo JAR, basta trocar sua extensão para .ZIP e descompactá-lo, assim como fez com o .APK.

Dentro da pasta que foi originada a partir do JAR, temos a estrutura de diretórios do projeto, mas agora no modelo Java tradicional. Mas ainda não chegamos onde queremos, pois foram gerados os arquivos .class, também conhecidos como Java bytecodes, que não podem ser lidos por humanos, apenas pela JVM. Então o próximo passo é convertermos os arquivos .class para as classes tradicionais .JAVA, em texto puro. Para isso, iremos precisar de um outro programinha, o JD-GUI (ou Java Decompiler, deste site). Com esse programinha, basta abrir os arquivos binários do Java que ele lhe mostrará o código fonte que originou aquele arquivo. E voilá, temos o código fonte de uma app Android que estava instalada em seu celular. Fácil, não?!

Como fazer Engenharia Reversa no Banco de Dados SQLite de um app

Mas e se o aplicativo possui um banco de dados? Você também não gostaria de ter acesso ao mesmo, para entender melhor a aplicação? Ou para ler seus dados? Pois bem, o próprio Titanium Backup também faz backup do banco de dados da aplicação, que ele coloca dentro de uma pasta data na pasta do backup. Lá dentro você terá um arquivo com a extensão .db que nada mais é do que a base de dados SQLite usada pelo aplicativo. Para abri-la, recomendo (sim, outro programinha) chamado SQLite Manager (ele é um plugin para Firefox, que pode ser baixado neste site). Ele é um plugin para Firefox que fica no menu de ferramentas do browser. Com ele, você pode abrir arquivos .db selecionando-os no menu de abrir arquivo. Com isso, você verá todas as tabelas e dados do banco de dados, inclusive podendo executar queries sobre o banco. Bacana, não?!

Conclusões

O processo é longo mas é bem simples. Basicamente utilizamos uma série de programinhas, cada um com sua utilidade, para ter acesso final ao código-fonte (e dados) de uma aplicação Android. O processo é fortemente documentado na Internet e em livros e é possível graças à própria arquitetura do Java e do Android, que permitem esse tipo de decompilação. Apesar disso, as práticas de rooting, backup de apps e decompilação de DEX e CLASS não é bem vista pelos fabricantes de smartphones, operadoras de telefonia e desenvovledores do SO Android. Além disso, o uso de tais técnicas, dependendo do seu propósito e do que fizer depois que tiver os fontes em mãos, pode ser considerado um crime, indo desde plágio, infração do contrato com a Google Play ou até espionagem industrial, então tome cuidado.

Um bom uso destas técnicas, por exemplo, seria ter acesso ao código fonte de um app seu que você perdeu o projeto original. Eu mesmo já fiz isso uma vez. Outro uso aceitável é verificar se sua aplicação é resistente à engenharia reversa (em breve gostaria de postar a respeito de técnicas quanto a isso), tentando fazer esse processo com um aplicativo seu e vendo se alguém conseguiria ler os seus fontes (a dica aqui é ofuscação, leiam sobre isso). E por último, um uso não tão legal (do ponto de vista da lei) mas que pode lhe ser muito útil é entender como um recurso específico de um aplicativo foi feito, ou seja, usar para aprender a desenvolver melhor, mas nunca copiar!

Comentem o que acharam do post e caso conheçam outras ferramentas igualmente úteis para engenharia reversa em Android, postem nos comentários.

* OBS: curtiu o post? Então dá uma olhada no meu livro de Android clicando no banner abaixo pra aprender a criar outros tantos apps incríveis!

Criando apps para empresas com Android

O que achou desse artigo?
[Total: 54 Média: 3.3]