Você está na página 1de 6

INTRODUAO Neste post eu ensinarei o basico sobre o mundo do cracking(como crackear programas) Crack de alterar o cdigo binario de um programa

pra fazer com que ele faa algo que voc queria como no validar um login ou algo assim. Antes de colocar a mo na massa sujiro que corra atraz de algum materia sobre assembly Voc precisa de saber o bsico sobre assembly.. Vai algo muito enxuto sobre alguns comandos ASM que sero necessrio neste tutorial: * Call -> Call quer dizer chamar ele pula pra posicao do cdigo que e passado como parmetro. ex: Call 00401144 ;isso vai pular pra posicao 00401144 do cdigo * JMP -> jmp(jump -> Salto, pulo) faz a mesma coisa que call A diferena que com jmp no e possvel retornar ao cdigo j com call se aparecer um ret(return = retorne) ento ele segue para a linha logo apos o call Esta so duas instrues de salto incondicionais que quer dizer que se voc usa-las, o programa saltara independente de qualquer coisa //Gostou n!!!. Vamos agora ver somente duas instrues condicionais: * JE -> JE(Jump if equal) e uma instruo que ira pular se um valor X for igual a um valor Y * JNE -> Se voc for esperto deve perceber que essa e a negao da outra JE(Jump if not e qual) vai fazer um salto se um valor de X no for igual a um valor de Y JO jump if overflow JB jump borrow (borrow = menor above = maior) A lgica do cracking Estamos chegando l, vamos antes explicar como que se crackeia um programa simples pra depois colocaremos a mo na massa. A lgica do cracking a seguinte. Quando voc digita algum serial ou algo assim: o programa verifica se o serial e valido ou no?? Ento como seria para burlar essa proteo, essa verificao em ASM? Voc tem alguma idia do que uma hora ou outra vai aparecer no cdigo?? Si voc disse que no, ento vou te responder > uma ora ou outra vai aparecer uma instruo de salto(aquelas que apresentei no comeco) que quando verdadeiro v para a parte do cdigo que diz que o serial e verdadeiro e outra pra quando o serial for falso, Deu pra entender? vamos tentar! - je 00127889 => se o serial for igual ento pula pra 00127889 Deu pra entender + ou ?? ento o que essa instruo faria se voc trocasse o je por um jne assim: - jne 00127889 => ???? Se o serial no for igual ento pula pra 00127889 Mais voc j sabe que a posio 00127889 da memoria a parte onde o programa ir executar as aes caso o serial for valido? se voc trocar je por jne. Mais ns podemos melhorar isso! nem vale a pena escrever essa merda =\.. como ficaria se trocassemos nosso jne por um simples jmp ?? ISSOOOO!!! No verificara mais nada=] Ento ele pulara sem depender do serial esta certo ou errado entaum ficaria assim: - jmp 00127889 => Pula pra posical 00127889 da memria. Achou fcil? Agora tem um pequeno problema.. como vamos fazer isso ?? vamos disassemblar nosso programa, v aonde ele pula e troca a instrucao Essa a primeira parte para o crackeio de um programa. Para isso eu uso o W32Dasm. programa que muita gente usa pra esses fins, mais nele eu no sei como alterar ento vamos pegar um editor de hexadecimal para podermos alterar nosso programa Usarei o Visual Basic para nos ajudar com os cracks, mais poderia ser qualquer programa que de pra abrir arquivos em binrio. Mauns a massa Bem Finalmente chego a hora de sairmos da teoria e passarmos para a pratica. Digo logo que no pretendo

ensinar tudo sobre cracking.. Nos alteraremos dois programas no ser programas conhecidos pois eu no tenho nenhum exemplo bom para demostrar e tambm no tenho muito tempo de ficar procurando vulnerabilidades em programas assim, E tambm no quero ter problemas com os caras que fizeram eles. Os dois programas que ns crackearemos sero feitos por ns mesmos para fins de aprendizagem somente o primeiro dele e um programa que s verifica se j esta registrado ou no. se ele tiver, ento aparece uma MSG dizendo que esta.. Se no aparece outra dizendo que no est validado segue o cdigo dele(em VB): Para quem no sabe nada de vb, Basta deixar um comentrio pedindo uma explicaao de como inserir o codigo. +++++++++++++++++++++++++++++ Sub Main() Dim Registrado As Boolean If Date = 19/12/2004 Then Vamos dizer q ele expiro a um dia =] Registrado = True Else Registrado = False End If If Registrado = True Then MsgBox Programa registrado! Else MsgBox Programa no registrado! End If End Sub +++++++++++++++++++++++++++++ Compile este cdigo e execute Veja que aparecera a mensagem Programa no registrado! sempre que voc executar ele ento podemos dizer que o serial j expiro ou algo assim. Agora abra o executvel no W32Dasm para poder descompilar ele.. mais no tem importncia o que voc sabe sobre o programa?? isso mesmo.. 1 -> Ele no esta registrado 2 -> Sempre aparece a mensagem Programa no registrado! Ento o que voc tem que fazer e ir em Search -> Find Text e localizar por Programa no registrado! Voc achara esta frase na seguinte linha: - * Possible StringData Ref from Code Obj ->PPrograma no registrado! - Ento v subindo at achar a linha q possui o seguinte: * Referenced by a (U)nconditional or (C)onditional Jump at Address: O que essa linha quer dizer?? Quer dizer que o inicio de algum cdigo e que algum lugar pulo para esta posio ento que posio seria esta veja abaixo desta linha: * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004016F3(C) Repare que ele nos mostra um endereo de uma posio no programa ento quer dizer que nesta posio(004016F3) tem alguma instruo que pula para esta parte do cdigo.. que a parte onde nos diz que o programa no esta registrado certo?? Ento vamos para a posio 004016F3 do cdigo.. pressione Shift+F12 e digite o endereo Aonde nos fomos parar??? :004016F3 7543 jne 00401738 Isso mesmo, um pule se no for igual ento o que isso faz?? simples.. se o programa no estiver registrado ento ele vai para a parte onde nos mostra a mensagem ento o que nos temos que fazer?? colocar je ou jmp ?? no mesmo.. porque se no ele sempre ir dizer que no esta registrado o que fazer ento?? Alterar a hora do windows pra poder usar at quando quiser?? Concerteza no!!! Vamos simplesmente tirar esta instruo do nosso programa voc pode estar pensando: s deletar ela ento n?? eu respondo.. voc pensa, mais que pena que esta errado isso porque quando o programa e compilado.. ele gera os offsets(endereos de memria) baseado no nosso cdigo ento se nos tirarmos esses dois bits do nosso programa todos os offsets depois dessa instruo sero decrementados de dois bytes

ento qualquer instruo de salto que pule para depois desta instruo ira parar no lugar errado. ento o que fazer? voc s tem que trocar esses dois BYTES por dois NOPs esse um comando que eu esqueci de falar NOP = No Operation ento ele no faz nada =] ento quais bits seriam estes? Voc esta vendo aquele numero em Hex entre o endereo e o comando? isso mesmo aquele 7543.. ele o comando jne 00401738 em linguagem de maquina.. Esses comando esto em hexadecimal.. se voc pegar cada parte dele 75 43, ver que ele so dois caracteres \x75\x43 que o valor dele no arquivo executvel ento abra o nosso executvel em um editor hex qualquer.. e procure pelo valor 75 43 verifique se existe mais de um se existir voc ter que procurar mais especificaes como por exemplo o valor do comando de antes e o valor do comando seguinte: : 004016F0 8945CC mov dword ptr [ebp-34], eax :004016F3 7543 jne 00401738 :004016F5 8D559C lea edx, dword ptr [ebp-64] Nos caso voc ter que procurar por: 89 45 CC 75 43 8D 55 9C Se mesmo assim existirem mais de um tente ser mais amplo bem.. mais no nosso exemplo s existe uma instruo com o valor 75 43 ento no editor hex troque o valor desses 75 43 por 90 90 respectivamente que so dois NOPs para substituir nosso jump para nenhuma operao =] Agora salve seu programa(com outro nome pra evitar problemas) e execute ele VIVAAAAAAAAA!! -> Programa registrado! Agora voc s precisa de fazer um crack pra ele no vou colocar como eu fao em vb.. mais s voc abrir o programa em binrio localizar pelo texto: strNormal = Chr(Val(&H75)) & Chr(Val(&H43)) e trocar pelo valor: strCracked = Chr(Val(&H90)) & Chr(Val(&H90)) Ai quando voc salvar seu programa voc tera alterado ele. Mais veja como seria um cdigo basico em VB para isso: ++++++++++++ ++++++++++++++++++++++++++++++++++++++++++ Dim bf as String strNormal = Chr(Val(&H75)) & Chr(Val(&H43)) strCracked = Chr(Val(&H90)) & Chr(Val(&H90)) bf = Space(FileLen(ex1.exe)) Open ex1.exe For Binary Access Read As #1 Get #1, , bf Close #1 bf = Replace(bf, strNormal, strCracked) Open ex1[cracked].exe For Binary Access Write As #1 Put #1, , bf Close #1 ++++++++++++++++++++ ++++++++++++++++++++++++++++++++++ Viu como simples d+ da conta?? Uma coisa que voc deve ter em mente o seguinte! O ASM varia de processador pra processador ento se aqui no meu PC o endereo de pulo foi 00401738 no seu pode ser diferente. ento no adianta copiar e colar o cdigo e pensar que vai dar certo porque no vai eu fiz esse cdigo pra essa compilao que eu acabei de fazer Pois isso que as vezes quando o programa simples voc acha o crack pra alterar o exe.. mais quando o programa possui diversas compilaes como um jogo complexo por exemplo - o mximo que voc poder achar o executavel do jogo j crackeado. Vamos agora ao nosso segundo exemplo pratico.. vamos ao projeto: Crie um novo projeto no VB(adoro essa linguagem) Adicione um boto(cmdVerifica) e uma caixa de texto(txtSenha.Text) em form e um novo formulrio(Form2) Coloque o seguinte cdigo: ++++++++++ +++++++++++++++++++++++++++++++++ Private Sub cmdVerifica_Click() If txtSenha.Text = chuck_newbie Then

Form2.Show Else MsgBox Senha invalida! End If End Sub +++++ ++++++++++++++++++++++++++++++++++++++ Para quem nao tem nocao alguma sobre este codigo, Ele fala o seguinte: Si a senha digitada for igual a chuck_newbie ento, abra a pagina form2. se no dar uma mensagem de senha invalida. Obs: si voc no tem noo alguma de programao, Pare agora de ler este tutorial e va aprender pelo menos o bsico de linguagem de programao e algoritmo. Agora compile e execute.. Voc no sabe a senha ento digite qualquer coisa e veja o que aparece Senha invalida! . agora abra o executvel no W32Dasm e procure por essa string Voc achara ela na seguinte linha: * Possible StringData Ref from Code Obj ->SSenha invalida! Agora v subindo at achar a linha * Referenced by a (U)nconditional or (C)onditional Jump at Address: Pegue o endereo que esta logo abaixo desta linha que se voc no se lembra o endereo que possui um salto para esta parte do cdigo.. * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00401F55(C) que no meu caso 00401F55 agora v para esta posio do cdigo: :00401F55 0F8484000000 je 00401FDF Esta a nosso pulo ele vai dizer que a senha invalida se for igual.. voc pode estar se perguntando porque ele pula se for igual.. simples porque o JE no quer dizer que a senha igual a senha digitada mais sim que a comparao feita seto os flags de um jeito que quer dizer isso. mais isso no vem ao caso, pois esse tutorial no sobre ASM o que voc tem que pensar que se alguma coisa for igual a outra ento ele vai dar que a senha invalida ento voc s tem que fazer o mesmo esquema que anterior retirando esta instruo do seu programa mais como nos sabemos? No podemos simplesmente tirar temos que substituir esta instruo pelo mesmo tamanho dela, s que executando nops =] Se voc quiser editar ele em hex fique a vontade mais j que eu no tenho nenhum aqui prefiro fazer o crack mesmo. No se esquea de verificar se existe mais alguma instruo igual a essa antes de substituir Mais por nossa sorte no tem ento vamos ao crack Ele s tem que substituir 0F8484000000 por 909090909090 isso mesmo um monte de nops O cdigo do nosso crack deveria ser algo como: ++++++++++++++++++++++++++++++++ ++++++++++++++++++++++ Dim bf as String strNormal = Chr(Val(&H0F)) & Chr(Val(&H84)) & Chr(Val(&H84)) & _ Chr(Val(&H00)) & Chr(Val(&H00)) & Chr(Val(&H00)) strCracked = Chr(Val(&H90)) & Chr(Val(&H90)) & Chr(Val(&H90)) & _ Chr(Val(&H90)) & Chr(Val(&H90)) & Chr(Val(&H90)) bf = Space(FileLen(ex1.exe)) Open ex1.exe For Binary Access Read As #1 Get #1, , bf Close #1 bf = Replace(bf, strNormal, strCracked) Open ex1[cracked].exe For Binary Access Write As #1 Put #1, , bf Close #1 ++ +++++++++++++++++++++++++++++++++++++++++++++++ +++++ Se voc for esperto desenvolver funes para facilitar o cdigo olha como fica meu cdigo com as funes que eu desenvolvo: ++++++++ ++++++++++++++++++++++++++++++++++++++++++++++ Private Sub cmdPatch_Click() Dim sNormal As String Dim sPatch As String Dim R As Integer If txtF.Text = Then Exit Sub txtF contem

caminho do arquivo sNormal = Bin(0F8484000000) sPatch = Bin(909090909090) R = Patch(txtF.Text, sNormal, sPatch) If R = CRACKED Then lblS.Caption = CRACKED! ElseIf R = CORRUPTED Then lblS.Caption = FILE CORRUPTED OR ALREADY CRACKED! Else lblS.Caption = ERROR! End If End Sub ++++++++++++++++++ ++++++++++++++++++++++++++++++++++++ Vamos agora fazer uma coisa um pouco mais complicada veja o cdigo abaixo: ++++++ +++++++++++++++++++++++++++++++++++++++++++++++ + Sub Main() Dim Registrado As Boolean If Date = 19/12/2004 Then Vamos dizer q ele expiro a um dia =] Registrado = True Else Registrado = False End If If Registrado = False Then MsgBox Programa no registrado! Else MsgBox Programa registrado! End If End Sub +++++++++++++++++++++++++++++++++++++ +++++++++++++++++ Ele faz a mesma coisa que o anterior com a nica diferena que ele verifica se no esta registrado no if! ento grave em um novo projeto, compile e execute.. voc ver que realmente ele faz o mesmo que o anteriores.. agora abra ele no w32dasm e tente crackealo como a gente tem feito at agora Ta lendo ainda n?? mais digo logo que voc no conseguir pra evitar esse tipo de problema voc s tem que ficar atento ao cdigo do programa vamos passo a passo abra no W32Dasm e procure por Programa no registrado! OBS: Algumas vezes voc no conseguira achar o resultado da string se isso ocorrer tente novamente s que procurando somente por parte dela.. nesse caso voc tambm pode tentar localizar no ou no registrado.. isso fica ao seu critrio achando a frase vim o segredo nos sempre subimos no cdigo procurando o inicio dele at achar uma parte de uma instruo que salta pra ele mais nesse caso a instruo salta pra parte falsa do cdigo ento o que voc tem que fazer voc tem que perceber.. que o salto esta dentro deste prprio cdigo. ento v subindo at achar alguma das instrues de salto.. achei uma a trs linha acima: :004016F2 7543 jne 00401737 O que essa belezinha ai faz?? simplesmente pula se uma coisa no for igual a outra. Voc pode estar pensando e da?? bem o que aconteceria se essa coisa FOR igual a OUTRA coisa?? ele iria pra parte do cdigo onde aparece a mensagem de no registrado mais uai pra onde ele pula ento pra saber isso basta pegar o endereo no qual ele pular e ver o que ele executa GoTo / Goto Code Location => Digite: 00401737 e clique em OK VIVA!! Voc viu aonde ns camos: * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004016F2(C) | :00401737 8D559C lea edx, dword ptr [ebp-64] :0040173A 8D4DDC lea ecx, dword ptr [ebp-24] * Possible StringData Ref from Code Obj ->PPrograma registrado! | :0040173D C745A464134000 mov [ebp-5C], 00401364 :00401744 C7459C08000000 mov [ebp-64], 00000008 Camos na posio caso o programa estiver registrado. ento como que a gente vai crackiar isso?? bem no podemos tirar o jne que pula pra ir se no ele nunca vai pular e vai sempre dar Programa no registrado! ento nos temos que fazer com que ele pule pra essa parte do cdigo independente de ta registrado ou no e como fazer isso?? simples.. nos fazemos o salto

sem condio! e temos que fazer isso trocando o jne por jmp que um salto incondicional mais ai complico um pouco n?? ixi mais fcil do que voc pensa procura no cdigo todas as instrues jmp que pular pra algum endereo e veja o que ela tem em comum.. Segue alguns exemplos: :00401096 FF253C104000 Jmp dword ptr [0040103C] .. :00401650 E9E9E9E9CC jmp CD2A003E .. :00401788 EB1C jmp 004017A6 Voc consegue perceber alguma semelhana?? porque realmente no tem nenhuma semelhana pelo modo de salto no primeiro exemplo ele salta convertendo o endereo no segundo ele saltou pra algum lugar da memria que esta fora do cdigo do programa(uma API em uma DLL por exemplo).. e no terceiro exemplo ele salta pra uma parte do nosso cdigo VIVA!!.. a terceira que nos queremos pois queremos pular para uma parte do nosso cdigo.. que a parte onde o programa esta registrado. vou tentar explicar melhor :00401788 EB1C jmp 004017A6 * EB = JMP -> Pule para * 1C = 28(decimal) -> O cdigo que ta a 28 posicoes daqui Entaum voltando ao nosso JNE: :004016F2 7543 jne 00401737 * 75 = JNE -> Se naum for igual pule para * 43 = 67(decimal) -> 67 posicoes a fente Pra clarear nos temos que fazer o seguinte: :004016F2 EB43 jne 00401737 * EB = JMP -> Pule se condicao nenhuma para * 43 = 67(decimal) -> 67 posicoes a fente Tah ai como nos crackiamos nosso cdigo temos que trocar o 7543 por EB43isso far com que o JNE vire JMP e no contara mais nenhuma condio. OK! vamos ao nosso crack mais antes temos que verificar se existe mais alguma instruo igual a esta e se no tiver codamos nosso crack alterando 75 43 por EB 43: O cdigo do nosso crack pode ser algo como: ++++++++++++++++++++++++++++++++++ ++++++++++++++++++++ Dim bf as String strNormal = Chr(Val(&H75)) & Chr(Val(&H43)) strCracked = Chr(Val(&HEB)) & Chr(Val(&H43)) bf = Space(FileLen(ex1.exe)) Open ex1.exe For Binary Access Read As #1 Get #1, , bf Close #1 bf = Replace(bf, strNormal, strCracked) Open ex1[cracked].exe For Binary Access Write As #1 Put #1, , bf Close #1 ++++++++++++++++++++++++++++++++++++ ++++++++++++++++++ Bem espero que tenha dado pra dar uma clareada sobre como crackiar programas. Quero deixar bem claro que eu crackei e fiz cracks usando o VB mais com isso possvel crackiar programas feitos em qualquer linguagem e fazer cracks com em qualquer linguagens tambm Si for fazer alguns testes, ento aconselho a fazer naqueles jogoguinhos mais ruins do mundo inteiro. Que at os programadores que fizeram eles, no vo si importar. To certo! hehe ~Bye~

Você também pode gostar