Índice Virii Hacking Guide 01

== 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>.