Window程序调试之常见的断点类型

Windows调试断点分类

        每次在我们双击桌面上的图标后,操作系统就为我们创建对应的进程,从而实现特定程序的功能。如果我们需要知道程序执行时某一个点的状态就需要使用程序调试技术。

        调试程序主要使用断点,从而让程序在指定位置或状态下暂停执行。断点主要分为以下几类

软件断点,硬件断点,内存断点等。

软件断点实现原理

软件断点利用cpu提供的特殊指令和中断能力实现。当cpu执行到int3指令(机器码0XCC)时,触发cpu的3号中断,进而进入异常分发流程,最终进程控制权中断到调试器中。所以如果要使用软件断点必须要具备以下条件:

        1. 代码所在内存需要有可执行权限

        2.可执行代码中必须包含cpu提供的特殊指令(int3)

        3.包含cpu特殊指令的代码有机会被cpu执行

我们使用的很多调试器设置的断点通常都是软件断点,其实是先修改待断点地址所在代码的内存页属性为可读可写可执行,然后将待断点地址的第一个字节改成0XCC,恢复进程执行后,当cpu执行到int3指令后就会中断到调试器中

硬件断点实现原理

硬件断点利用cpu提供的硬件寄存器实现。首先将待断点地址填充到DR0-DR3中,然后设置DR7中对应断点的中断条件,比如断点类型,断点长度等。

常用调试器设置硬件断点的简单流程是:

1. 通过GetThreadContext函数获取线程的上下文

2. 然后通过SetThreadContext函数设置DR0等调试寄存器,恢复进程运行

3. 当cpu执行到指定断点地址时会在DR6中记录中断发生的断点信息,同时产生调试异常(1号中断),然后进入异常分发流程,最终进程控制权中断到调试器中

单步断点实现原理

单步断点利用cpu提供的标志寄存器实现,标志寄存器中有一个陷阱标志位TF位,如果TF位被置1,cpu在每执行一条指令后便会产生一个调试异常,然后进入异常分发流程,最终中断到调试器中。

常用的调试器设置单步断点的流程和上述硬件断点的流程一致

内存断点

内存断点是利用内存页PDE&PTE中的RW位中记录的权限与当前执行的内存操作不一致从而触发异常(E号中断),然后进入异常分发流程,最终中断到调试器中。

常见的调试器设置的内存断点可分为内存读断点和内存写断点。断点的设置流程大致如下:

1.使用VirtualProtectEx函数去除要设置的内存断点类型的对应属性,比如我们要设置的是内存写断点,那我们就去除指定地址的内存写权限

2.当cpu指令触发指定内存页写入的时候,会触发异常,进入异常分发流程,最终中断到调试器中

3.对比异常上下文中的异常地址与我们设置的内存写断点的线性地址,如果不是我们设置的线性地址,则恢复异常地址的内存属性后,设置单步断点,继续恢复进程执行

4.在单步断点中重新执行1步中中的操作

总结

        各类型断点都是基于cpu提供的某种机制,触发各种异常,最终通过windows调试子系统中断到调试器中

        结合上述断点,我们可以实现更方便调试人员使用的其他类型断点,例如API断点,就是当程序调用指定函数的时候中断到调试器,这种断点原理是使用程序符号文件或程序文件导出表等技术计算出API所在函数的线性首地址,然后设置软件断点,硬件断点等,从而实现进程调用指定API后中断到调试器中

常见问题

1. 各类型断点分别适用哪些场景

软件断点通常用于断点地址确定情况,比如API断点,在关闭ALSR后,每次关键函数的地址都是确定的。这样在重复调试相同进程的情况下可以避免每次都设置断点。我们还可以用软件断点梳理被调试程序的函数调用链,从而猜测被调试程序大概执行哪些操作

硬件断点通常用于断点地址确定单是动态分配的内存地址的情况,比如某类病毒,会动态申请内存,然后解密进程携带的shellcode,拷贝到动态申请的内存中执行。这类病毒在关闭ALSR后,每次shellcode的内存位置通常是相同的,但是在进程刚开始调试时由于线性地址还未分配,所以这个时候是不能使用软件断点的。硬件断点还能规避一些程序的反调试,比如某些病毒会扫描自己的关键函数中是否有0xcc机器指令,如果检测到就说明程序可能被调试,从而执行其他操作

单步断点通常用于关键函数的逻辑分析,比如经过调试分析,定位了程序的关键函数,这时可以使用单步断点,详细分析程序的数据结构布局及使用方式。

内存断点通常用于确定函数调用栈的情况,比如进程调用VirtualAlloc分配了一块内存,我们想知道这块内存后续使用方式,可以设置内存读取断点或写入断点,这样当内存断点被触发时,我们可以查看汇编代码和调用栈,而且通常这种断点能定位程序的加解密流程,shellcode加载流程等关键过程

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值