------------------------------------------------------------- Tutorial Basico sobre Cracking Copyright (c) 2004 Motd Laboratories. All rights reserved. Narcotic narcotic@motdlabs.org ------------------------------------------------------------- Introducao ---------- Esse tutorial tem a intencao de ajudar quem esta iniciando nesse maravilhoso mundo do cracking. Basicamente, crackear eh 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 opiniao 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 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 , 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 .