OD调试时,常见的断点有int3、硬件断点、内存断点、消息断点、条件断点、条件记录断点等
原理:改变断点地址处的第一个字节为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 //发现断点 }原理:硬件断点依赖于DRX调试寄存器,DRX调试寄存器共有8个, 优点:不会改变指令,不会被自校验检测,精确到字节 缺点:只能建立4个 DR0-DR3用于保存断点地址, DR4-DR5保留, DR6调试寄存器组状态寄存器, DR7调试寄存器组控制寄存器,具体如下图所示 OD快捷键F4利用了一次性硬件断点,建立之后运行一次自行删除 OD快捷键F8也利用了一次性硬件断点不过是在断点下一行建立硬断,建立之后运行一次自行删除
原理:改变内存分页的属性,如内存访问断点设为不可访问属性 缺点:内存断点由于分页粒度的限制,无法保证精度,最小改变一页的属性。(32位系统内存分页粒度为4K) 优点:内存断点不改变指令,不会被自校验检测到,并且没有个数限制,同时可以对一整段内存下断,如ALT+M到内存窗口对某段“Set break-on-access”(快捷键F2)下一次性断点,或者右键“Set memory break-on-access”下永久断点(NT架构有效)
原理:由于windows本身的消息机制,可以在某个特点窗口函数接收到某个特定消息时中断 eg:下断“注册”按钮消息 (1)点击菜单“View/Windows(查看/窗口)”,右键选择“Message brakepoint on ClassProc” (2)在弹出的窗口选择WM_LBUTTONUP (3)然后会断在系程序领空,需要在内存窗口下内存访问断点回到用户程序领空,反复几次能够跳出消息循环到达消息处理函数处
原理:条件断点是一个带有条件表达式的普通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” 才能断下来,这里就应该是三层的地址了。为什么这样目前尚不清楚
(本段引用自“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(永远)等条件