Oficina

Ser-Me do megadoctor (I-1)

Qua

23

Ago

2006


11:24

  • Imprimir
(11 votos, média 4.55 de 5) 


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.

Ser-Me
Janela do Ser-Me

Objetivo do desafio

O autor pede para:

  1. Habilitar o botão [Register]
  2. Eliminar o recadinho pentelho
  3. Fazer com que o programa aceite qualquer serial
  4. Criar uma mensagem que diga 'Serial correto' (Right Serial)
  5. 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 smile

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.

XN Resource Editor
Fig.1 - Janela do XN Resource Editor / Botão Register

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 smile ).

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 sad 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

vovo

mfx brokerсковороды чугунные купить в москвелобановский александр досьеноутбук планшетпродвижение сайтов это2dayалександр лобановский