Disassembly

Ao observar a regiĂŁo que chamamos de disassembly, vocĂȘ verĂĄ 5 colunas onde a primeira exibe algumas informaçÔes e relaçÔes entre endereços. A segunda mostra os endereços em si. A terceira mostra os bytes do opcode e operandos das instruçÔes. A quarta mostra as os mnemĂŽnicos onde podemos ler Assembly e por fim, a quinta mostra alguns comentĂĄrios, sejam estes gerados automaticamente pelo debugger ou adicionados pelo usuĂĄrio.

Colunas do disassembly

Destaque de instruçÔes

Perceba que por padrĂŁo o debugger jĂĄ destaca vĂĄrios aspectos das instruçÔes, na janela de disassembly. O nome mais comum para este destaque Ă© sua versĂŁo em inglĂȘs highlight.

O highlight refere-se principalmente às cores, mas o debugger também då altas dicas. Na instrução acima, perceba que a operação em si estå em azul, enquanto o argumento estå em verde.

O endereço para o qual o ponteiro de instrução aponta (EIP, embora o x64dbg chame-o genericamente de CIP, jå que em x86-64 seu nome é RIP) é destacado com um fundo preto (na imagem anterior, vemos que é o endereço 401000).

Na coluna de comentĂĄrios, temos os comentĂĄrios automĂĄticos em marrom.

É importante lembrar que no arquivo hĂĄ somente os bytes referentes Ă s instruçÔes (terceira coluna). Todo o resto Ă© interpretação do debugger para que a leitura seja mais intuitiva.

Step into/over

Neste primeiro momento, o debugger estå parado e a próxima instrução a ser executada é justamente o que chamamos de OEP (Original EntryPoint).

O primeiro comando que aprenderemos Ă© o Step over, que pode ser ativado por pelo menos trĂȘs lugares:

  1. Menu Debug -> Step over.

  2. Botão Step over na barra de botÔes (é o sétimo botão).

  3. Tecla de atalho F8.

  4. Digitando um dos comandos a seguir na barra de comandos: StepOver/step/sto/st

Se vocĂȘ emitir este comando uma vez, verĂĄ que o debugger vai executar uma Ășnica instrução e parar. Na janela do disassembly, vocĂȘ vai perceber que o cursor (EIP) "pulou uma linha" e a instrução anterior foi executada. No caso de nosso binĂĄrio de teste, Ă© a instrução PUSH EBP. ApĂłs sua execução, perceba que o valor de EBP foi agora colocado no topo da pilha (observe a pilha, abaixo dos registradores).

VocĂȘ pode seguir teclando F8 atĂ© alcançar a primeira instrução CALL em 401007, destacada por um fundo azul claro.

O comando Step over sobre uma CALL faz com que o debugger execute a rotina apontada pela instrução e "volte" para o endereço imediatamente apĂłs a CALL. VocĂȘ nĂŁo verĂĄ essa execução, pois o debbugger nĂŁo a instrumentarĂĄ. Caso queira observar o que foi executado "dentro" da CALL, Ă© necessĂĄrio utilizar o Step into (F7). Vamos fazer dois testes:

  1. Com o EIP apontado para a CALL em 401007, tecle F8. VocĂȘ verĂĄ que a execução simplesmente "passa para a linha abaixo da CALL". Isso quer dizer que ela foi executada, mas vocĂȘ "nĂŁo viu no debugger".

  2. Agora reinicie o programa no debugger (F2), vĂĄ teclando F8 atĂ© chegar sobre a CALL novamente e tecle F7, que Ă© o Step into. Perceba que o debugger agora "entrou" na CALL. Neste caso, vocĂȘ vai precisar teclar F8 mais trĂȘs vezes atĂ© voltar ao fluxo de execução original, isso porque esta CALL sĂł possui trĂȘs instruçÔes.

Run

Um outro comando importante Ă© o Run (F9). Ele simplesmente inicia a execução a partir do EIP de todas as instruçÔes do programa. Se vocĂȘ emiti-lo com este binĂĄrio, vai ver que a execução vai terminar, o que significa que o programa rodou atĂ© o final e saiu. AĂ­ basta reinicar o programa (F2) para recomeçar nossos estudos. ;)

Na próxima seção, vamos entender os pontos de paradas, mais conhecidos como breakpoints.