09. Solução desafio #1

Neste tutorial vou explicar uma das formas de solucionar o primeiro desafio ( pode encontrá-lo no índice de tutoriais ), Vamos direto ao assunto.

A primeira coisa a fazer é abrir o alvo e dar uma analisada geral. De início já notamos que o botão para verificar o serial está desabilitado. Depois, ao fechar, aparece uma Nag-screen, que devemos tirar. Vamos ver também se foi usado algum tipo de packer nele.

Parte 1 - Descompactando

Abra-o no PEiD e veja que ele foi compactado com o UPX ( Ultimate Packer for eXecutables ).

Se você leu todos os tutoriais, você deve conseguir resolver todos os problemas encontrados até agora. Vamos começar descomprimindo o arquivo. Abra o alvo no Olly. Ele posiciona você no entry point do packer ( repare no PUSHAD característico ). Aperte F7 uma vez e o valor do registrador ESP irá mudar. Clique com o botão direito no valor de ESP e selecione "Follow in Dump". Estamos monitorando o endereço armazenado pelo ESP na janela de dump do olly ( parte inferior ). Clique com o botão direito no primeiro byte da janela de dump ( 38 ), selecione "Breakpoint->Hardware, on write->DWord". Quando o alvo for escrever algo neste endereço de memoria, o Olly congela o programa, e isso geralmente nos leva bem próximo do final do processo de descompressão. Aperte F9 para continuar a execução e em seguida nós paramos aqui:

00412AF6 61 POPAD  
00412AF7 8D4424 80 LEA EAX,DWORD PTR SS:\[ESP-80\]  
00412AFB 6A 00 PUSH 0  
00412AFD 39C4 CMP ESP,EAX ; Paramos aqui  
00412AFF 75 FA JNZ SHORT Desafio\_.00412AFB  
00412B01 83EC 80 SUB ESP,-80  
00412B04 E9 97E8FEFF JMP Desafio\_.004013A0 ; Como visto no tutorial de UPX, este jump nos leva ao EP original do programa

Para podermos fazer o dump do programa descomprimido, precisamos chegar nesse último jump e executá-lo. Adicione um breakpoint ( F2 ) no último jump ( 00412B04 ) e aperte F9. Ótimo, paramos no jump e agora precisamos executá-lo. Aperte F7 uma vez e nós fomos levados até o OEP ( Original Entry Point ), ou seja, estamos no início do código do programa descompactado. Vamos "extrair" o programa descompactado da memória e jogar em um executável a parte. Utilizando o plugin OllyDump, vá em "Plugins->OllyDump->Dump Debugged Process". Na janela que aparecer, clique em "Get EIP as OEP" e desmarque "Rebuild Import". Clique em "Dump" e salve com qualquer nome ( eu utilizei DUMPED.exe, então vou me referir a ele assim ).

Ainda não acabamos, precisamos remontar a base de Imports, para isso vamos usar o ImpRec ( não feche o Olly com o nosso programa ).

No passo número 5 selecione o arquivo exportado do Olly ( DUMPED.exe ). Ele vai criar um arquivo DUMPED_.exe que é o nosso arquivo final, descomprimido.

Caso não tenha entendido o processo utilizado, leia o tutorial #6, que explica detalhadamente cada passo utilizado aqui.

Parte 2 - Ativando o botão

Resolvi fazer esta parte primeiro para não ter que ficar trocando de programas mais tarde. Habilitando o botão agora, depois eu só preciso utilizar o Olly, mais nada.

Abra o DUMPED_.exe no WinHex e faça uma busca ( "Search->Find Text" ) no modo ASCII pelo texto do botão desativado: "Registrar" ( sem as aspas ). Fomos levados até o Offset 6CC3, onde tem a palavra "Registrar".

Marcado em violeta está os bytes importantes que nós procurávamos. O 08 indica a propriedade "Enabled" e o 00 em seguida indica que ele está desativado ( Enabled = False ). Para reverter isso, troque o 08 00 por 08 01 e salve o arquivo pelo WinHex ( "File->Save" ). Agora temos nosso botão habilitado.

Leia o tutorial #8 para ver uma explicação mais detalhada do processo.

Parte 3 - Desativando a proteção contra o Olly

Agora voltamos ao Olly. Apra o DUMPED_.exe já editado com o botão funcionando. Uma mensagem avisando sobre o EP fora do módulo do programa é mostrada. Dependendo do caso isso dificulta o processo, mas nesse caso a única coisa ruim é que ele não permite salvar todas as modificações no executável, apenas as seleções.

Aperte F9. Uma mensagem de texto aparece indicando que estamos usando o Olly. Vamos desativá-la para que possamos fazer o debug. Reinicie o alvo no Olly ( CTRL F2 ) e digite "bpx rtcMsgBox" na linha de comando ( "Plugins->Command Line" ). Isso seta um breakpoint na chamada da função MsgBox. Inicie a execução ( F9 ) e o Olly congelou no local onde a mensagem "Anti-Olly" aparece ( 4008B3A ).

Temos que encontrar uma maneira de desviar o código para que a MsgBox não apareca. Analise o código um pouco mais acima. Repare que no endereço 408AF1 nós temos um salto condicional que pula para uma área do código logo DEPOIS da exibição da MsgBox, ou seja, se o salto for realizado, a MsgBox não aparece. Podemos então forçar para que o salto sempre ocorra. Para isso basta alterar de JNZ para JMP:

00408AF1 75 6E JNZ SHORT DUMPED\_.00408B61

Troque para ( selecione a linha e aperte espaço ):

00408AF1 EB 6E JMP SHORT DUMPED\_.00408B61

Selecione esta linha modificada, clique com o botão direito e vá em "Copy to Executable->Selection". Em seguida, na janela que aparecer, clique novamente com o botão direito, vá em "Save File" e selecione o próprio executável ( DUMPED_.exe ). Depois de salvar, aperte CTRL F2 para resetar o aplicativo. Se você apertar F9, o programa agora abre normalmente, não exibindo a MsgBox. ;D

Parte 4 - Buscando o serial correto

Com o programa rodando na tela onde pede por um Nome e Serial, digite "bpx __vbaStrCmp" no Command Line para setar um breakpoint na função que compara 2 strings ( serial verdadeira com a serial que nós digitamos ). Digite um nome qualquer com mais de 4 letras ( veja mais adiante ) e uma serial qualquer também ( eu utilizei F3rGO! e 132456, respectivamente ) e clique em "Registrar". Paramos na chamada da função.

Repare que ele puxa 2 argumentos e em seguida chama a função. Esses argumentos é o que a função vai comparar ( no caso, ele vai comparar ECX com EDX ). Veja na tela de registradores ( lado direito ). No meu caso, ECX contém 123456 e EDX contem 418. Ele está comparando 123456 ( nosso serial falso ) com 418 ( que é o serial verdadeiro para o nome digitado ).

Bingo! Para o nome F3rGO!, o serial é 418.

Quanto ao número mínimo de letras no nome, basta analisar o código mais acima. Antes de todo o processo de geração do serial começar, ele compara o texto digitado com o valor 4 ( endereço 408459 ).

Parte 5 - Nag Screen

Já encontramos o serial. Agora só falta remover a Nag-screen que aparece quando o programa se encerra. Digite novamente "bpx rtcMsgBox" para setar breakpoints nos locais onde a função "rtcMsgBox" é chamada. Feche a janela do nosso alvo ( pelo X no canto da janela mesmo ). O Olly congelou novamente na chamada da função, para exibir a Nag-screen. Como essa MsgBox não depende de uma condição para ser exibida ( como no caso do Anti-Debug ), não podemos trocar um JNZ por JMP ou coisa do tipo. O que nós temos que fazer é anular as linhas de código que exibem a MsgBox.

Temos que anular a linha que chama a função ( CALL DWORD PTR... ) no endereço 408C5D e todos os 5 argumentos que ela puxa. Para anular os comandos, temos que preencher com NOPs ( NO oPeration ). Clique com o botão direito sobre o "CALL DWORD..." ( 408C5D ), vá em "Binary->Fill with NOPs". Faça o mesmo para as 5 linhas anteriores a ela que contém "PUSH"

Agora só precisamos salvar as alterações. Selecione do endereco 00408C51 até o 004008C62 ( região que abrange todas as modificações ) usando SHIFT. Clique novamente com o botao direito sobre a seleção, vá em "Copy to Executable->Selection" e na janela que abrir, clique com o botão direito e vá em "Save File". Pode sobreescrever o arquivo DUMPED_.exe novamente.

Pronto! Terminamos! Fizemos tudo o que foi pedido. Descompactamos, ativamos o botão, removemos a proteção anti-debug, encontramos o serial e anulamos a nag-screen. Se você conseguiu acompanhar tudo, parabéns, em breve mais desafios. Caso teve alguma dificuldade em alguma parte, leia os outros tutoriais encontrados no índice da página. Lá os assuntos vistos nesse tutorial são tratados com muito mais abrangência.

Até a próxima!

F3rGO!