Oficina
Ser-Me do megadoctor (I-1)
Qua 23 Ago 2006 11:24 |
- Detalhes
- Categoria: Pilotando o rato I-1
- Atualização: Domingo, 14 Junho 2009 17:29
- Autor: vovó Vicki
- Acessos: 12596
Este desafio do megadoctor vai-nos ensinar a mexer com mais algumas ferramentas, em especial o DeDe e um editor de recursos. Prepare seus dois neurônios de plantão (os famosos Tico e Teco) e mãos à obra!
O programa
O alvo foi escrito pelo megadoctor em Delphi para a plataforma Windows. Está disponível para download em downloads > informática > crackme > crackme para iniciantes.
Objetivo do desafio
O autor pede para:
- Habilitar o botão [Register]
- Eliminar o recadinho pentelho
- Fazer com que o programa aceite qualquer serial
- Criar uma mensagem que diga 'Serial correto' (Right Serial)
- Remover a mensagem de erro que diz 'Serial errado' (Wrong Serial)
Analisando o programa
Ao ser executado, o programa Ser-Me.exe apresenta uma janelinha com duas caixas de texto identificadas por Login e Serial, além dos botões [Register], [Help] e [Exit]. A primeira coisa que chama atenção é que o botão [Register] está desabilitado. Quando clicamos o botão [Help], recebemos as instruções do que é preciso fazer e, claro, quando clicamos em [Exit] encerramos o aplicativo... e isto é tudo.
Planejando o ataque
É óbvio que, se o botão [Register] estiver desabilitado, não será possível fazer qualquer tipo de registro. Ao que tudo indica, a primeira providência será habilitar este botão. Uma vez habilitado, parece que teremos uma surpresa porque o desafio lançado pelo autor inclui a eliminação de uma mensagenzinha indesejada. Além disso, ele pede que o programa aceite qualquer serial como sendo correto e isto cheira a mexida no código. Se o recado indesejado e esta eventual alteração no código (patch) não tiverem relação, então a ordem das tarefas não tem importância. O mesmo pode ser dito para as mensagens 'Serial correto' e 'Serial errado'. Então, toca encarar o bicho
As ferramentas
- PEid: apenas pela mania que tenho de conferir as informações fornecidas pelo autor e porque este identificador de PE possui um plugin que quebra um galhão - um editor de recursos. Tanto o XN Resource Editor quanto o PEiD podem ser baixados em downloads > informática > utilitários.
- DeDe: um decompilador para Delphi. Está em downloads > informatica > compiladores/decompiladores. O programa é muito antigo e dá umas estriladas com o Windows XP, mas, mesmo assim, ainda é muuuuito útil.
- OllyDbg: o debugador mais fácil de se lidar que conheço.
PILOTANDO O MOUSE
Antes de mais nada, instale o plugin XN Resource Editor. Basta abrir o arquivo XNResourceEditor_Plugin.zip na pasta plugins do PEiD. Quando o identificador de PE for inicializado, ele incorpora automaticamente o novo plugin.
Por medida de segurança, faça uma cópia do executável original. Depois rode o PEiD e chame o executável Ser-Me.exe. Constatamos que o programa realmente foi escrito em Borland Delphi 6.0 e que as seções do PE estão todas presentes e inalteradas. Chegou a hora de usar o editor de recursos para conferir se o botão [Register] é "mexível".
Clique no botão [->] do canto inferior direito, escolha plugins e o XN Resource Editor. Isto faz com que a janela do editor de recursos seja apresentada. Clique no item de menu File, escolha Open, selecione o executável Ser-Me.exe e as diversas áreas do editor são atualizadas de acordo com os dados encontrados. No painel esquerdo, dê um duplo clique em RC Data, outro duplo clique em TFORM1 e um clique em Language Neutral. Role um pouco o painel direito para cima até encontrar a referência ao botão Register, conforme mostrado na fig.1.
Observe que o objeto Button1:TButton possui várias propriedades, entre elas a propriedade Enabled = False. AHÁ!!! Basta trocar esta propriedade por Enabled = True. Só de bagunça, troque também Caption = 'Register' por Caption = 'Registrar'. Logo no início, procure o objeto Form1 e passe a propriedade Caption para Caption = 'Ser-Me'. Aproveite e troque as Captions dos botões Button2 e Button3 para 'Ajuda' e 'Sair'. Mexa no que quiser e depois salve o arquivo. Feche o editor de recursos, rode novamente o Ser-Me.exe e o que é que os seus olhos vêem? Todas as mudanças efetuadas e o botão [Registrar] (deixou de ser Register) habilitado. Tudo o que a gente queria :thumbup:
O velho e bom DeDe
DaFixer é o autor brazuca do DeDe e ainda circulava na net até o ano 2000. De repente sumiu e a única coisa que posso dizer é que tenho saudade! Sei lá o que este cara anda fazendo, mas, se isto serve de consolo, continuo usando o DeDe e procurando por algum aplicativo que se compare ao dele. Tá certo, o DeDe está desatualizado e anda abrindo o bico com o win XP e as versões mais atuais do Delphi. Mesmo assim...
Rode o DeDe, clique no botão identificado por uma pasta e abra o Ser-Me.exe. Em seguida, clique no botão [Process] e aguarde até receber a mensagem de "Dump successfull ! :)". Assim que você clicar o botão [OK] da mensagem, recebe duas mensagens de erro (pelo menos eu recebo) dizendo "Access violation...". Não se deixe impressionar - clique nos botões [OK] e vá em frente. Quando a coisa se acalmar, clique na aba DFM para ver a já conhecida estrutura da Form1 que deve mostrar as alterações que fizemos usando o editor de recursos. Depois clique na aba DFU para que, no painel da esquerda, seja mostrada a Unit1-TForm1. No painel da direita, aba Events, estão listados Button1Click, Button2Click e Button3Click. Como já sabemos que o nosso alvo é o Button1, dê um duplo clique no próprio para obter o seguinte código fonte:
004596DC 53 push ebx 004596DD 8BD8 mov ebx, eax 004596DF B858CC4500 mov eax, $0045CC58 * Possible String Reference to: "Error" | 004596E4 BA58974500 mov edx, $00459758 004596E9 E8EAABFAFF call 004042D8 004596EE B854CC4500 mov eax, $0045CC54 * Possible String Reference to: "Wrong Serial !" | 004596F3 BA68974500 mov edx, $00459768 004596F8 E8DBABFAFF call 004042D8 004596FD C7055CCC450010100000 mov dword ptr [$45CC5C], $00001010 00459707 A15CCC4500 mov eax, dword ptr [$45CC5C] 0045970C 50 push eax 0045970D A158CC4500 mov eax, dword ptr [$45CC58] 00459712 E81DB0FAFF call 00404734 00459717 50 push eax 00459718 A154CC4500 mov eax, dword ptr [$45CC54] 0045971D E812B0FAFF call 00404734 00459722 50 push eax 00459723 8BC3 mov eax, ebx 00459725 E84624FEFF call 0043BB70 0045972A 50 push eax * Reference to: user32.MessageBoxA | 0045972B E898D7FAFF call 00406EC8 00459730 A360CC4500 mov dword ptr [$45CC60], eax * Possible Reference to Control 'Button1:TButton' | 00459735 8B8304030000 mov eax, [ebx+$0304] 0045973B 8B10 mov edx, [eax] 0045973D FF5250 call dword ptr [edx+$50] 00459740 84C0 test al, al 00459742 740A jz 0045974E * Possible String Reference to: "Get Rid of This little fucker :P" | 00459744 B880974500 mov eax, $00459780 00459749 E8BA55FDFF call 0042ED08 0045974E 5B pop ebx 0045974F C3 ret
Quer mais? É tudo do que estávamos precisando! O autor do crackme pediu para que o programa aceitasse qualquer serial (até mesmo um serial vazio) e que a mensagem dizendo "Get Rid of This little fucker :P" fosse eliminada. Pois então está fácil: anote o endereço inicial desta rotina e vamos para a próxima ferramenta.
O OllyDbg entra em ação
O DeDe nos indicou o endereço inicial da subrotina chamada quando clicamos o botão [Registrar], ou seja, 004596DC. Abra o Ser-Me.exe no OllyDbg, coloque uma parada (breakpoint) no endereço citado com F2 e rode o programa com F9. Quando a janela do Ser-Me for apresentada, clique no botão [Registrar]. BINGO! A execução é interrompida exatamente onde queremos:
004596DC . 53 PUSH EBX 004596DD . 8BD8 MOV EBX,EAX 004596DF . B8 58CC4500 MOV EAX,Ser-MeCe.0045CC58 004596E4 . BA 58974500 MOV EDX,Ser-MeCe.00459758 ; ASCII "Error" 004596E9 . E8 EAABFAFF CALL Ser-MeCe.004042D8 004596EE . B8 54CC4500 MOV EAX,Ser-MeCe.0045CC54 004596F3 . BA 68974500 MOV EDX,Ser-MeCe.00459768 ; ASCII "Wrong Serial !" 004596F8 . E8 DBABFAFF CALL Ser-MeCe.004042D8 004596FD . C705 5CCC4500 >MOV DWORD PTR DS:[45CC5C],1010 00459707 . A1 5CCC4500 MOV EAX,DWORD PTR DS:[45CC5C] 0045970C . 50 PUSH EAX 0045970D . A1 58CC4500 MOV EAX,DWORD PTR DS:[45CC58] 00459712 . E8 1DB0FAFF CALL Ser-MeCe.00404734 00459717 . 50 PUSH EAX 00459718 . A1 54CC4500 MOV EAX,DWORD PTR DS:[45CC54] 0045971D . E8 12B0FAFF CALL Ser-MeCe.00404734 00459722 . 50 PUSH EAX 00459723 . 8BC3 MOV EAX,EBX 00459725 . E8 4624FEFF CALL Ser-MeCe.0043BB70 0045972A . 50 PUSH EAX ; |hOwner 0045972B . E8 98D7FAFF CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA 00459730 . A3 60CC4500 MOV DWORD PTR DS:[45CC60],EAX 00459735 . 8B83 04030000 MOV EAX,DWORD PTR DS:[EBX+304] 0045973B . 8B10 MOV EDX,DWORD PTR DS:[EAX] 0045973D . FF52 50 CALL DWORD PTR DS:[EDX+50] 00459740 . 84C0 TEST AL,AL 00459742 . 74 0A JE SHORT Ser-MeCe.0045974E 00459744 . B8 80974500 MOV EAX,Ser-MeCe.00459780 ; ASCII "Get Rid of This little fucker :P" 00459749 . E8 BA55FDFF CALL Ser-MeCe.0042ED08 0045974E > 5B POP EBX 0045974F . C3 RETN
Vá pilotando a execução passo a passo com F7. Ao executar a instrução do endereço 004596E4 observe que a string "Error" foi copiada do endereço 00459758 e colocada no registrador EDX. Anote este endereço! Logo em seguida é feita uma chamada para uma subrotina que, no momento, não nos interessa. Faça um step-over com F8 nesta chamada.
Mais dois F7 e agora o registrador EDX recebe a string "Wrong Serial !" que está no endereço 00459768 (anote este endereço também). A seguir, a mesma subrotina citada acima é chamada - use F8 para executá-la e retornar imediatamente para uma instrução abaixo dela (isto é para não se perder ).
Continue com F8 para as chamadas e com F7 para as outras instruções. Observe que as strings são passadas para o registrador EAX e depois colocadas na pilha (você pode observar a pilha no painel inferior direito do OllyDbg). Isto nada mais é do que a preparação para uma chamada à função MessageBoxA da API do Windows que nos apresentará uma caixa de mensagem com o título "Error" e com o texto "Wrong Serial !".
Bem, se uma das tarefas é fazer com que o Ser-Me aceite QUALQUER serial e dê a mensagem "Serial Certo !", então a solução é mais do que simples. Basta localizar as duas strings nos endereços anotados e alterá-las. Para isto, procure e selecione o endereço 00459758. Depois, clique com o botão direito do mouse sobre ele, escolha Binary e depois Edit (Ctrl-E faz o mesmo). Na janela de edição, na área de texto identificada por ASCII, substitua Error por Legal ou outro título qualquer de, no máximo, 5 caracteres. NÃO mexa no sexto caracter da string (que corresponde ao valor hexadecimal 00), porque este é um terminador de strings que não pode faltar. Terminada a alteração, clique no botão [OK] e observe a alteração ocorrida no painel das instruções - não aparece nada dizendo que se trata de uma string de caracteres ASCII, mas sim uma porção de instruções complicadas destacadas em vermelho. Xiiiii será que deu pau? Não se preocupe, é apenas o OllyDbg achando que introduzimos código executável. Tudo isto se ajeita depois que salvarmos o programa com as alterações.
Agora que você sabe como fazer alterações, troque a string "Wrong Serial !" por "Serial Certo !" no endereço 00459768. Recomece a execução com F9, clique no botão [Registrar] e observe as mudanças na caixa de mensagem. tá tudo em riba? Então chegou a hora de salvar as mudanças introduzidas. Clique com o botão direito do mouse em qualquer lugar do painel de instruções, escolha Copy to executable e <All modifications. Na nova caixa de mensagem (Copy selection to executable file?) clique no botão [Copy all]. O OllyDbg abre uma nova janela que mostra a cópia do arquivo. Clique nesta nova janela com o botão direito do mouse, escolha Save file e salve com um nome da sua escolha (eu usei Ser-MeStrings.exe).
Execute o "novo" Ser-MeStrings.exe. Agora o bacaninha mostra a mensagem de Serial Certo mas, logo em seguida, ainda joga a mensagem "Get Rid of This little fucker :P" na tela. Tirar este negócio é a nossa última tarefa. Para isto, observe o endereço 00459742, um pouco antes da string:
00459742 . 74 0A JE SHORT Ser-MeCe.0045974E
O endereço apontado pelo salto corresponde à preparação do encerramento desta subrotina, ou seja, o alinhamento da pilha com POP EBX, e depois pede para retornar ao ponto de chamada com RETN. Bem, que tal simplesmente forçar este salto?
Selecione o endereço 00459742, clique sobre ele com o botão direito do mouse e escolha Assemble (ou simplesmente aperte a tecla de espaço). Na janela de edição troque JE SHORT 0045974E por JMP SHORT 0045974E e clique no botão [Assemble]. No painel de instruções 74 0A é mudado para EB 0A e aparece destacado em vermelho (já sabemos, é porque foi alterado). Rode o programa com F9 e confirme que o "little fucker" deixou de atazanar.
Finalmentes
Da minha parte, por ora é só. Para você que está lendo este tutorial, ainda falta salvar o arquivo com a última alteração feita. No jargão da ER estas alterações feitas na marra são chamadas de patch, ou seja, remendos. Usei este crackme meio sem graça como exemplo apenas para mostrar como é fácil fazer remendos... contanto que se saiba como e onde.
Abraços a todos