1. “Crackeando” Aplicativos no Android
Vítima: Crackme PatchTest
Dificuldade: Média
Objetivo: Fazer um Patch no Aplicativo
Ferramentas: SDK/AVD Android Manager, Baskmali, Smali, Sign+, Winrar
Data: 13/11/2011
Feito por: C0M3ND4D0R
Advertência
Antes de começar a ler esse tutorial, você deve estar de acordo com todas as condições
a seguir:
Ao ler esse tutorial, o leitor aceita incondicionalmente sua total e exclusiva
responsabilidade legal, de acordo com as leis vigentes nesse país, pelo uso das
técnicas experimentais, educativas e/ou de investigação aqui mostradas. Caso não esteja
de acordo de qualquer das condições impostas, deverá então imediatamente eliminar esse
tutorial e todo material associado ao mesmo.
Iniciando
Aqui começo uma seqüência de tutoriais voltados ao “cracking” em aplicativos para o
android, logicamente, desde que se encontrem os crackmes criados para tal. Lembrando
que o propósito aqui apresentado é puramente didático com o intuito educacional.
No final deste tutorial estarei disponibilizando links para download das ferramentas
aqui utilizadas e referencias para serem estudadas.
Vamos iniciar mostrando o Android SDK Manager, porém, antes de começarmos é necessário
atualizar os pacotes (packages), eu recomendo que faça atualização de todos e isso
levará um tempo para finalizar.
Seguindo clique na aba Tools do (SDK) para chamar o AVD e criarmos um “device”, AVD é
Android Virtual Device Manager responsável pela emulação do android. Veja imagem
abaixo.
2. Clique em New… para criar o device, veja a imagem abaixo… assim deve ficar a
configuração, na seqüência clique em Create AVD.
Agora nosso Device devidamente criado.
3. Clicamos em Start… para iniciar a emulação.
Veja a imagem à cima, lembre-se sempre de marcar a caixa “Wipe user data” antes de
iniciar o emulador, essa opção é responsável por facilitar a desinstalação do crackme
vítima e de qualquer outro conteúdo ou aplicativo. Clicando em Launch podemos ver já
nosso emulador funcionando perfeitamente.
4. Iremos até o diretório do instalador das apks. APK é application package file (APK), é
o formato de arquivo usado para distribuir e instalar software de aplicativos para o
sistema operacional, Google Android. Mais informação no endereço abaixo:
http://en.wikipedia.org/wiki/APK_(file_format)
Vamos instalar nossa vítima, pra isso arrastamos o alvo para pasta onde se encontra o
instalador. No meu caso se encontra em: C:Arquivos de Programas(x86)Androidandroid-
sdkplatform-tools
Antes vamos listar as devices, esse é o comando… veja na imagem abaixo:
5. Nosso device listado, reparem em List of devices attached apenas um, e é justamente o
nosso.
Vamos agora instalar nosso crackme vítima, o comando pra isso é: adb install
“nome_do_aplicativo” (sem aspas), você pode ver na imagem abaixo:
Se tudo correr perfeitamente, aparecerá a mensagem: Success (Sucesso,Dããããã).
E já podemos visualizar o aplicativo (crackme) devidamente instalado.
Ao darmos duplo clique em nosso aplicativo, vejamos o que temos por esperar…
6. Hummmm, uma mensagem Not Registered nada simpático. Felizmente, por outro lado já temos
algo para procurar.
Precisamos analisar o crackme e encontrar essa mensagem de não registrado, para isso
será necessário extrair o conteúdo do arquivo.apk (Patchtest.apk), pode ser usado o
winrar, por exemplo, para fazer essa tarefa. O processo é muito parecido como o que é
feito em arquivos Java. Uma vez extraído seu conteúdo temos isso, o conteúdo que pode
ser visto na imagem abaixo.
E o que é mais importante no momento é o arquivo classes.dex. Porém, não podemos mais
utilizar o winrar para extrair o conteúdo do arquivo classes.dex, para essa tarefa será
usado uma outra ferramenta, o baksmali. O comando para isso pode ser visto na imagem
abaixo:
O –o CMNDDR é para criar uma pasta onde os arquivos serão todos extraídos. Veja na
imagem abaixo os arquivos [smali] extraídos.
7. Desta forma podemos visualizar os arquivos em qualquer um dos editores de texto
disponível. Lembrem-se da string de mensagem que temos que buscar: Not Registered. Esse
processo pode ser demorado, uma vez que teremos que analisar um-por-um desses arquivos.
Depois de um tempo analisando os arquivos, não encontro a mensagem de “badmsg”, porém,
encontro o oposto, a mensagem: "Registered!". Veja isso no código abaixo:.
.class public Lcom/Android/Patchtest/Patchtest;
.super Landroid/app/Activity;
.source "Patchtest.java"
# instance fields
.field status:Landroid/widget/TextView;
.field webaddress:Landroid/widget/TextView;
# direct methods
.method public constructor <init>()V
.registers 1
.prologue
.line 25
invoke-direct {p0}, Landroid/app/Activity;-><init>()V
return-void
.end method
# virtual methods
.method public onCreate(Landroid/os/Bundle;)V
.registers 4
.parameter "savedInstanceState"
.prologue
.line 32
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
.line 33
const/high16 v0, 0x7f03
invoke-virtual {p0, v0}, Lcom/Android/Patchtest/Patchtest;->setContentView(I)V
.line 35
const v0, 0x7f050001
invoke-virtual {p0, v0}, Lcom/Android/Patchtest/Patchtest;-
>findViewById(I)Landroid/view/View;
9. :goto_9
return v2
:cond_a
const/4 v2, 0x0
goto :goto_9
.end method
Não vou explicar toda essa linguagem, todo esse código, terá alguns links no final onde
vocês terão informações sobre ela. Vou dar uma pequena explanação no ponto onde é o
mais importante para fazer o patch nesse aplicativo (crackme).
O importante é essa linha: if-eqz v0, :cond_28. Aqui ocorre um salto para mensagem de
erro, vamos patchear essa linha.
If-eqz = Salta para a posição atual, no caso v0, cond_28. Vamos alterar para If-nez.
If-nez = Salta para a posição atual se for diferente de zero. Ou seja, faz a função
inversa de If-eqz.
Bom, feito a alteração devemos agora transformar os conteúdos dos arquivos smali,
novamente em arquivos.dex. Temos outra ferramenta que passaremos a utilizar agora, me
refiro ao: smali.
O comando usado para essa tarefa você pode ver na imagem abaixo:
O “com” é uma pasta que foi criada dentro da pasta CMNDDR, reparem que tive que dar um
nome diferente do original (classes.dex), para classes1.dex. Não podemos esquecer de
voltar a renomear com o nome original (classes.dex) para que funcione perfeitamente.
Feito todo o trabalho de renomear, precisamos agora substituir o classes.dex novo pelo
antigo.
Vamos agora instalar esse arquivo patcheado, o comando para instalar aplicativos no
android já foi mostrado aqui. Veja imagem
Opsss. Um erro, o android possui uma assinatura digital que identifica ser seguro e não
ser alterado, como foi o caso aqui… lembre-se que fizemos uma alteração no arquivo
original. Para corrigir esse erro vamos usar outra ferramenta para nos auxiliar, estou
me referindo ao: Sign+. Veja imagem do mesmo abaixo:
10. O uso da ferramenta não tem segredo, é muito simples. Vamos abrir nosso crackme na
ferramenta, clicando em Browse e em seguida “Sign Files”.
Na pasta onde se encontra o original (Patchtest) foi criado um “genérico” signado.
Patchtest_signed.apk, vamos instalar esse, veja como na imagem.
Instalado com sucesso, isso faz com que nosso aplicativo esteja crackeado… vamos
conferir.
11. Ok, aplicativo android crackeado… Vale lembrar, não se esqueça sempre de fazer a
desinstalação do crackme antigo, senão o fizer poderá ocorrer um erro na instalação do
aplicativo crackeado.
É isso pessoal, um tutorial que me deu certo trabalho para terminar, mais com dedicação
e pesquisa, terminei. Volto a repetir a idéia de criar esse tutorial é puramente
didático e voltado ao estudo e aprendizado na técnica de Engenharia Reversa.
O autor não se responsabiliza por uso indevido das informações aqui postadas.
Um Obrigado muito especial ao amigo: Everdoh
A todos os membros das comunidades: CIN1TeAm, CTB Team, Fórum Invaders
Links das ferramentas usadas nesse tutorial:
Android SDK = http://developer.android.com/sdk/index.html
Baksmali/Smali = http://code.google.com/p/smali/downloads/list
Sign+ = http://forum.xda-developers.com/showthread.php?t=997180
Referências para leitura:
http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
http://developer.android.com/guide/developing/tools/adb.html
http://netmite.com/android/mydroid/dalvik/docs/dalvik-bytecode.html
by C0M3ND4D0R