Fundamentos de Engenharia Reversa
Apoie este trabalho
  • 🙌Apresentação
  • 🥇Introdução
    • 👀Antes de começar
  • 🔢Números
    • Sistemas de Numeração
    • O Byte
    • Números Negativos
    • Cálculos com Binários
  • 🧵Cadeias de Texto
    • ASCII
    • Unicode
    • C Strings
  • 🗂️Arquivos
    • Formatos
  • 💼O formato PE
    • Cabeçalhos
      • MS-DOS
      • COFF
      • Opcional
      • Diretórios de Dados
      • Cabeçalhos das Seções
    • Seções
    • Import Table
    • Endereçamento
  • 🚗Execução de Programas
    • Executáveis
    • Bibliotecas
    • Processos
  • 🖼️Windows API
    • Caixas de Mensagens
    • Manipulação de Arquivos
    • Acesso ao Registro
  • ⚙️Assembly
    • Registradores
    • Instruções Básicas
    • Funções e Pilha
  • 🐞Depuração
    • O Debugger
    • Disassembly
    • Breakpoints
    • Manipulação do Fluxo
    • Patches
  • Apêndices
    • Tabela ASCII
    • Tabela ISO-8859-1/Latin-1
    • Exemplos de Código em Assembly
    • Funções da API do Windows
    • Ferramentas
  • Referências
Powered by GitBook
On this page
  • Seu Primeiro Breakpoint
  • Como Breakpoints são Implementados

Was this helpful?

Edit on GitHub
Export as PDF
  1. Depuração

Breakpoints

PreviousDisassemblyNextManipulação do Fluxo

Last updated 11 hours ago

Was this helpful?

Um breakpoint nada mais é que um ponto no código onde o debugger vai parar para que você analise o que precisa. É o mesmo conceito dos breakpoints presentes nos IDEs como Visual Studio, NetBeans, CodeBlocks, etc. A diferença é que nestas IDEs colocamos breakpoints em determinadas linhas do código-fonte. Já nos debuggers destinados à engenharia reversa, colocamos breakpoints em endereços (VAs), onde há instruções.

Seu Primeiro Breakpoint

Há várias maneiras de se colocar um breakpoint em um endereço utilizando o x64dbg. Você pode selecionar a instrução e pressionar F2, usar um dos comandos SetBPX/bp/bpx, dar um duplo clique sobre os bytes da instrução ou simplesmente clicar na pequena bolinha cinza à esquerda do endereço. Ao fazê-lo, este ficará com um fundo vermelho, como sugere a imagem:

Um segundo clique desabilita o breakpoint, mas não o exclui da aba Breakpoints (Alt+B). Um terceiro clique de fato o deleta.

Após colocar o breakpoint nesta CALL, rode o programa (F9). O que acontece? O debugger executa todas as instruções anteriores a este breakpoint e pára onde você pediu. Simples assim.

Como Breakpoints são Implementados

Talvez você tenha notado que ao atingir um breakpoint, o x64dbg mostra na barra de status a palavra “Paused” e a frase ** INT3 breakpoint at analyzeme00.0000000140001019!**. Este é um tipo de breakpoint de software. Existem ainda os de memória e de hardware, mas não trataremos neste livro.

A instrução INT é uma instrução Assembly que gera uma interrupção. A interrupção número 3 é chamada de Breakpoint Exception (#BP) no manual da Intel. Seu opcode (0xcc) tem somente um byte, o que facilita sua implementação nos debuggers.

De forma resumida, para parar nesta CALL, o que o x64dbg faz é:

  1. Substituir o primeiro byte do opcode da CALL (0xff, neste caso) por 0xcc e salvar o original numa memória.

  2. Rodar o programa.

  3. Restaurar o primeiro byte do opcode da CALL, substituindo o 0xcc por 0xff (neste caso).

Isso poderia ser feito manualmente, mas os debuggers facilitam o trabalho, bastando você pressionar F2 ou clicar na bolinha para que todo este trabalho seja executado em segundo plano, sem que o usuário perceba. Incrível, não é?

Você pode adicionar quantos breakpoints de software quiser numa sessão de debugging. Todos ficam acessíveis na aba Breakpoints, a não ser que você os exclua. Veja a imagem abaixo:

Você também pode assistir a aula do CERO, que trata sobre este assunto.

🐞
Colocando um breakpoint na CALL
Lista de breakpoints