
x64dbgdisasm/dis/d命令详解在指定地址执行反汇编与 CPU 视图导航【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg导读disasm别名dis、d是 x64dbg 调试器中用于在指定地址处反汇编的 GUI 控制命令其核心作用是把 CPU 视图的反汇编面板导航到目标地址并高亮对应指令。本文以官方命令文档为基础结合 x64dbg 仓库源码cmd-gui.cpp、debugger.cpp、disasm_fast.cpp深入讲解其语法、参数解析规则、底层调用链与实战用法帮助读者在命令行、脚本与插件场景中精准控制反汇编视图位置。命令概览disasm隶属于 x64dbg 的 GUI 控制命令组与该组其他命令如dump、sdump、graph等一同管理调试器界面的视图行为参见 docs/commands/gui/index.rst。项目说明命令名disasm别名dis、d参数[arg1]要反汇编的地址可选结果变量无本命令不设置任何结果变量三个名称由同一注册语句提供。在 src/dbg/x64dbg.cpp 中可以找到该命令的注册记录dbgcmdnew(disasm,dis,d, cbDebugDisasm, true); //doDisasm其中true表示该命令需要调试器处于调试会话已激活的状态与dump、graph等 GUI 命令一致。由于它注册在调试引擎dbg一侧无论你是通过 GUI 命令栏、脚本script还是插件 API 触发最终都会走同一条执行路径。语法与参数说明基本语法disasm [arg1] dis [arg1] d [arg1]参数[arg1]目标地址省略时默认在 CIP当前指令指针处反汇编。CIP 在 x64 平台对应 RIP、在 x86 平台对应 EIP是架构无关的寄存器别名参见 docs/introduction/Values.md 中的寄存器说明。指定时在参数给出的地址处反汇编。参数地址不仅支持裸十六进制数字还支持 x64dbg 的完整表达式语法参见 docs/introduction/Expressions.md 与 docs/introduction/Values.md十六进制数字默认d 401000等价于d 0x401000十进制需加点前缀如d .4198400寄存器d eax、d rsp、d cip直接使用当前寄存器值模块基址与导出符号d ntdll.dll模块基址、d ntdll.dll:ZwContinue导出函数地址、d ntdll:1D按序号解析导出模块 RVA/文件偏移d ntdll.dll:$1000模块基址 RVA 0x1000、d ntdll.dll:#400把文件偏移 0x400 换算成 VA模块入口点d ntdll.dll:entry或:oep、:ep直接跳转到模块入口标签与符号用户自定义标签、符号名会解析为对应地址内存解引用d [rsp]、d qword:[rsp8]等表达式形式同样有效。这些地址解析动作最终由valfromstring完成见下文源码分析因此任何在命令栏可计算的表达式都可以直接作为disasm的参数。源码级实现解析1. 命令回调地址解析与视图切换命令的实际处理函数是 cmd-gui.cpp 中的cbDebugDisasmbool cbDebugDisasm(int argc, char* argv[]) { duint addr 0; if(argc 1) { if(!valfromstring(argv[1], addr)) addr GetContextDataEx(hActiveThread, UE_CIP); } else { addr GetContextDataEx(hActiveThread, UE_CIP); } DebugUpdateGui(addr, false); GuiShowCpu(); GuiFocusView(GUI_DISASSEMBLY); return true; }实现要点参数解析当传入参数时调用valfromstring将表达式字符串解析为地址值一旦解析失败非法表达式会回退到 CIP而不是报错中断。这与dump命令的行为不同——dump对非法地址会直接输出Invalid address错误见 cmd-gui.cpp。CIP 取值通过GetContextDataEx(hActiveThread, UE_CIP)读取当前活动线程的指令指针上下文。视图控制GuiShowCpu()确保 CPU 视图可见GuiFocusView(GUI_DISASSEMBLY)将焦点置于反汇编面板。这意味着即使当前在内存转储、栈视图或其他窗口执行disasm后界面都会切回 CPU 反汇编视图。2. GUI 更新管线DebugUpdateGuicbDebugDisasm调用的核心是 debugger.cpp 中的DebugUpdateGui(addr, false)第二个参数false表示不需要同步更新栈视图。该函数是 x64dbg 内部统一的反汇编导航入口主要做了几件事GUI 更新开关兼容若用户通过guiupdatedisable命令关闭了 GUI 更新GuiIsUpdateDisabled()为真导航地址会被暂存之后调用guiupdateenable或再次以地址 0 调用时会把暂存的隐藏地址补发出去。这也是该函数允许传入 0 的原因——0 表示使用上次隐藏的调用。内存映射检查若目标地址或 CIP 当前不在有效内存映射中MemIsValidReadPtr失败会强制MemUpdateMap()刷新内存映射保证后续读取与反汇编基于最新映射。源码模式联动开启源码调试bEnableSourceDebugging时若能从符号信息解析出 CIP 对应的源码行SymGetSourceLine会同时加载并定位源码视图。界面刷新向 GUI 发送GuiDisasmAt(disasm_addr, cip)后还会联动刷新寄存器视图、反汇编视图、线程视图与侧边栏并更新窗口标题。3. 桥接消息与前端渲染GuiDisasmAt定义在 bridgemain.cpp本质是一条跨进程/跨模块的桥接消息BRIDGE_IMPEXP void GuiDisasmAt(duint addr, duint cip) { _gui_sendmessage(GUI_DISASSEMBLE_AT, (void*)addr, (void*)cip); }GUI 前端在 Bridge.cpp 中处理该消息并发出 Qt 信号disassembleAt最终由反汇编视图的Disassembly::disassembleAtDisassembly.cpp完成渲染校验地址可读 → 设置内存页与编码映射 → 调整表格行数 → 单条选中目标指令并展开选区 → 维护 VA 历史便于后退/前进导航→ 将视图滚动到合适位置。这正是执行命令后目标地址那条指令被高亮、且尽量保持在可视区域内的原因。4. 底层反汇编引擎虽然disasm命令本身只负责导航但 x64dbg 的反汇编能力由底层反汇编管线提供disasmfastdisasm_fast.cpp从目标地址读取最多 64 字节缓存调用 Zydis 引擎完成单条指令解码并填充指令文本、大小、分支类型等BASIC_INSTRUCTION_INFO信息。如果解码失败不可读或非法指令指令文本会显示为???。该管线同时被断点视图、信息框、图视图、Trace 记录加载器如 TraceFileReader.cpp等大量组件复用。实战用法场景一跳转到当前指令指针无参数直接执行反汇编视图定位到当前正在执行的指令disasm等价于d cip常用于调试中断后快速确认执行位置。场景二跳转到指定绝对地址disasm 0x401000 d 401000 // 十六进制默认两种写法等价 d .4198400 // 十进制写法场景三基于寄存器与栈的导航d eax // 跳转到 EAX 指向的代码 d [rsp] // 解引用栈顶查看返回地址处代码 d qword:[rsp8]场景四模块与符号定位d ntdll.dll:ZwContinue // 按导出符号定位 d ntdll:1D // 按导出序号定位 d ntdll.dll:entry // 模块入口点 d module // 当前选中模块基址module 关键字场景五脚本中的视图导航disasm不设置结果变量因此适合作为纯导航命令嵌入脚本例如在脚本中沿调用栈回溯后逐一查看各返回地址处的代码或在trace回放中配合使用。由于它无副作用、只切换视图焦点也常用于自动化测试脚本中把界面驱动到期望位置。关联能力与注意事项关联命令dump/sdump分别把内存转储视图、栈视图导航到指定地址与disasm同属 GUI 导航命令族参见 dump.md 与 sdump.mdgraph基于当前函数生成图形视图常与disasm配合使用参见 graph.mdguiupdateenable/guiupdatedisable控制 GUI 自动更新开关关闭期间执行disasm只会暂存地址参见 guiupdateenable.md 与 guiupdatedisable.md格式化函数{disasm}在日志或条件断点消息中把地址渲染为指令文本解码失败显示???实现位于 formatfunctions.cpp与命令共享同一套反汇编底层。注意事项无结果变量disasm不会像算术命令那样写入$result之类的变量不能依赖其返回值做条件判断视图强切换命令执行后会把界面强制切到 CPU 反汇编视图并获取焦点在自动化脚本中需注意这一界面副作用需要调试会话命令注册时要求调试器处于活动状态注册标志为true未附加/未加载调试目标时不可用无效表达式回退传入无法解析的参数会静默回退到 CIP而不是报错脚本中若需严格校验地址应自行先解析。总结disasm/dis/d是 x64dbg 中最常用的 GUI 导航命令之一语法简单但能力完整省略参数时定位 CIP传入参数时借助完整表达式系统支持寄存器、模块、符号、RVA 等多种地址形式。其背后是一条清晰可查的实现链路——cbDebugDisasmcmd-gui.cpp解析地址 →DebugUpdateGuidebugger.cpp更新调试状态 →GuiDisasmAtbridgemain.cpp桥接消息 → GUI 反汇编视图渲染Disassembly.cpp底层由 Zydis 驱动的disasmfastdisasm_fast.cpp支撑。理解这条链路有助于在命令行、脚本与插件开发中更精准地控制反汇编视图也是阅读其他 GUI 命令dump、graph等实现的良好起点。【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考