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函数首地址是否是CChFARPROC 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断点。当调试器渠道这样的断点时,将会计算表达式的值,结果无效时或非零,则断点生效。