条件断点

本章节介绍 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,请尝试用条件跟踪!。