[[ O Último Top-Cracker ]] 

O Vargola, novamente, mostrou que não está de brincadeira e que o negócio com ele é mais sério do que se imaginava. Parabéns de novo, o sr. comanda!

[[ Desafio 6 ]]

Para quem acha que até agora nada tinha sido desafio o suficiente, pule diretamente para o Desafio 6 e siga o meu lema: Não tenha piedade (do software! das pessoas você pode).

O 6º desafio mudou. Agora ele é uma versão com linha de comando e sem várias das proteções que você já viu nos anteriores… Esta é uma versão para adultos. Se você pensa que já resolveu de tudo, tente brincar com essa versão.

Aguardo respostas! 

[[ De volta à "estripação" ]] 

Bem, de volta ao nosso mundo mortal, vamos dar uma nova olhada no último Escondedor com essa aparência.

Escondedor - Versão 5

Você não aguenta mais essa tela não é? Pois nem eu! :S  De cara percebemos que o botão Tentar continua desabilitado nessa versão. Tentando a mesma coisa que fizemos no último desafio, isto é, digitar a senha e pressionar ENTER, não funciona… e agora?? Não dá pra rir assim tão fácil. Acalma-te.

Bom, diversos programadores por aí, principalmente aqueles que utilizam ferramentas RAD do tipo Delphi/VB, deixam a funcionalidade no botão e se preocupam apenas em desabilitar o botão para garantir a segurança…  mas que segurança? 🙂

Lembra que eu disse que cada componente do seu programa é considerado uma janela? Bem, como tal, cada janela pode ser controlada remotamente, isto é, por outro programa, que esteja rodando com o mesmo usuário (ou até mesmo com outro, se este for do grupo Administradores).

Então, antes de agir, vamos dar uma olhada mais íntima nas janelas ativas no sistema, utilizando uma ferramenta simples e efetiva chamada WinID.

WinID

Com essa ferramenta, você enxerga detalhes de uma determinada janela, bastando para isso colocar o ponteiro do mouse acima da janela em questão. no caso acima, coloquei o cursor do mouse acima do botão.

[[ Habilitando o botão ]] 

Você percebe, pela seta vermelha abaixo na figura a palavra WS_DISABLED, que indica o "estilo" desabilitado da janela e também, na seta vermelha acima, o handle da janela, indicado pela palavra HWND

Este é o handle que utilizaremos para.. adivinha… habilitar o botão 😀 Poderíamos fazer isso de diversas formas. O que vamos fazer é criar um programinha em C pra fazer o trabalho sujo pra nós.

A API do Windows contém uma função chamada EnableWindow, que habilita uma janela qualquer, obtendo como entrada o seu Handle e um parâmetro dizendo se é para habilitar ou desabilitar.

A documentação da API pode ser encontrada no link abaixo:

http://msdn2.microsoft.com/en-us/library/ms646291.aspx

Essa API se encontra na DLL user32.dll. Então, com todas as informações em mãos, vamos tentar utilizar a técnica.  Olha o pequeno trechinho de código necessário pra isso:

#include "stdafx.h"
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    EnableWindow((HWND)0x2002EC, TRUE);
    return 0;
}

Aha! Muito bom. Se você percebeu que estou colocando um Handle diferente daquele que aparece na figura do WinID é porque eu fechei e abri o Escondedor novamente e com isso o Handle mudou :S Agora olha o que aconteceu com o escondedor:

Escondedor - Habilitado

Agora passamos para a próxima fase novamente. O OllyDebugger! 🙂 Eu já estava com saudades. Vamos utilizar o mesmo método File | Attach de novo para anexar o debugger ao processo já existente.

Escondedor - Erro Debugger

Bom, esse erro aí indica que existe um anti-debugger no programa, em um thread separado… agora como matamos esse anti-debugger de uma vez por todas?  Bom, temos que abrir o programa novamente, habilitar o botão novamente 🙁 Calma é rápido!

Depois de re-fazermos a parte anterior, vamos tentar repetir o passo que fizemos no desafio anterior… Vamos procurar a função IsDebuggerPresent 🙂

Porém, notamos uma diferençinha bastante enjoada:

All intermodular calls

Onde está a maldita chamada DLL da função IsDebuggerPresent? Se ela não está lá… a DLL só pode estar sendo chamada dinamicamente.. maldição! E agora, Drauzio Varella?

[[ O plugin ]] 

Em ligação para o simpático doutor, que tem a informática por hobby noturno, ele me falou sobre um plugin do Olly Debugger chamado IsDebuggerPresent (Sim, o mesmo nome da função), que esconde o debugger da função sacana do Windows. O plugin pode ser baixado através do link abaixo (Hoje pode):

http://www.openrce.org/downloads/details/111/IsDebuggerPresent

Para instalar o plugin, basta descompactar o ZIP e copiar a DLL para o mesmo diretório do executável do OllyDebugger ou para dentro da pasta Plugin, dependendo da sua configuração. O que este plugin, criado em Assembly, faz é localizar o endereço da função, que é constante em relação ao código sendo executado. Toda vez que uma Thread é criada, ele modifica o próprio código que chama a API IsDebuggerPresent para que ele retorne falso. Esperto, né?

Se você
quiser ver os detalhes deste trâmite, verifique o arquivo IsDebug.asm, que vem dentro do arquivo ZIP. 

Bom, não vamos analisar este código aqui porque está muito tarde da noite e eu vou trabalhar mais tarde 😀 O que vamos fazer é usá-lo. Ao reiniciar a ferramenta OllyDebugger, após a instalação do Plugin, o menu Plugins mostra o sub-menu IsDebuggerPresent. Dentro dele, selecionamos Hide e executamos o programa 😀

Plugin - IsDebuggerPresent

Se você fechou e abriu o alvo de novo, você tem que fazer aquele procedimento para habilitar o botão.. sim, de novo :D. 

Muito bem, agora o sistema está rodando de novo, sem anti-debugger e sem bloqueio do botão 🙂

E porque não utilizamos esse plugin antes? (Pergunta você, já furioso, contratando um grupo de mercenários para me caçar). Bom, é interessante olharmos a teoria por trás de cada passo dado aqui. Se não fizéssemos isso, seria mais difícil perceber como o plugin se livra da função malévola.

[[ E agora?? ]]

Bom, sem barreiras, resta encontrar o procedimento executado pelo botão, o mesmo procedimento que fizemos no desafio 4, e seguir aquele mesmo script que você já conhece 🙂

Sucesso!

Como o Vargola disse, o nome do texto é Advances in remote-exec AntiForensics.

Adeus versão 5.

[[ E agora, nada mais é uma barreira? ]] 

Calma!!! Às vezes eu acho que você precisa de um psicólogo. Eu suplico… Calma!!

O desafio 6 te leva pra um novo nível e, com o conhecimento que você já adquiriu aqui, ele não será assim um bicho de 7 cabeças… mas de 6 🙂

Abraços!