条件断点
本节描述 x64dbg 中的条件断点功能。
操作概述
当断点被触发时,x64dbg 将执行以下操作:
将系统变量
$breakpointexceptionaddress设置为触发断点的地址(内存位置);增加命中计数器;
将系统变量
$breakpointcounter设置为命中计数器的值;如果设置了中断条件,则求值表达式(默认为
1);如果设置了快速恢复且中断条件求值为
0:恢复被调试程序的执行(跳过以下步骤)。这也将跳过执行插件回调和 GUI 更新。
如果设置了日志条件,则求值表达式(默认为
1);如果设置了命令条件,则求值表达式(默认为
1);如果中断条件求值为
1(或除 '0' 以外的任何值):打印标准日志消息;(如果断点被设置为静默模式,则不会打印标准日志消息。)
执行插件回调。
如果设置了日志文本且日志条件求值为
1(或除 '0' 以外的任何值):格式化并打印日志文本(参见字符串格式化)。
如果设置了命令文本且命令条件求值为
1:将系统变量
$breakpointcondition设置为中断条件;将系统变量
$breakpointlogcondition设置为日志条件;执行命令文本中的命令;
中断条件将被设置为
$breakpointcondition的值。因此,如果您在中修改此系统变量脚本中,您将能够控制是否中断被调试程序。
如果中断条件求值为
1(或除 '0' 以外的任何值):中断被调试程序并等待用户恢复。
如果任何表达式无效,条件将被触发(即,无效的表达式作为条件将导致断点始终中断、记录日志并执行命令)。
警告:表达式中的所有数字默认被解释为十六进制! 十进制请使用 .123。
命中计数器
命中计数器记录断点被触达的次数。它将无条件递增,即使该断点启用了快速恢复。可以在断点视图中查看,并通过 ResetBreakpointHitCount 重置。
日志记录
x64dbg 可以格式化日志以记录程序的当前状态。参见格式化了解如何格式化日志字符串。
注意事项
您可以通过 GUI 设置条件断点:首先设置软件断点(按 F2),然后右键单击该指令,从上下文菜单中选择"编辑断点"命令。根据需要填写条件表达式和/或其他信息,然后确认并关闭对话框。
您不应使用可能改变被调试程序运行状态的命令(如 run)在断点命令中,因为这些命令在此处使用不稳定。您可以改用中断条件、命令条件或 $breakpointcondition。
示例
永不中断的条件断点
中断条件:0(如果您只想执行命令或记录数据,但不暂停被调试程序,则此选项很有用)
仅当 EAX 和 ECX 都等于 1 时中断的条件断点
中断条件:EAX==1 && ECX==1
仅当第一个参数为 1 时中断的条件断点
中断条件:arg.get(0)==1
仅当 EAX 是有效地址时中断的条件断点
中断条件:mem.valid(EAX)
仅在第三次命中时中断的条件断点
中断条件:$breakpointcounter==3 或 ($breakpointcounter%3)==0
仅当由线程 1C0 执行时中断的条件断点
中断条件:tid()==1C0
仅当 ECX 指向包含 "foo" 的 UTF-16 字符串时中断的条件断点
中断条件:strstr(utf16(ECX), "foo")
与条件跟踪的比较
条件断点只能在执行时暂停被调试程序。当断点未被触发时,即使条件满足,它也无法暂停被调试程序。如果您不知道条件将在哪里变为真,请尝试条件跟踪!