如何设置断点捕获RDX寄存器被设为特定值的时刻?
问题描述
我的代码存在一处bug:当RDX寄存器的值被设为0x1111111111111111后,对其进行解引用操作引发了EXCEPTION_ACCESS_VIOLATION内存访问违例。我能通过首次异常捕获该错误,但因为使用VBA解释型语言(注入了汇编代码,错误未发生在注入函数中),异常调用栈无法提供有效线索。我尝试使用x64dbg的watchdog功能,但触发断点的是读取RDX的指令,而非设置RDX值的指令。现在需要正确设置断点的方法,以捕获RDX被设为该特定值的时刻。
相关异常信息
Address=00000000C0000005 Module/Label/Exception=EXCEPTION_ACCESS_VIOLATION State=Enabled Hits=1 Summary=firstchance()
触发断点的指令
00007FFB10751E5A | 48:8B52 08 | mov rdx,qword ptr ds:[rdx+8] |
Watchdog日志
Watchdog Watch 6 (expression "rdx==0x1111111111111111") is triggered at 00007FFB10751E5A ! Original value: 0000000000000000, New value: 0000000000000001 Exception Breakpoint EXCEPTION_ACCESS_VIOLATION (00000000C0000005) at 00007FFB10751E5A! Watchdog Watch 6 (expression "rdx==0x1111111111111111") is triggered at 00007FFB10751E5A ! Original value: 0000000000000001, New value: 0000000000000001
当前Watchdog配置
Name=Watch 6 Expression=rdx==0x1111111111111111 Value=0000000000000001 Type=UINT Watchdog Mode=Is true ID=6
解决方案
要捕获RDX被设置为0x1111111111111111的时刻,核心是针对寄存器写入操作设置断点,而非单纯监控寄存器当前值,具体方法如下:
方法1:硬件断点(寄存器写入触发+条件过滤)
- 打开x64dbg寄存器窗口,找到RDX寄存器
- 右键点击RDX,选择「Hardware Breakpoint」→「On Write」
- 右键新创建的断点,选择「Edit Condition」,输入表达式:
rdx == 0x1111111111111111 - 配置完成后,程序仅会在RDX被修改为目标值时触发断点暂停
方法2:批量条件断点监控修改RDX的指令
- 通过x64dbg的「Search」→「Search for Instructions」,搜索所有可能修改RDX的指令(比如
mov rdx,*、lea rdx,*、pop rdx、push rdx等) - 对每个找到的指令设置条件断点,条件同样为:
rdx == 0x1111111111111111 - 该方法精准度高,但需要覆盖所有修改RDX的指令类型
方法3:调整Watchdog配置为变更后检查
- 修改Watchdog配置:
- 将「Watchdog Mode」改为「On Change」
- 在「Condition」中添加表达式:
rdx == 0x1111111111111111
- 配置后,Watchdog会在RDX值发生变化时检查是否等于目标值,满足条件才触发断点
注意事项
- 硬件断点数量有限(x86/x64架构通常支持4个),若需监控多个寄存器,优先选择方法2或3
- 针对VBA解释型环境,可通过添加额外条件排除解释器对RDX的常规修改,减少无效断点触发
内容的提问来源于stack exchange,提问作者Greedo
相关产品推荐
相关产品推荐

