x64dbg 变量列表命令 varlist 全解析:用法、过滤器与底层实现
x64dbg 变量列表命令 varlist 全解析用法、过滤器与底层实现【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg导读varlist是 x64dbg 调试器中用于枚举当前调试会话内全部变量及其取值的命令是逆向工程与脚本调试场景下排查变量状态的核心工具。本文以官方命令文档 docs/commands/variables/varlist.md 为主体结合 x64dbg 源码中src/dbg/commands/cmd-variables.cpp与src/dbg/variable.cpp的实现细节系统讲解varlist的语法、过滤器、输出列含义、内置变量体系以及它在 GUI 中的等价操作帮助你彻底掌握变量的查看与排查方法。命令语法与参数说明varlist的官方定义非常精简完整语法为varlist [arg1]参数说明[arg1]可选过滤器取值USER、SYSTEM、READONLY不区分大小写用于限定输出变量的类型范围。省略时列出全部变量。执行结果该命令不会设置任何结果变量不写入$result/$res等因此在脚本中调用它不会污染其他表达式的求值结果可以放心在自动化流程里使用。无参数调用直接执行varlist不带参数会列出当前会话中所有可见变量包括用户变量与系统变量并在 GUI 的 References 视图中弹出变量清单。三种变量类型过滤器背后的分类体系varlist的过滤器参数USER、SYSTEM、READONLY与 x64dbg 内部的变量类型枚举一一对应。根据 src/dbg/variable.h 的VAR_TYPE定义enum VAR_TYPE { VAR_SYSTEM 1, VAR_USER 2, VAR_READONLY 3, VAR_HIDDEN 4 };结合 docs/introduction/Variables.md 的官方说明三种可被varlist过滤的公开类型含义如下USER用户变量由用户通过var/varnew命令或mov赋值、myvar 1234这类表达式创建无访问限制可读、可写、可删除。日常脚本中打交道最多的就是这类变量。SYSTEM系统变量由 x64dbg 内部创建可以读取和写入但不能删除。READONLY只读变量同样由 x64dbg 创建只能读取不能写入也不能删除。此外源码中还存在第 4 种类型VAR_HIDDEN隐藏变量如内部使用的$ans它既不属于公开过滤器也会在varlist输出时被跳过普通用户不会看到。过滤器解析的源码实现过滤器参数的大小写处理位于 src/dbg/commands/cmd-variables.cpp 的cbInstrVarList中使用不区分大小写的_stricmp比较int filter 0; if(argc 1) { if(!_stricmp(argv[1], USER)) filter VAR_USER; else if(!_stricmp(argv[1], READONLY)) filter VAR_READONLY; else if(!_stricmp(argv[1], SYSTEM)) filter VAR_SYSTEM; }因此varlist user、varlist User、varlist USER完全等价。注意传入非法过滤器名时并不会报错而是退化为filter 0即列出全部变量这一点在使用脚本时值得留意。输出内容与列含义varlist的输出不是普通日志而是通过 GUI 的 References 视图呈现。命令执行后会自动弹出 Variables 引用窗口每行一个变量共 4 列见 cmd-variables.cpp列表头内容说明第 0 列Value (Hex)变量值的十六进制表示列宽为2 * sizeof(duint)即 64 位下 16 字节、32 位下 8 字节第 1 列Variable变量名称第 2 列Value (Decimal)变量值的十进制表示第 3 列Property变量类型显示为 User Variable / System Variable / Read Only Variable其中十六进制与十进制值根据目标架构使用%llX/%llu64 位或%X/%u32 位格式化与sizeof(duint)保持一致。被跳过的变量并非所有内部变量都会出现在列表中。从源码第 84-86 行可以看到过滤逻辑// Skip empty and alias variables if(var.type VAR_HIDDEN || !var.alias.empty()) continue;即VAR_HIDDEN类型变量与带别名的变量alias 非空会被跳过。别名变量如$res$result的别名、$hp$hProcess的别名在 varinit() 中以$result\1$res这种\1分隔符的形式注册varlist只显示主名称。这也是为什么varlist看到的变量名可能与文档中的保留变量名略有差异。行内快捷操作varlist输出的 References 视图自带一条右键命令 Delete内部绑定为vardel $1见 cmd-variables.cpp允许你在列表中直接删除某个用户变量相当于图形化的 vardel 操作。内置变量盘点varlist 能看到的系统变量理解varlist的输出关键在于认识 x64dbg 内置了哪些系统变量。varinit()src/dbg/variable.cpp在调试会话初始化时注册了下列默认变量通用结果变量$result/$res、$result1/$res1至$result4/$res4VAR_SYSTEM用于承接各命令、表达式函数的返回值进程句柄与 ID$hProcess/$hp调试进程句柄、$pid调试进程 PID均为VAR_READONLY断点相关$breakpointcounter断点命中计数只读、$breakpointcondition控制条件断点暂停行为可写、$breakpointlogcondition条件断点日志条件只读、$breakpointexceptionaddress只读追踪相关$tracecounter只读、$tracecondition可写、$tracelogcondition只读内存与内部标志$lastalloc最近一次alloc的结果只读、$_EZ_FLAG相等/零标志1相等 0不相等只读、$_BS_FLAG大于/小于标志只读隐藏变量$ansVAR_HIDDEN不会出现在varlist输出中关于保留变量的更完整语义可进一步阅读 docs/introduction/Variables.md 与 docs/introduction/Expressions.md。从源码看数据流varenum 与线程安全varlist的背后是一条完整的数据链路命令注册于 src/dbg/x64dbg.cppdbgcmdnew(varlist, cbInstrVarList, false)同时它在 src/dbg/script_commands.txt 中以*varlist形式登记为脚本命令因此可直接用于.txt脚本与scriptcmd类命令。cbInstrVarList调用varenum()获取全部变量的快照src/dbg/variable.cppstd::vectorVAR varenum() { SHARED_ACQUIRE(LockVariables); std::vectorVAR vars; vars.reserve(variables.size()); for(const auto itr : variables) { vars.push_back(itr.second); } return vars; }所有变量保存在内部容器中varenum()通过共享锁LockVariables保护并发访问返回拷贝快照后GUI 填充与命令执行互不干扰。值得注意的实现细节是过滤参数filter在读取后被赋值但当前版本的cbInstrVarList实际遍历的是全部变量快照。从源码结构看filter变量的解析逻辑已就位为后续按类型精确过滤预留了扩展空间当前行为下类型信息统一体现在 Property 列中方便人工识别。因此如果你希望只关心某一类变量目前更可靠的途径是结合 References 视图的列排序或搜索功能进行筛选。GUI 中的等价操作varlist并非只能在命令行中执行。在 x64dbg 主窗口的右键菜单中内置了等价功能src/gui/Src/Gui/MainWindow.cpp 中DbgCmdExec(varlist)表明菜单项直接调用该命令src/gui/Src/Gui/MainWindow.ui 中对应的 UI 提示文案为Show a list of x64dbg variables. Equivalent command varlist。也就是说在 GUI 中通过右键菜单触发的变量列表展示与命令行执行varlist走的是完全相同的代码路径二者的输出格式与列定义一致。实战示例列出全部变量varlist执行后弹出 References 窗口包含 USER、SYSTEM、READONLY 三类变量及其十六进制/十进制值。只查看用户自定义变量varlist USER适合在脚本调试中快速确认myvar等自定义变量的当前取值确认mov、myvar 0x10、myvar等赋值操作是否生效。排查只读系统状态varlist READONLY可一次性看到$pid、$hProcess、$lastalloc、$breakpointcounter、$tracecounter等由调试器维护、用户不可写的关键状态量用于确认断点命中计数、最近内存分配结果等运行时信息。与 var / vardel 配合使用变量管理的完整命令族还包括var声明新变量var/varnew官方注释建议常规场景直接使用myvar 42赋值即可vardel删除用户变量$前缀可省略varlist本文讲解的变量枚举命令一个典型的排查流程是用mov或表达式赋值创建/修改变量 → 用varlist USER核对取值 → 确认无误后删除或继续使用。由于varlist不设置任何结果变量把它放在脚本中部也不会干扰$result的传递链。小结varlist语法为varlist [USER|SYSTEM|READONLY]省略参数时列出全部变量命令本身不写入任何结果变量适合嵌入脚本输出通过 References 视图呈现四列Value (Hex)、Variable、Value (Decimal)、PropertyVAR_HIDDEN与带别名的变量不会出现在输出中删除操作可借助视图内建的vardel $1完成过滤器解析、别名跳过、快照枚举等行为均有明确的源码依据src/dbg/commands/cmd-variables.cpp、src/dbg/variable.cppGUI 右键菜单与命令行为完全等价。【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考