# 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](/files/yiAu8o2Y6apoS8mUbdmn)

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.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://mentebinaria.gitbook.io/engenharia-reversa/09-depuracao/debugger.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
