ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

x64dbg traceexecute 命令详解:向 Trace 覆盖记录系统上报指令执行

x64dbg traceexecute 命令详解:向 Trace 覆盖记录系统上报指令执行 x64dbg traceexecute 命令详解向 Trace 覆盖记录系统上报指令执行【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg在 x64dbg 的命令行接口中traceexecute是一条服务于 Trace 覆盖trace coverage功能的轻量命令它告诉调试器“某个地址刚刚被执行地经过”从而驱动按内存页维护的执行位图/计数更新。读完本文你将掌握该命令的参数语义、从命令解析到页级覆盖数据结构的完整内部链路docs/commands/analysis/traceexecute.md 对应的实现代码位于 src/dbg/TraceRecord.cpp 与 src/dbg/commands/cmd-analysis.cpp以及它在单步、继续执行、GUI 覆盖菜单和脚本 API 等场景中如何被自动调用。命令定义参数与结果根据官方文档 docs/commands/analysis/traceexecute.mdtraceexecute的定义非常简洁作用Tell the debugger that an address has been traced告诉调试器某个地址已被追踪/执行。参数arg1—— 地址The address。结果该命令不设置任何结果变量This command does not set any result variables。命令处理函数 cbInstrTraceexecute 完整印证了文档描述bool cbInstrTraceexecute(int argc, char* argv[]) { if(IsArgumentsLessThan(argc, 2)) return false; duint addr; if(!valfromstring(argv[1], addr, false)) return false; dbgtraceexecute(addr); return true; }可以确认三个实现细节必须恰好提供 1 个参数否则命令失败参数通过valfromstring解析这意味着它接受的是 x64dbg 表达式——不仅是立即数地址还可以是寄存器如cip或表达式如mod 0x123解析成功后直接调用dbgtraceexecute(addr)函数无条件返回true与文档“不设置结果变量”的声明一致。该命令在 src/dbg/x64dbg.cpp 中注册源码注释也点明了它的定位dbgcmdnew(traceexecute, cbInstrTraceexecute, true); //execute trace record on address TODO: undocumented底层机制TraceRecordManager 的页级覆盖模型traceexecute的实质工作由全局单例TraceRecordManager完成类定义见 src/dbg/TraceRecord.h。核心设计是按4096 字节内存页为单位维护覆盖数据私有成员std::unordered_mapduint, TraceRecordPage TraceRecord以“模块哈希 页基址”为键值为该页的原始覆盖缓冲rawPtr、页内 RVA、数据类型与所属模块索引ModuleNames向量与getModuleIndex方法src/dbg/TraceRecord.cpp按模块名去重编号使跨模块同 RVA 的页面不会互相覆盖。覆盖数据的存储粒度由TraceRecordType枚举决定src/dbg/TraceRecord.h类型每字节占用含义TraceRecordNone0该页未启用 trace 记录TraceRecordBitExec1 bit只记录“是否执行过”TraceRecordByteWithExecTypeAndCounter8 bit高 2 位为字节类型低 6 位为命中次数TraceRecordWordWithExecTypeAndCounter16 bit高 2 位为字节类型低 14 位为命中次数“字节类型”TraceRecordByteType_2bitsrc/dbg/TraceRecord.h区分该字节在执行流中的位置_InstructionHeading指令首字节、_InstructionBody指令中间、_InstructionTailing指令末字节与_InstructionOverlapped同一字节曾以不同指令边界被重复解码常见于多态/重叠代码。这一分类使得覆盖视图不仅能回答“哪执行过”还能区分“作为指令头执行”与“只是指令体的一部分”。dbgtraceexecute 执行流程命令入口最终调用 dbgtraceexecute其逻辑分支如下查询该地址所在页的覆盖类型getTraceRecordType先对地址做 4096 对齐见 src/dbg/TraceRecord.cpp若页类型不是TraceRecordNone用MemRead读出该地址处的机器码经 Zydis 反汇编得到指令长度调用TraceRecord.TraceExecute(CIP, instruction.Size())更新覆盖数据若当前启用了 trace 录制isTraceRecordingEnabled()额外调用TraceExecuteRecord(instruction)把这条指令写入录制文件若页类型是TraceRecordNone且录制已启用则只走录制分支把指令追加到录制文件中无论是否命中覆盖数据最后都执行increaseInstructionCounter()累计已执行的指令计数。其中真正写入位图/计数的TraceExecutesrc/dbg/TraceRecord.cpp有几个值得注意的实现点跨页拆分若指令跨越页边界拆成两次子调用分别处理注释也坦承此时字节类型可能被轻微误标计数饱和6 位/14 位命中计数分别以0x3F、0x3FFF封顶避免溢出重叠检测当同一字节的指令边界类型前后不一致时该区间被整体改写为_InstructionOverlapped| 0xC0/| 0xC000。命令的自动调用方为什么很少需要手动敲它虽然traceexecute可以被手动执行但从源码结构看它更多是调试器内部同步覆盖数据的“心跳”调用执行控制路径src/dbg/debugger.cpp 在单步、继续、跳过等多处执行点如 L867、L1051、L1373-L1424、L1517、L2246 等以dbgtraceexecute(CIP)形式调用保证每执行一条指令覆盖记录就同步刷新GUI 覆盖菜单反汇编视图的 trace 覆盖右键菜单在处理完页类型设置后会显式执行DbgCmdExec(traceexecute cip)触发当前页的首次记账见 src/gui/Src/Gui/CPUDisassembly.cpp 中的traceCoverageBitSlot/traceCoverageByteSlot/traceCoverageWordSlot/traceCoverageResetSlot——分别对应启用 Bit/Byte/Word 三种记录粒度与重置寄存器改写联动通过表达式直接修改 CIPsrc/dbg/value.cpp或通过脚本 API 的Script::Register::Set修改 EIP/RIPsrc/dbg/_scriptapi_register.cpp时也会调用dbgtraceexecute(cip)使“程序计数器跳转”本身也被纳入覆盖统计。因此手动执行traceexecute的典型场景是在脚本中执行完某段地址的代码搬运、模拟执行或调试器状态与覆盖记录出现偏差后需要显式上报“该地址已被执行”来校正覆盖视图。使用注意与关联文档该命令不返回任何结果成功与否只能通过后续覆盖视图或 trace 文件观察参数缺失或地址无法解析时命令静默失败cbInstrTraceexecute返回false从源码结构看它依赖当前存在调试目标——dbgtraceexecute内部通过MemRead读取目标内存未附加调试进程时读不到字节序列命令不会产生有效覆盖更新页的覆盖类型需要先通过 GUI 覆盖菜单或对应内部接口SetTraceRecordType设置traceexecute只负责“记账”不负责“开账”若启用了 trace 录制执行记录会写入文件其格式说明可参见 docs/developers/tracefile.md插件侧存在对应的回调入口plugcbtraceexecute见 docs/developers/plugins/Callbacks/index.rst插件可在该事件点介入与运行轨迹类命令StartRunTrace、StopRunTrace等见 docs/commands/tracing/index.rst不同traceexecute属于静态覆盖统计路径归类于 analysis 命令组docs/commands/analysis/index.rst。【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表