# O Debugger

## Instalação

1. Na sua máquina Windows, baixe o *snapshot* mais recente do x64dbg. É um arquivo .zip chamado *snapshot\_YYYY-MM-DD\_HH-MM.zip* que vai variar dependendo da data e hora do *release* (quando o software é liberado) pelos autores do projeto.
2. Ao descompactar o arquivo .zip, execute o arquivo *x96dbg.exe* dentro do diretório *release*. Esse nome deve-se ao fato de que o x64dbg tem suporte tanto a 64 quanto a 32-bits, então o autor resolveu somar 32+64 e nomear o binário assim.
3. O *x96dbg.exe* é o *launcher* do x64dbg e tem três botões. Escolha **Install** e responda "Sim" para todas as perguntas.
4. À esta altura você já deve ter o atalho x64dbg na sua área de trabalho. Dê um duplo-clique nele e você verá a tela inicial do *debugger*.

## Configuração

Se o x64dbg estiver em português, mude o idioma para inglês. Isso é necessário, pois vários termos em inglês não estão traduzidos e isso pode dificultar o aprendizado. Para mudar o idioma, vá em **Opções ► Idiomas** e escolha **\[en\_US] American English - United States**. Você precisará fechar o x64dbg e abri-lo novamente para que o novo idioma entre em vigor. Depois que o software estiver em inglês, siga com a configuração:

1. Vá em **Options ► Preferences** e, na aba **Events**, desmarque a caixa **System Breakpoint**. Isso vai fazer com que o *debugger* pare direto no *entrypoint* de um programa ao abrirmos.
2. Clique na aba **Engine** e marque a caixa **Disable ASLR**, que desabilita a randomização de endereços de memória.
3. Clique em **Save**.

Existem muitas outras opções de configuração que você pode experimentar. Para o momento, essas bastam.

## Tela Inicial

Na tela inicial do x64dbg, clique em **File ► Open**. Localize o arquivo `analyseme00.exe` e clique em em **Open**. Você deverá ver uma tela como esta:

![Tela inicial do x64dbg](https://2831222458-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L8zFFHkPxQb-_1XSGR9%2Fuploads%2Fgit-blob-975aa3706263d22b18545365ca80313a8b9c0d8a%2Fx64dbg_analyseme00_inicial.png?alt=media)

A aba **CPU**, realçada em preto, é sem dúvida a mais utilizada no processo de *debugging*, por isso, fizemos questão de nomear algumas de suas áreas, que descreveremos agora.

### Disassembly

Nesta região são exibidos os endereços (VAs), *opcodes* e argumentos de cada instrução, seu *disassembly* (ou seja, o que os *bytes* significam em Assembly) e alguns comentários na quarta coluna, que podem ser automáticos (gerados pelo x64dbg ou por plugins) ou inseridos por você. No endereço inicial, por exemplo, há o texto *OptionalHeader.AddressOfEntryPoint* na quarta coluna, que nos diz que aquela instrução é a primeira executada pelo programa. Dizemos também que ela é o *entrypoint* do programa.

### Helper

Tomei a liberdade de nomear essa seção de **Helper**, porque de fato ela ajuda. Por exemplo, quando alguma instrução faz referência a um dado em memória ou em um registrador, ela já mostra que dado é este. Assim você não precisa ir buscar. É basicamente um economizador de tempo. Para entender melhor, suponha que o *debugger* esteja parado numa instrução que esteja lendo de `[rsp+20]`. No Helper, aparecerá o valor que está na posição de memória RSP+20, assim você não precisa ir até lá manualmente para ver tal valor.

### Dump

O dump é um visualizador que você pode usar para inspecionar *bytes* em qualquer endereço. Por exemplo, você pode ir até o endereço RSP+20 e ver o que tem lá.

Há cinco abas de dump, onde cada uma pode mostrar o conteúdo de uma região de memória diferente para o mesmo alvo. Há ainda as abas **Watch**, **Locals** e **Struct**, que fogem do escopo deste livro, mas também são ferramentas de inspeção.

### Registradores

Como o nome sugere, nesta região são mostrados os valores de cada registrador do processador, incluindo o do registrador de *flags*. Na verdade, o x64dbg vai um pouco além e mostra também variáveis globais úteis como `LastError` e `LastStatus`, ambas modificadas por chamadas à algumas funções da API do Windows.

### Convenção de Chamada

Nesta janela é possível configurar a convenção de chamada com a qual estamos trabalhando e o número de argumentos que você quer ver em cada chamada de função.

### Pilha

Mostra a pilha de memória, onde o endereço com fundo em preto indica o topo da pilha, ou seja, o endereço que está em RSP.

Na próxima seção, iremos depurar o binário de exemplo e devemos nos atentar às informações exibidas em cada uma das regiões da tela do *debugger*, acima apresentadas.
