资讯动态

x64dbg 变量声明命令 `var`/`varnew` 完全指南:从命令用法到源码实现

发布时间:2026/9/19 23:21:47 来源:尧图企业网站定制
x64dbg 变量声明命令var/varnew完全指南从命令用法到源码实现【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbgvar别名varnew是 x64dbg 中用于声明新变量的命令。本篇指南以 var.md 为核心骨架完整覆盖var、vardel、varlist三条变量管理命令的参数约定、变量命名规则$前缀自动补全、三种变量类型USER / SYSTEM / READONLY的权限模型并结合 variable.cpp 与 cmd-variables.cpp 的源码实现深入讲解变量注册、别名机制与读写权限的底层逻辑。读完本文你将能够在 x64dbg 命令行与脚本中正确、高效地创建、查询与删除变量并理解官方文档建议优先使用赋值而非var命令背后的设计考量。一、var/varnew命令速览var与varnew是同一个命令的两个名字别名用于声明一个新的变量。var 变量名 [初始值] varnew 变量名 [初始值]命令注册代码位于 x64dbg.cpp别名通过dbgcmdnew一次性注册dbgcmdnew(varnew,var, cbInstrVar, false); //make a variable arg1:name,[arg2:value]参数说明参数含义arg1变量名。若未以$开头会自动补上$前缀见下文命名规则一节。[arg2]初始值可选。该值会按控制台输入console input的取值规则解析即与表达式解析器共用同一套取值逻辑。省略时初始值为0。结果变量该命令不会设置任何结果变量如$result/$res因此无法直接通过$result判断创建是否成功——请直接观察命令行输出的成功/失败提示。二、重要警告日常开发请优先使用赋值原文档开篇就给出了一条明确的工程建议var.mdNote: You should not use this command under normal circumstances. If you want to create a variable you can do so withmyvar 42.在正常情况下你不应该使用var命令。如果你只是想创建一个变量直接用赋值表达式即可myvar 42 $myvar 42两种写法等价都会创建名为myvar的用户变量USER 类型并赋值为0x2A。原因在于赋值语法更简洁、更贴近常规编程习惯且同样具备自动补全$前缀的能力。var命令更多作为底层/脚本化的声明入口存在是理解 x64dbg 变量系统工作原理的一个窗口。更多赋值方式见 Variables.md其中还列出了 C 风格复合赋值运算符的用法myvar 0x10 myvar | 0x10 myvar myvar--三、源码视角var命令的完整执行链路var命令由 cmd-variables.cpp 中的cbInstrVar实现其执行流程可拆解为四步参数数量校验IsArgumentsLessThan(argc, 2)少于 2 个参数即缺变量名直接返回false。变量名合法性检查若arg1以$开头则跳过 1 个字符随后调用valfromstring(argv[1] add, value)尝试把变量名当值解析——如果名字本身能解析成数值说明它是字面量而非合法名字命令会报错 Invalid variable name。这保证了不会把纯数字等字面量误当作变量名。初始值解析通过valfromstring(arg2, value)将第二个参数解析为数值支持寄存器、表达式、十六进制等一切表达式语法省略时取0。注册变量调用varnew(argv[1], value, VAR_USER)以VAR_USER用户变量类型创建。失败时输出 Error creating variable成功时在命令行回显变量名十六进制值若值大于 15 还会附上十进制显示x64 下格式为%llX (%llud)x86 下为%X (%ud)。底层注册函数varnewvarnew定义于 variable.cpp是变量系统的核心注册函数关键行为包括$前缀自动补全名字不以$开头时自动拼接$与文档will be prefixed with $ if not done完全对应。重名检测若变量已存在则返回false防止覆盖。别名支持名字中可用\1分隔多个名称后续名称作为首个名称的别名alias例如varinit中注册$result\1$res让$res成为$result的别名。值类型新变量统一按VAR_UINT无符号整数存储大小为一个duintx64 下 8 字节x86 下 4 字节。所有变量存放在一个不区分大小写的std::map容器中std::mapString, VAR, StringUtils::CaseInsensitiveLess variables;见 variable.cpp并受LockVariables读写锁保护保证多线程环境下变量操作的线程安全。四、变量的三种类型与权限模型variable.h 定义了四种VAR_TYPE其中前三种是文档 Variables.md 明确对外公开的类型枚举值名称创建者权限VAR_USER 2USER用户变量用户通过var/mov/创建无访问限制可读、可写、可删除VAR_SYSTEM 1SYSTEM系统变量x64dbg 内部创建可读、可写但不可删除VAR_READONLY 3READONLY只读变量x64dbg 内部创建可读但不可写、不可删除VAR_HIDDEN 4HIDDEN隐藏变量x64dbg 内部使用如$ans不在varlist中显示权限在底层由varset和vardel强制实施varset写入时若变量是VAR_READONLY或VAR_HIDDEN且调用方未声明ReadOnly权限直接返回false拒绝写入。vardel删除时返回值为0成功、-1变量不存在、-2试图删除非用户变量、-3未知错误。五、变量命名规则$前缀的自动补全无论使用var、vardel、varlist还是mov/赋值x64dbg 都遵循同一条命名约定变量名不强制要求写$前缀若省略$系统在查找或创建时会自动补全文档中已带$的变量如$pid、$result写全名时保持原样。以删除命令为例cmd-variables.cppvardel myvar与vardel $myvar效果相同因为vardel内部同样执行前缀补全逻辑String name_; if(*Name ! $) name_ $; name_ Name;这一规则贯穿varnew、varget、varset、vardel、vargettype全部变量 API见 variable.cpp 各函数开头是理解变量系统行为一致性的关键。六、配套命令vardel与varlistvar命令属于 x64dbg 变量控制命令组见 variables/index.rst同组的另外两条命令是1.vardel删除用户变量vardel 变量名arg1要删除的变量名$会被自动补全。底层调用vardel(argv[1], false)DelSystemfalse意味着只能删除 USER 类型变量尝试删除 SYSTEM / READONLY 变量时命令输出 Could not delete variable。命令注册见 x64dbg.cppdbgcmdnew(vardel, cbInstrVarDel, false)。该命令同样不设置任何结果变量。2.varlist列出全部变量varlist [过滤器][arg1]可选过滤器取值为USER、SYSTEM、READONLY大小写不敏感内部用_stricmp比较。省略时列出所有变量。输出方式不是简单的文本打印而是通过GuiReferenceInitialize/GuiReferenceAddColumn等桥接 API 在 GUI 的**引用视图Reference View**中渲染一张表格包含四列Value (Hex)、Variable、Value (Decimal)、Property变量类型。表格还注册了右键命令vardel $1方便直接在列表中对某一行执行删除。隐藏变量VAR_HIDDEN与别名变量alias非空会被跳过不显示见 cmd-variables.cpp。命令注册见 x64dbg.cppdbgcmdnew(varlist, cbInstrVarList, false)。七、内置系统变量与只读变量varinit初始化清单虽然var命令用于创建用户变量但了解系统预置变量有助于正确使用var与表达式。varinitvariable.cpp在调试器初始化时创建了如下变量系统变量SYSTEM可读写不可删$result别名$res、$result1~$result4别名$res1~$res4通用结果变量供各命令/表达式回写结果$__disasm_refindex、$__dump_refindex内部引用索引$breakpointcondition条件断点中控制暂停行为的变量详见 ConditionalBreakpoint.md$tracecondition条件跟踪的暂停条件变量只读变量READONLY只能读$pid被调试进程的进程 ID$hProcess别名$hp被调试进程的句柄$lastalloc最近一次alloc命令的分配结果$breakpointcounter断点命中计数器在条件断点条件求值前设置$breakpointlogcondition条件断点的日志条件注意不能用来控制日志行为本身$tracecounter、$tracelogcondition跟踪相关只读变量$_EZ_FLAG、$_BS_FLAG内部使用的相等/零标志与大小标志隐藏变量HIDDEN$ans别名$an表达式求值过程中的中间答案变量保留变量的完整说明见 Variables.md 的 Reserved Variables 一节。八、mov命令与var的分工文档 Variables.md 把var/mov并列列为创建变量的两种命令方式。从源码看二者确实共享同一个创建入口cbInstrMovcmd-general-purpose.cpp在目标地址不是已存在变量、也不是内存地址时最终会调用varnew(argv[1], set_value, VAR_USER)创建用户变量即mov myvar, 1234等价于创建一个myvar 0x1234的用户变量。区别在于mov更通用既能写变量也能写内存而var专用于声明变量并显式指定初始值。二者创建出的变量类型完全一致均为VAR_USER。九、参考与延伸阅读本命令原文var.md同组命令vardel.md、varlist.md变量体系总览Variables.md值解析规则Values.md表达式与运算符Expressions.md源码实现variable.cpp注册/读取/写入/删除/枚举、variable.h类型与结构定义、cmd-variables.cpp命令实现、x64dbg.cpp命令注册【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价