Breakpoints
OllyDbg
supports many different types of breakpoints.
INT3 breakpoints
To set INT3 breakpoint, OllyDbg replaces first byte of the 80x86
command by a special code 0xCC (one-byte interrupt with a vector 3,
also known as a "trap to debugger"). When CPU executes INT3, it
calls OS interrupt handler which in turn reports it as an
exception of type EXCEPTION_BREAKPOINT
to OllyDbg.
Number
of INT3 breakpoints is unlimited. They work only on code. Misplaced
INT3 breakpoint (set on data or in the middle of the command) may
easily lead to the crash of debugged application. If OllyDbg is not
sure whether INT3 breakpoint is allowed, it will ask for confirmation.
There are four kinds of INT3 breakpoints:
- Manual,
set by user. They may be programmed to jump only on condition and may
protocol the call arguments or values defined by the user. Manual
breakpoints are permanent but may be temporarily disabled. OllyDbg
keeps them between sessions;
- One-shot,
used to pause execution on module entry point, when executing code
till selection or in similar cases. One-shot breakpoints are
automatically deleted when hit;
- Temporary,
used by OllyDbg and plugins to step over the command, to perform
special actions when system routine is called or to restore manual
bteakpoint when it is stepped over;
- Trace breakpoints, used to mark unprocessed or unsure branches during hit trace.
One may set all four breakpoints on the same address, and they will be correctly processed.
OllyDbg
frequently uses temporary INT3 breakpoints for internal purposes. In
the extreme case of hit trace restored from the disk, OllyDbg sets INT3
breakpoint on every traced command.
Hardware breakpoints
80x86 CPUs support 4 hardware breakpoints. Hardware breakpoints can be set on memory read, memory read or write, or on instruction execution. They
cover 1, 2 or 4 bytes of memory, and protected memory must be aligned
on this size. If execution breakpoint is set on data, or read
breakpoint on command, it will make no harm.
Like INT3, hardware
breakpoints may be manual, one-shot and temporary. Manual breakpoints
may have associated condition and may protocol the values of
expressions.
Hardware breakpoints are practically transparent
for the debugged application, but they are very scarce. They are
slightly faster than INT3. If OllyDbg is allowed to use hadrware
breakpoints, it will automatically select INT3 or hardware breakpoint
when stepping over instructions.
Memory breakpoints
OllyDbg can set memory breakpoints on read, write and/or on
instruction execution. Number of memory breakpoints is unlimited. Note
that 80x86 CPU can set memory attributes only on the complete memory
pages, 4096 bytes long. Therefore memory breakpoints produce many false
breaks and in some cases may be very slow.
Memory breakpoints are user-controlled. They may have associated condition and may protocol the
values of expressions.
If
kernel attempts to access protected memory page, this may result in the
crash of the debugged application. Memory breakpoint on the stack is an
absolute no-go.
Guarded pages (breaks on access)
Guarded
pages are one-shot breakpoints set on access (read, write or
execution) to memory page. Windows report them as an exception of type
EXCEPTION_GUARD_PAGE and automatically remove guarding from the touched
page. Guarded pages seem to be kernel-safe.
OllyDbg may use guarded pages to pause the debugged application.
API
functions:
int Setint3breakpoint(ulong addr,ulong type,int fnindex,int limit,int count,ulong actions,wchar_t *condition,wchar_t *expression,wchar_t *exprtype);
int Removeint3breakpoint(ulong addr,ulong type);
int Enableint3breakpoint(ulong addr,int enable);
int Confirmint3breakpoint(ulong addr);
int Confirmint3breakpointlist(ulong *addr,int naddr);
void Wipebreakpointrange(ulong addr0,ulong addr1);
int Sethardbreakpoint(int index,ulong size,ulong type,int fnindex,ulong addr,int limit,int count,ulong actions,wchar_t *condition,wchar_t *expression,wchar_t *exprtype);
int Removehardbreakpoint(int index);
int Enablehardbreakpoint(int index,int enable);
int Findfreehardbreakslot(ulong type);
int Confirmhardwarebreakpoint(ulong addr);
int Plugintempbreakpoint(ulong addr,ulong type,int forceint3);
int Setmembreakpoint(ulong addr,ulong size,ulong type,int limit,int count,wchar_t *condition,wchar_t *expression,wchar_t *exprtype);
int Removemembreakpoint(ulong addr);
int Enablemembreakpoint(ulong addr,int enable);