Professional Documents
Culture Documents
Chapter 8 Debugging
Debuggers
Hardware or software used to examine execution of another
program
Disassembler: static snapshot of what code looks like before execution
Debugger: dynamic snapshot of what code does during execution
Source-Level (built-in most IDE)
Debug while coding
Map machine execution to corresponding source code lines
Allow setting of breakpoints at source-code lines
Assembly-level
Strictly operate at machine instruction level
Main debugger used for malware (no need to access to source code)
Types of Debuggers
User mode
Debug one program via another program all in user space
Examples: OllyDbg, gdb
Kernel mode
Debugging a kernel requires a second machine
Must configure target OS to allow kernel debugging
Examples: WinDbg
Using a Debugger
Single stepping
One machine instruction or source line at a time (slow)
Stepping-over: bypass call instructions (F8)
Stepping-into: in the call function (starting from the first
instruction) (F7)
Stepping-out: run until return back to calling function (finish)
Breakpoints
Breakpoints (software)
Needed because registers/memory addr are changing
Allows one to examine the state of the machine at critical
execution points
File creation – set breakpoint to CreateFileW and look at the value on
stack to get filename
Encryption – set breakpoint at encryption to see data before encrypted
Implemented by overwriting INT 3 (0xcc) into opcode of
instruction
When 0xcc is executed, OS generates an exception and transfer
control to debugger
Debugger restores overwritten byte upon continue
Hardware Breakpoints
Hardware execution breakpoints (faster)
Dedicated registers that store virtual addresses
Can be set to break on access – break when a memory location
is encountered (halt on non-execution memory address)
Only 4 hardware registers (DR0-DR3) – x86
4 active hardware breakpoints at once.
Can be modified by running program (malware)!
Malware can disable them
Counter-measure is “General Detect” flag in DR7 (debug control) that
triggers a breakpoint prior to any mov involving debug registers
Detect when the debug register is changed
Conditional Breakpoints
Conditional software execution breakpoints
Break only if a certain condition is met
Example
Break on GetProcAddress function only if address parameter is
RegSetValue
Implemented as normal software breakpoint, but debugger checks
condition and automatically continues if not met
Program slow down -> examine whether condition is met
Exceptions
Exceptions pass control to debugger
Division by 0, invalid memory access, INT 3
(0xcc/breakpoint),
Might interfere with exception handlers that program needs to run