尧图精选

x64dbg `mulhi` 命令详解:无符号高 64 位乘法指令的用法与底层实现

🕒 发布时间:2026/9/19 4:16:16 📁 来源:尧图网络
x64dbgmulhi命令详解无符号高 64 位乘法指令的用法与底层实现【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbgmulhi是 x64dbg 调试器命令集general-purpose 类中的一个算术语义命令用于将两个无符号值相乘并把结果的高半部分high part写入目标变量arg1。它与普通乘法命令mul保留乘积低半部分互为补充为逆向工程中处理大数乘法、哈希/加密算法还原等场景提供了精确的算术原语。读完本文你将掌握mulhi的语法、参数语义、与mul/表达式运算符的关系以及它在 x64dbg 表达式解析器与命令注册表中的底层实现原理。命令概览mulhi的命令注册位于 src/dbg/x64dbg.cppdbgcmdnew(mulhi, cbInstrMulhi, false);dbgcmdnew的第三个参数为false表示该命令默认不要求调试会话必须处于活动状态即可解析参数与push/pop等需要上下文的命令不同其行为完全由参数表达式驱动详见后文源码分析。项目说明命令名mulhi功能无符号相乘取乘积的高半部分写入目标参数arg1目标、arg2源结果变量不设置任何结果变量所属类别general-purpose通用算术注册位置src/dbg/x64dbg.cpp#L115回调实现src/dbg/commands/cmd-general-purpose.cpp#L74-L91参数与语法命令原型mulhi arg1, arg2arg1Destination目标乘积高半部分的接收者。必须是一个可写的目标最常见的是用户变量myvar、$myvar或寄存器变量如eax、rax也可以是与赋值运算符兼容的任何可写表达式左值。arg2Source源参与乘法运算的乘数可以是立即数值十进制、十六进制0x...、已存在的变量、寄存器或任意表达式。执行后arg1被更新为(arg1 × arg2)乘积的高 64 位64 位模式下或高 32 位32 位模式下。与mul的区别命令取乘积的哪一部分mul低半部分low part即普通整数乘法结果mulhi高半部分high part即乘积溢出到高位的那部分两者语义互补对 64 位无符号数a、ba*b的完整 128 位结果可以拆分为mulhi(a,b)高 64 位与mul(a,b)低 64 位两部分。mul的文档见 docs/commands/general-purpose/mul.md其回调通过拼接arg1*arg2的表达式字符串执行而mulhi则走一条独立的、直接操作目标变量的代码路径详见下文“源码级实现”一节。使用示例基本用法假设调试会话中已有变量$myvarmov $myvar, 0x100000000 ; 2^32 mulhi $myvar, 0x100000000 ; $myvar (2^32 * 2^32) 的高 64 位 1由于2^32 × 2^32 2^64其 128 位乘积的低 64 位为 0、高 64 位为 1因此mulhi后$myvar等于1。作为对比使用mul会得到低 64 位0。再看一个可以直接口算校验的例子mov $a, 0xFFFFFFFFFFFFFFFF ; 64 位全 1 mulhi $a, 2 ; $a (2^64 - 1) * 2 的高 64 位 1(2^64 - 1) × 2 2^65 - 2其二进制表示为...1110共 65 位有效高 64 位为1与命令输出一致。与表达式运算符的关系x64dbg 表达式语法中反引号就是高乘法运算符OperatorHiMul后缀表示其赋值形式OperatorAssignHiMul。词法解析在 src/dbg/expressionparser.cpp#L249-L254case : if(tryEatNextCh(i, )) addOperatorToken(, Token::Type::OperatorAssignHiMul); else addOperatorToken(ch, Token::Type::OperatorHiMul); break;因此你完全可以用表达式赋值语法代替mulhi命令二者在底层落到同一个运算符求值逻辑$myvar 0x100000000 ; 等价于 mulhi $myvar, 0x100000000关于表达式支持的完整运算符清单可参考 docs/introduction/Expressions.md。配合寄存器使用arg1也可以直接写寄存器mulhi edx, 0x10000 ; edx (edx * 0x10000) 的高 32 位32 位模式源码级实现原理1. 命令回调cbInstrMulhi命令的真正逻辑位于 src/dbg/commands/cmd-general-purpose.cpp#L74-L91bool cbInstrMulhi(int argc, char* argv[]) { duint value2; if(IsArgumentsLessThan(argc, 3) || !valfromstring(argv[2], value2, false)) return false; return ReadWriteVariable(argv[1], value2 { #ifdef _WIN64 unsigned __int64 res; (void)_umul128(*value, value2, res); *value res; #else //x86 *value (((unsigned long long)value2) * (*value)) 32; #endif return true; }); }关键点参数校验IsArgumentsLessThan(argc, 3)确保提供了arg1与arg2两个参数随后用valfromstring(argv[2], value2, false)把arg2解析为duint即目标平台的指针宽度整数值解析失败返回false命令报错。读改写目标变量ReadWriteVariable(argv[1], ...)对arg1执行“读旧值 → 应用 lambda → 写回”的原子化更新lambda 内的value指向目标当前值。64 位平台_WIN64调用 MSVC 内建函数_umul128源自intrin.h一次性得到 128 位无符号乘积其中高 64 位通过res输出并写回*value。这与表达式解析器中umulhi的 64 位实现src/dbg/expressionparser.cpp#L534-L539完全一致。32 位平台x86没有_umul128可用改用(unsigned long long)升位乘法后右移 32 位即*value ((unsigned long long)value2 * (*value)) 32;等价于“取 64 位乘积的高 32 位”。可见 32 位模式下mulhi实际是32 位×32 位→高 32 位语义。2. 表达式解析器中的对称实现表达式求值部分如运算符由 src/dbg/expressionparser.cpp 承载64 位umulhi调用_umul128L534-L53932 位umulhi使用((unsigned long long)x * y) 32L548-L551运算符分派OperationHiMul在operation()中按signedcalc选择有符号/无符号版本L580-L584。注意mulhi命令固定使用无符号高乘法语义_umul128/升位右移而表达式中的运算符会根据表达式上下文signedcalc选择mulhi或umulhi有符号版本_mul128见 L541-L546。3. 运算符优先级与赋值展开OperatorAssignHiMul在执行时会先映射为OperatorHiMul再求值src/dbg/expressionparser.cpp#L673-L675并与其他二元算术运算符一起在求值主循环中按操作数栈弹出求值L904-L949。这意味着运算符在表达式中的优先级、结合性与*、/、等同级算术运算符一起由 Shunting-yard 算法统一处理L520-L529 附近的中缀转后缀逻辑。关于结果变量根据 docs/commands/general-purpose/mulhi.md 的说明mulhi不会设置任何结果变量。这与 x64dbg 中部分会写$res/$result的命令不同mulhi的全部副作用就是更新arg1因此你不应依赖$res来读取乘法结果而应直接读取目标变量。典型应用场景大整数乘法分解在还原加密算法或哈希轮函数时常需要把 64 位乘法拆成“低 64 位 高 64 位”mulhi与mul组合即可获得完整 128 位乘积。定点数与缩放计算某些混淆代码用“乘高半部分”实现定点乘法或除以常数如乘2^64/N取高 64 位代替除法mulhi可直接在调试会话中复算验证。表达式脚本编写结合var/mov建立用户变量参考 docs/introduction/Variables.md在脚本中用mulhi维护中间累加变量避免手动模拟溢出位。小结mulhi为 x64dbg 的命令行与脚本环境提供了与 CPU 指令MUL/IMUL高位结果语义对齐的高乘法原语64 位构建下经由_umul128实现32 位构建下通过 64 位升位右移实现且与表达式运算符/共享同一套无符号高乘法语义。掌握它意味着你可以在调试会话中直接、精确地操作 128 位乘积的高半部分为逆向分析中的数值还原提供可靠工具。【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →