博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ollydbg 中调试断点
阅读量:4590 次
发布时间:2019-06-09

本文共 3284 字,大约阅读时间需要 10 分钟。

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

 

转载于:https://www.cnblogs.com/xiaojinma/archive/2012/12/07/2806740.html

你可能感兴趣的文章
字符串截取,SubString
查看>>
Android: 网络随时需要在3G和Wifi切换,网络程序需要注意
查看>>
ajax调用servlet
查看>>
IText 生成横向的doc文档
查看>>
认识了个外国友人!
查看>>
对Cookie进行增删改查
查看>>
MySQL sql语句获取当前日期|时间|时间戳
查看>>
微信支付官方SDK V3 .NET版的坑
查看>>
Python(一)list tuple dict set
查看>>
什么是死锁,简述死锁发生的四个必要条件,如何避免与预防死锁
查看>>
hdu4651(广义五边形数 & 分割函数1)
查看>>
python iter,迭代器&dict,字典详解
查看>>
python笔记1
查看>>
C语言:自定义一个查找字串的功能函数,类似于<string.h>中的strstr()
查看>>
数据库联系 创建表格:重点
查看>>
Regist
查看>>
设置磁盘配额(第二版)
查看>>
[转]asp.net 防止外部提交数据
查看>>
android用户界面之Gallery3D学习资料汇总
查看>>
[编写高质量代码:改善java程序的151个建议]建议62 警惕数组的浅拷贝
查看>>