OD调试常见断点及原理(浓缩版)

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”

6、条件记录断点
快捷键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(永远)等条件;

破解常用的断点设置
bpx hmemcpy 破解万能断点,拦截内存拷贝动作
bpx Lockmytask 当你用其它断点都无效时可以试一下,这个断点拦截按键的动作
bmsg handle wm_gettext 拦截注册码(handle为对应窗口的句柄)
bmsg handle wm_command 拦截OK按钮(handle为对应窗口的句柄)
可以用SoftICE提供的HWND命令获得窗口句柄的信息,也可以利用Visual Studio中的Spy++实用工具得到相应窗口的句柄值,然后用BMSG设断点拦截。例:
  BMSG 0129 WM_COMMAND

拦截窗口:
bpx CreateWindow 创建窗口
bpx CreateWindowEx(A) 创建窗口
bpx ShowWindow 显示窗口
bpx UpdateWindow 更新窗口
bpx GetWindowText(A) 获取窗口文本

拦截消息框:
bpx MessageBox(A) 创建消息框
bpx MessageBoxExA 创建消息框
bpx MessageBoxIndirect(A) 创建定制消息框

拦截警告声:
bpx MessageBeep 发出系统警告声(如果没有声卡就直接驱动系统喇叭发声)

拦截对话框:
bpx DialogBox 创建模态对话框
bpx DialogBoxParam(A) 创建模态对话框
bpx DialogBoxIndirect 创建模态对话框
bpx DialogBoxIndirectParam(A) 创建模态对话框
bpx CreateDialog 创建非模态对话框
bpx CreateDialogParam(A) 创建非模态对话框
bpx CreateDialogIndirect 创建非模态对话框
bpx CreateDialogIndirectParam(A) 创建非模态对话框
bpx GetDlgItemText(A) 获取对话框文本
bpx GetDlgItemInt 获取对话框整数值

拦截剪贴板:
bpx GetClipboardData 获取剪贴板数据

拦截注册表:
bpx RegOpenKey(A)
bpx RegOpenKeyEx
bpx RegQueryValue(A)
bpx RegQueryValueEx
bpx RegSetValue(A)
bpx RegSetValueEx(A)

功能限制拦截断点:
bpx EnableMenuItem 禁止或允许菜单项
bpx EnableWindow 禁止或允许窗口
bmsg hMenu wm_command 拦截菜单按键事件,其中hMenu为菜单句柄
bpx K32Thk1632Prolog 配合bmsg hMenu wm_command使用,可以通过这个断点进入菜单处理程序

拦截时间:
bpx GetLocalTime 获取本地时间
bpx GetSystemTime 获取系统时间
bpx GetFileTime 获取文件时间
bpx GetTickCount 获得自系统成功启动以来所经历的毫秒数
bpx GetCurrentTime 获取当前时间(16位)
bpx SetTimer 创建定时器
bpx TimerProc 定时器超时回调函数

拦截文件:
bpx CreateFileA 创建或打开文件 (32位)
bpx OpenFile 打开文件 (32位)
bpx ReadFile 读文件 (32位)
bpx WriteFile 写文件 (32位)
bpx _lcreat 创建或打开文件 (16位)
bpx _lopen 打开文件 (16位)
bpx _lread 读文件 (16位)
bpx _lwrite 写文件 (16位)
bpx _hread 读文件 (16位)
bpx _hwrite 写文件 (16位)

拦截驱动器:
bpx GetDrivetype(A) 获取磁盘驱动器类型
bpx GetLogicalDrives 获取逻辑驱动器符号
bpx GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径

拦截狗:
bpio -h 378(或278、3BC) R 378、278、3BC是并行打印端口
bpio -h 3F8(或2F8、3E8、2E8) R 3F8、2F8、3E8、2E8是串行端口

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值