无法设置4字节硬件断点Windbg

Dev*_*.K. 3 c++ debugging windbg reverse-engineering

我无法使用windbg设置4字节读/写访问硬件断点.

0:000> dd 02e80dcf
02e80dcf  13121110 17161514 1a191800 1e1d1c1b
02e80ddf  011c171f c7be7df1 00000066 4e454900
Run Code Online (Sandbox Code Playgroud)

实际上我必须检查程序改变/覆盖值0x13121110(地址0x02e80dcf)的时间.

所以当我试图设置一个4字节的写访问硬件断点@ 0x02e80dcf时,我得到的数据断点必须对齐错误.

0:000> ba w 4 02e80dcf
Data breakpoint must be aligned
                     ^ Syntax error in 'ba w 4 02e80dcf'
0:000> ba r 4 02e80dcf
Data breakpoint must be aligned
                     ^ Syntax error in 'ba r 4 02e80dcf'
0:000> ba w 1 02e80dcf
breakpoint 0 redefined
Run Code Online (Sandbox Code Playgroud)

我能够在地址处设置1字节写访问断点,但是当指针@地址0x02e80dcf被覆盖时它不会被触发.

而且,如果有人可以建议任何其他方式来检测地址覆盖的东西将是非常有帮助的.

注意:我遇到的特定程序问题.我可以在同一调试环境中设置4字节硬件断点.

Nei*_*tsa 6

作为旁注,这种特殊行为来自CPU架构本身(而不是来自系统或调试器).

x86和x86-64(Intel术语中的IA32和IA32-e)架构使用Drx(调试寄存器)来处理硬件断点.

Dr7 LENn字段将设置断点的长度,Dr0到Dr3将保存断点地址.

来自Intel Manual 3B - Chapter 18.2.5. "Breakpoint Field Recognition":

LENn字段允许指定1字节,2字节,4字节或8字节范围,从相应调试寄存器(DRn)中指定的线性地址开始.

在同一章中明确指出:

双字节范围必须在字边界上对齐; 必须在双字边界上对齐4字节范围.

如果用一个足够长的数据断点覆盖所需的地址,那么它将陷阱(断点将被命中):

如果参与访问的任何字节在断点地址寄存器及其LENn字段定义的范围内,则触发用于读取或写入数据的数据断点.

然后,本手册继续给出一个提示,以便在未对齐的地址上进行陷阱,并给出一个示例表:

可以使用两个断点构造未对齐操作数的数据断点,其中每个断点都是字节对齐的,并且两个断点一起覆盖操作数.

硬件brakpoints帮助表