OD调试常见断点及原理

来源:互联网 发布:linux怎么添加用户 编辑:程序博客网 时间:2024/05/21 02:36

OD调试时,常见的断点有int3、硬件断点、内存断点、消息断点、条件断点、条件记录断点等

1、int 3断点

原理:改变断点地址处的第一个字节为CC指令,在OD中不显示
缺点:容易被检测到,如检测MessageBoxA处CC断点
优点:可以设置无数个
OD快捷键F2就是利用这个特性

FARPROC Uaddr;BYTE Mark = 0;(FARPROC&)Uaddr=GetProcAddress(LoadLibrary("user32.dll"),"MessageBoxA");Mark = *((BYTE*)Uaddr)//取MessageBoxA第一个字节if(Mark==0xCC){    return TRUE  //发现断点}

2、硬件断点

原理:硬件断点依赖于DRX调试寄存器,DRX调试寄存器共有8个,
优点:不会改变指令,不会被自校验检测,精确到字节
缺点:只能建立4个
DR0-DR3用于保存断点地址,
DR4-DR5保留,
DR6调试寄存器组状态寄存器,
DR7调试寄存器组控制寄存器,具体如下图所示
这里写图片描述
OD快捷键F4利用了一次性硬件断点,建立之后运行一次自行删除
OD快捷键F8也利用了一次性硬件断点不过是在断点下一行建立硬断,建立之后运行一次自行删除

3、内存断点

原理:改变内存分页的属性,如内存访问断点设为不可访问属性
缺点:内存断点由于分页粒度的限制,无法保证精度,最小改变一页的属性。(32位系统内存分页粒度为4K)
优点:内存断点不改变指令,不会被自校验检测到,并且没有个数限制,同时可以对一整段内存下断,如ALT+M到内存窗口对某段“Set break-on-access”(快捷键F2)下一次性断点,或者右键“Set memory break-on-access”下永久断点(NT架构有效)

4、消息断点

原理:由于windows本身的消息机制,可以在某个特点窗口函数接收到某个特定消息时中断
eg:下断“注册”按钮消息
(1)点击菜单“View/Windows(查看/窗口)”,右键选择“Message brakepoint on ClassProc”
(2)在弹出的窗口选择WM_LBUTTONUP
(3)然后会断在系程序领空,需要在内存窗口下内存访问断点回到用户程序领空,反复几次能够跳出消息循环到达消息处理函数处

5、条件断点

原理:条件断点是一个带有条件表达式的普通INT3断点
eg:下断CreateFileA,条件为filename=“c:\123.txt”

HANDLE WINAPI CreateFile(_In_ LPCTSTR lpFileName,_In_ DWORD dwDesiredAccess,_In_ DWORD dwShareMode,_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,_In_ DWORD dwCreationDisposition,_In_ DWORD dwFlagsAndAttributes,_In_opt_ HANDLE hTemplateFile);

由于刚调用函数时,栈空间顶部(ESP)为返回地址,故ESP+4=FileName,
下断点可以找到系统dll中CreateFileA然后Shift+F2输入“[STRING[esp+4]]==“c:\123.txt””
或者输入 bp CreateFileA, [STRING[esp+4]]==“c:\123.txt”,也有出错的情况,比如

取地址中的内容在OD中用双方括号来操作,如取esp+4中的内容就该写成这样:[esp+4]。STRING前缀在OD中的解释是以零作为结尾的ASCII字符串。所以我们下条件断点时这样写:
bp CreateFileA,[STRING [esp+4]]==”abcdefghigklmn”
但却发现断不下来,写成这样:
bp CreateFileA,[[STRING [esp+4]]]==”abcdefghigklmn”
才能断下来,这里就应该是三层的地址了。为什么这样目前尚不清楚

6、条件记录断点

(本段引用自“hgy413的专栏”OD-条件断点、条件记录断点 ,在此谢过!)
快捷键Shift+F4,能够记录断点处函数表达式和参数的值,也可以设置断点的次数
以下演示条件记录断点

条件记录断点除了具有条件断点作用,还能记录断点处函数表达式或参数的值,也可以设置通过断点的次数,每次符合暂停条件时,计数器减一

如要记录Conditional_bp.exe调用CreateFileA函数的情况,在CreateFileA函数的第一行,按Shift+F4键,出现条件记录窗口:
这里写图片描述
在Condition(条件)域中输入要设置的条件表达式,

Explanation(说明)域中由用户自己设置一个名称,Expression(表达式)域中是要记录的内容的条件,只能设置一个表达式,如填的是[ESP+4},则要选择”Pointer to ASCII String”,才能正确打印出字符串,

Pause program是指OD遇到断点时是否中断,Log value of expression是指遇到断点时是否记录表达式的值, Log function arguments是指遇到断点时是澡记录函数参数,

Never(从不),On condition(按条件),Always(永远)等条件

0 0
原创粉丝点击