== Tutorial Basico Sobre Cracking ==
Por: Narcotic
Introducao
----------
Esse tutorial tem a intencao de ajudar quem
esta iniciando nesse maravilhoso
mundo do cracking. Crackear eh basicamente fazer um programa comportar-se
como voce quer, e nao como os programadores dele querem.
Logicamente, vc precisa saber linguagem de maquina (assembly) para poder
comecar. Nao precisa ser nenhum mestre ou guru em assembly, sabendo alguns
principios basicos e conhecendo os registradores da arquitetura que vc esta
trabalhando, jah te torna capaz de fazer um crack. claro que, quanto mais
vc
conhecer assembly, melhor cracker vc serah.
Comecando
---------
Voce precisa de algumas ferramentas, para comecar
o trabalho. Primeiramente
um dissassembler, um programa que transforma os bytes do programa em
linguagem de maquina. O melhor dissassembler na minha opniao eh o "Win32
Dissassembler", tambem conhecido como W32Dasm.
A grande vantagem do W32Dasm eh sua busca por
referencias de strings. Voce
pode procurar onde o programa referencia textos, como por ex. "Versao
Trial
Expirada", ou "Programa registrado com sucesso", que o ajudarao
a achar os
pontos certos para crackear um programa.
Outra boa ferramente eh o Ultraedit (onde esse
texto esta sendo escrito).
Com ele voce pode ver os arquivos em hexadecimal, e consegue achar onde, no
arquivo, deve alterar o programa para que ele funcione da maneira que voce
quer.
Principios
----------
Existem 7 passos para vc crackear um programa:
1) Execute o programa que vc quer crackear e
descubra o padrao de comportamento
dele. Tente localizar frases e palavras chave, tente digitar senhas ou chave
de
registro e veja como o programa responde.
2) Abra o programa com o W32Dasm e disassamble ele.
3) Encontre frases tipicas e comuns no codigo
do programa que vc dessassemblou.
Na maioria dos casos, vc tem de procurar por palavras-chave como:
password, nome, data, expirada, limite de tempo, erros, entered e assim por
diante.
4) Encontre e observe o validador de senhas, encontre e aprenda como funciona
a
rotina de protecao e as chamadas API.
5) Tente entender o mecanismo de jumping (saltos) da protecao.
6) Abra o programa com o Ultraedit.
Mude alguns jumps para que ele faca o inverso, ou entao desabilite os jumps.
7) Execute o programa e veja como a mudanca que vc fez afetou o programa.
Aprenda esses passos muito bem, voce usara eles em todos os programas que
for crackear.
Fluxo de um Programa
--------------------
O processador de um micro computador eh inteiramente
burro (pelo menos
atualmente), a unica coisa que ele sabe fazer eh seguir linha a linha
executando instrucoes basicas. Ele apenas eh capaz de fazer o que o codigo
manda
ele fazer e nao eh capaz de fazer absolutamente nada alem disso. Quando voce
esta analisando um pedaco do codigo, voce tem q pensar como se fosse um
processador. Vc tem que fazer o que o processador faz, comparar registros
e
variaveis, executar jumps e calls, fazer operacoes matematicas basicas,
armazenar e carregar enderecos e valores, etc.
O processador tem um "Instruction Pointer"
feito especiamente para isso. Ele
tbm eh chamado de IP (nda a ver com o IP do Internet Protocol). O IP contem
o
endereco da instrucao que serah executada. Ele sempre executa a instrucao
que
vem logo abaixo, a nao ser que encontre instrucoes que modifiquem o fluxo,
como
jumps ou calls.
Eh nessa parte que entra o crack. Vc deve achar
os jumps e/ou calls que deve
modificar para remover a protecao do seu programa. Veremos a um exemplo
basico.
Exemplo de Crack
----------------
Como voce deve saber, dessassemblar e modificar
programas compilados sem
autorizacao do autor eh crime. Entao, como exemplo, eu vou escrever um
programa em linguagem C, e nos tentaremos remover a protecao dele.
/*------- tutorial.c ------*/
#include <windows.h>
int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE
hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
if(strcmp(lpCmdLine,"coca-cola") == 0)
{
MessageBox(0,"Parabens, voce registrou
o programa ou crackeou ele","Parabens",0);
}
else
{
MessageBox(0,"Sinto muito, tente de novo!!!","Teste",0);
}
return 0;
}
/*------- tutorial.c ------*/
Esse programa eh bastante simples. Ele apenas
mostra uma janela, ou com o
texto "Parabens, voce registrou o programa ou crackeou ele" ou com
o "Sinto
muito, tente de novo!!!".
Dessassemble o programa. Supondo que voce nao conheca o codigo do programa,
a primeira coisa que tem a fazer eh procurar pela frase "Sinto muito,
tente de
novo!!!". Voce deve achar algo do tipo...
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040111D(C)
|
:00401134 6A00 push 00000000
* Possible StringData Ref from Data Obj ->"Teste"
|
:00401136 684DA14000 push 0040A14D
* Possible StringData Ref from Data Obj ->"Sinto
muito, tente de novo!!!"
|
:0040113B 682FA14000 push 0040A12F
:00401140 6A00 push 00000000
* Reference To: USER32.MessageBoxA, Ord:0000h
|
:00401142 E8AB8A0000 Call 00409BF2
Esse codigo apenas chama a funcao MessageBox
passando os parametros p/ ela.
Mas veja, existe uma referencia a um jump antes de chamar a funcao:
* Referenced by a (U)nconditional or (C)onditional
Jump at Address:
|:0040111D(C)
|
Entao vamos a esse endereco (0x0040111D) ver
o q ele contem.
:0040111D 7515 jne 00401134
Esse eh o endereco. vendo um pouco mais de codigo
acima vemos:
:00401113 E86C010000 call 00401284
:00401118 83C408 add esp, 00000008
:0040111B 85C0 test eax, eax
:0040111D 7515 jne 00401134
Ele chama uma funcao no endereco 0x00401284,
soma esp + 8, testa eax, e se
nao for igual, pula para o endereco da nossa mensagem de erro. Bem, aqui vao
alguns detalhes importantes que vc tem q saber sobre linguagem de maquina:
1) Toda funcao retorna o valor em eax.
2) test registro, registro significa q ele tah testando se o valor do registro
eh zero
3) um pulo condicional sempre vem depois de um teste.
Entao, o q o nosso codigo faz eh bastante simples,
ele testa se o retorno da
nossa funcao eh zero. Se for, entao ele nao dah erro. O que podemos fazer
para ele nunca dar erro? Lembre-se, qualquer alteracao no programa tem q ser
cuidadosa, caso contrario, ele pode fazer coisas indesejaveis. Como dissemos
antes, o processador executa instrucoes uma apos outra, a nao ser q encontre
instrucoes de desvio, como calls e jumps. No nosso caso, nos nao queremos
que
ele se desvie, entao nos vamos "apagar o jne".
Pq "apagar". Porque vc nao pode simplesmente
remover 2 bytes do seu
programa, isso modificaria todos os enderecos do programa. Entao, o q
faremos eh substituir os bytes q nao queremos por NOPS. NOP eh uma instrucao
que
nao faz absolutamente nada. O codigo em hexadecimal do NOP eh o 90. Entao
substituiremos akele 75 e akele 15 por dois 90s.
Como? Agora entra em acao o ultraedit. Abra
o seu executavel com o
ultraedit. Ele vai aparecer em hexadecimal. Busque o codigo que voce quer.
Para isso, basta copiar os bytes que correspondem ao codigo que voce deseja
descobrir. No nosso exemplo seria E86C010000 (o call 00401284) + 83C408 (o
add
esp, 00000008) + 85C0 (o test eax, eax) e por ultimo o 7515 (o jne 00401134).
Nossa procura entao seria E86C01000083C40885C07515.
Entao achariamos:
00000700h: 8B 16 2C 00 8B 04 82 C3 55 8B EC 68 E8 A0 40 00 ; .,..ÃUìhè @.
00000710h: FF 75 10 E8 6C 01 00 00 83 C4 08 85 C0 75 15 6A ; ÿu.èl...Ä.
Àu.j
00000720h: 00 68 26 A1 40 00 68 F2 A0 40 00 6A 00 E8 C0 8A ; .h&¡@.hò @.j.èÀ
Agora, no lugar do 75 15 colocaremos o 90 90,
ficando a linha 00000710h assim:
00000710h: FF 75 10 E8 6C 01 00 00 83 C4 08 85 C0 90 90 6A ; ÿu.èl...Ä.
Àu.j
Salve o arquivo, de preferencia com outro nome,
para nao perder o original
caso nao funcione. Tente executar ele. Olha, agora toda vez que vc executa
ele
aparece a mensagem "Parabens, voce registrou o programa ou crackeou ele".
Finalizando
-----------
Agora, vc pode escrever o seu crack em qualquer
linguagem, basta abrir o
executavel e escrever os NOPs onde deve(no offset 1821).
Espero que vc tenha entendido pelo menos o basico
sobre o cracking. A
tecnica usada nesse tutorial foi a mais simples. Logo escreverei outros
sobre tecnicas mais avancadas. Mas vc tbm pode desenvolver suas proprias
tecnicas. Analise outros codigos. Faca protecao nos seus programas e tente
quebra-las. Dissassemble outros programas e veja como eles funcionam. Aprenda
mais sobre assembly. E lembre-se, sempre, conhecimento nao eh bom ou ruim,
o que
voce faz com ele eh que eh bom ou ruim.
Esse tutorial foi escrito por Narcotic <narcotic@brasnet.org>,
as 15:11 do
dia 26/12/2002. Sugestoes, criticas, comentarios sao bem vindos. Voce pode
me
contatar por email, ICQ (35259140), ou via IRC com o nick Narcotic na rede
BrasNET <irc.brasnet.org>.