【问题标题】:Cannot Set 4 Byte Hardware Breakpoint Windbg无法设置 4 字节硬件断点 Windbg
【发布时间】:2015-06-08 21:35:50
【问题描述】:

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

0:000> dd 02e80dcf
02e80dcf  13121110 17161514 1a191800 1e1d1c1b
02e80ddf  011c171f c7be7df1 00000066 4e454900

实际上,我必须检查值 0x13121110(地址 0x02e80dcf)何时被程序更改/覆盖。

所以当我尝试设置一个 4 字节写访问硬件断点 @ 0x02e80dcf 时,我得到 Data breakpoint must bealigned 错误。

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

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

如果有人能提出任何其他方法来检测地址被覆盖的东西,那将非常有帮助。

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

【问题讨论】:

  • 你有一个 C++ 标签。 C++代码在哪里?我看到的只是与 WinDbg 的对话。
  • SO 建议的。

标签: c++ debugging reverse-engineering windbg


【解决方案1】:

附带说明,这种特殊行为来自 CPU 架构本身(而不是来自系统或调试器)。

x86 和 x86-64(英特尔术语中的 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 字节范围必须 在双字边界上对齐。

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

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

然后手册继续给出一个提示以捕获未对齐的地址并给出一个示例表:

未对齐操作数的数据断点可以使用 两个断点,其中每个断点是字节对齐的,两个 断点一起覆盖操作数。

【讨论】:

    【解决方案2】:

    地址必须在 4 字节边界上对齐(或对于 64 位系统更大)。

    任何以 0xf 结尾的十六进制地址都不与 4 字节边界对齐。

    WinDbg 可能会限制数据断点对齐到 4 或 8 字节边界。许多人需要使用条件中断,以便只检查一个字节。

    【讨论】:

    • 非常感谢!所以我做了类似“ba w 4 02e80dcf-1”之类的操作,它对我有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多