Ollydbg 中调试断点
OLLYDBG 附加到一个正在运行的进程上
----------------------------------------------------------------------------------------------------------------
原理:
(1)利用DebugActiceProcess 函数可以将调试器捆绑到一个正在运行的进程上,如果成功,就类似于CreateProcess创建的新进程。附加后程序会暂停到Ntdll.dll的DebugBreakpoint处,按F9或Shift + F9键程序调试.
(2)如果隐藏进程,就不能用上面的附加方法了。Ollydbg 有一个-p的启动参数,只要得到pid就可以附加了,注意Pid是10进制的
C:\OllyDbg.exe -p pid 值。
附:运行A.exe ->调用 B.exe ,用OD附加B.exe,Ollydbg会无响应,解决办法是Option/Just-in-Time debugging中设置OD为即时调试器.将B.exe 的入口改为CC然后,记住原指令。此时运行A.exe其会调用B.exe,运行到INT3指令会异常,然后恢复原指令,继续调试。
-----------------------------------------------------------------------------------------------------------------
INT3 断点(F2)
INT3 机器码是 CCh。(可以设无数的断点)
原理: 执行一个INT3断点时,该地址处得内容被调试器用INT3 指令替换掉了,此时OD将INT3隐藏了,显示出来的仍是下断前的指令。
缺点:由于修改了原指令,很容易被软件检测出来。只需要判断API函数首地址是否是CCh
FARPROC Uaddr;
BYTE Mark = 0;
(FARPROC&) Uaddr = GetProcAddress(LoadLibrary("user32.dll"), "MessageBoxA");
Mark = *((BYTE*)uaddr);
if( Mark == OxCC) // 判断该字节是否是CC
{
return TRUE; // 发现断点
}
------------------------------------------------------------------------------------------------------------------
硬件断点:(Breakpoint/Hardware,on execution)
硬件断点和DRx调试寄存器有关。F4 也和DRx调试寄存器相关。(中断后自动删除,相当于1次硬件断点)
原理: 使用4个调试寄存器来设定地址,以及DR7设置状态,最多只能设4个。
31 23 15
-----------------------------------------------------------------------------------------------------------
LEN | R/W | LEN | R/W | LEN | LEN | R/W | 0 0 |0| OE | LE | G3 | L3 | G3 | L3 | G2 | L2 | G1 | L1 | G0 | L0 | DR7
3 | 3 | 2 | 2 | 1 | 0 | 0 | | |
-----------------------------------------------------------------------------------------------------------
0 0 0 0 0 0 0 |BT BS|BD| 0 0 0 0 0 0 0 0 | B3 | B2 | B1 | B0 | DR6
-----------------------------|--------------------------------------|--------------------------------------
保留 DR5
-----------------------------|--------------------------------------|--------------------------------------
保留 DR4
-----------------------------|--------------------------------------|--------------------------------------
用于一般断点的线性地址 DR3
-----------------------------|--------------------------------------|--------------------------------------
用于一般断点的线性地址 DR2
-----------------------------|--------------------------------------|--------------------------------------
用于一般断点的线性地址 DR1
-----------------------------|--------------------------------------|--------------------------------------
用于一般断点的线性地址 DR0
-----------------------------|--------------------------------------|--------------------------------------
Intel 调试寄存器示意图 (注意: 0或1 保留,未定义)
DR0 ~ DR3: 调试地址寄存器,保存需要监视的地址,如设置硬件断点。
DR4 ~ DR5: 保留,未公开的具体作用。
DR6: 调试寄存器组状态寄存器。
DR7: 调试寄存器组控制寄存器。
————————————————————————————————————————————————————————
内存断点:(内存访问断点和内存写入地址) 读取 写入 执行
原理: 对所设的地址设为不可访问/不可写入属性,这样当访问/写入的时候会产生异常。OD截获异常后比较异常是不是断电的地,如果是就中断。(由于每次都要比较,导致OD速度慢)。
注意: 代码校验,硬件断点失效使使用。
内存访问一次性断点:
Windows 内存是段页式管理,都有不可访问,读 写 执行属性。F2 是一次性断点。
————————————————————————————————————————————————————————
消息断点:
将会中断到Windows 系统代码里,消息扑捉到了,但是出于系统底层代码里,这时企图用Alt + F9 回到程序领空是徒劳的。
VC 可执行文件代码是存放在代码段里的,当系统回到应用程序领空时正是代码段执行,因此必须在代码段中下内存断点,就能返回程序领空。
————————————————————————————————————————————————————————
条件断点:
OD 里的条件断点是按照寄存器,存储器,消息等设断点,条件断点是一个带有条件表达式的普通INT3断点。当调试器渠道这样的断点时,将会计算表达式的值,结果无效时或非零,则断点生效。