条件断点
本章节介绍 x64dbg 中的条件断点功能。
操作概述
当找到一个断点时,x64dbg 将执行下列事情:
- 如果断点是异常断点,则将系统变量
$breakpointexceptionaddress
设置为异常地址; - 将命中计数器 增加 1;
- 设置系统变量
$breakpointcounter
为命中计数器 的值; - 如果中断条件 被设置,则计算该表达式(默认为
1
); - 如果快速继续执行 被设置,以及中断条件 计算为
0
:- 继续执行调试对象(跳过下一步)。这也将跳过执行插件回调和 GUI 更新。
- 如果日志条件 被设置,则计算该表达式(默认为
1
); - 如果命令条件被设置,则计算该表达式 (默认为
1
); - 如果中断条件 计算为
1
(或其他任何不等于 '0' 的值):- 显示标准日志消息; (如果断点设置为静默,则会禁止使用标准日志消息)。
- 执行插件回调。
- 如果日志文本被设置,并且日志条件计算为
1
(或其他任何不等于‘0’的值):- 格式化并显示日志文本 (参见字符串格式)。
- 如果命令文本 被设置并且命令条件 计算为
1
:- 设置系统变量
$breakpointcondition
为中断条件; - 设置系统变量
$breakpointlogcondition
为日志条件; - 在命令文本 中执行命令;
- 该中断条件 将被设置为
$breakpointcondition
的值。因此,如果在脚本中修改此系统变量,你将能够控制调试对象是否被中断。
- 设置系统变量
- 如果中断条件 计算为
1
(或其他任何不等于 '0' 的值):- 中断调试对象并等待用户继续执行。
如果任何表达式无效,则将触发该条件(即,无效的表达式作为条件将导致断点始终中断、记录并执行命令)。
命中计数器
命中计数器记录多少次已经达到了一个断点。即使在该断点上启用快速恢复,它也将无条件递增。它可以在断点视图中查看,并用 ResetBreakpointHitCount 重置。
日志记录
日志可以通过 x64dbg 被格式化,来记录程序的当前状态。请参阅有关如何格式化日志字符串的格式。
备注
您可以通过首先设置软件断点(F2键)来设置带有 GUI 的条件断点,然后右键单击该指令并从上下文菜单中选择“编辑断点”命令。根据需要填写条件表达式和/或其他信息,然后确认并关闭对话框。
你不应该使用可以更改调试对象运行状态(如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")
与条件跟踪的比较
条件断点只能在执行时暂停调试器。即使满足条件,在未命中断点时,它也不能暂停调试器。如果您不知道条件在哪里变为 true,请尝试用条件跟踪!。