条件跟踪

本章节介绍 x64dbg 中的条件跟踪功能。

操作概述

当跟踪一步找到时,x64dbg 将做以下事情︰

  • 跟踪计数器增加 1;
  • 设置系统变量 $tracecounter跟踪计数器的值;
  • 如果中断条件被设置,则计算该表达式(默认为0);
  • 执行插件回调(允许插件更改中断条件);
  • 如果日志条件被设置,则计算该表达式(默认为1);
  • 如果命令条件 被设置,则计算该表达式 (默认为中断条件);
  • 如果切换条件被设置,则计算该表达式(默认为0);
  • 如果日志文本 被设置,并且日志条件计算为1
  • 如果命令文本 被设置并且命令条件 计算为1
    • 设置系统变量 $tracecondition中断条件
    • 设置系统变量 $tracelogcondition日志条件
    • 设置系统变量 $traceswitchcondition切换条件
    • 命令文本中执行命令;
    • 中断条件 将被设置为 $tracecondition 的值。因此,如果在脚本中修改此系统变量,你将能够控制调试对象是否被中断。
    • 切换条件 将被设置为 $traceswitchcondition 的值。因此,如果在脚本中修改此系统变量,你将能够控制步子类型是否被切换。
  • 如果中断条件 计算为1
    • 显示标准日志消息;
    • 中断调试对象并等待用户继续执行。
  • 如果切换条件 计算为1
    • 切换(反转)步进类型。如果在其中跟踪,它将切换到步出(和周围的其他方式)。例如,这可以允许你用条件 mod.party(dis.branchdest(cip)) == 1 调用时不进入系统模块跟踪,或不进入某些调用跟踪。

日志记录

日志可以通过 x64dbg 被格式化,来记录程序的当前状态。请参阅有关如何格式化日志字符串的格式。如果您正在寻找记录所有跟踪指令的地址和反汇编,你可以使用{p:cip} {i:cip}。要将日志重定向到文件,请使用 TraceSetLogFile

跟踪记录

如果使用其中一个基于跟踪记录的跟踪选项,则中断条件的初始评估包括您指定的跟踪记录跟踪类型。正常的中断条件 可用于在满足跟踪记录条件之前中断。如果要在您的条件中包含跟踪记录以进行完全控制,则可以使用表达式函数

注释

您可以通过"调试" 菜单中的 "跟踪直到条件"/"跟踪到条件" 命令启动条件跟踪。

你不应该使用可以更改调试对象运行状态(如run)内部断点命令的命令,因为用在这里,这些命令是不稳定的。你可以使用中断条件命令条件$tracecondition 来代替。