十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

x64dbg 插件开发指南:GuiDumpAt 与 GuiDumpAtN 详解(定位 Dump 窗口显示地址)

x64dbg 插件开发指南:GuiDumpAt 与 GuiDumpAtN 详解(定位 Dump 窗口显示地址) x64dbg 插件开发指南GuiDumpAt 与 GuiDumpAtN 详解定位 Dump 窗口显示地址【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg导读GuiDumpAt是 x64dbg 桥接bridge层提供给插件开发者的一对核心 GUI 控制函数作用是将 Dump内存转储窗口的显示位置切换到指定的虚拟地址让调试器立即在该地址处展示内存内容。本文以 GuiDumpAt.md 文档为骨架深入讲解函数签名、参数语义、返回值约定并结合仓库中src/bridge/bridgemain.cpp、src/gui/Src/Bridge/Bridge.cpp与src/dbg/commands/cmd-gui.cpp的源码实现剖析其从插件调用到 GUI 刷新的完整调用链。读完本文你将掌握如何在自己的插件中让 Dump 窗口跳转到指定地址、如何精准控制第 N 个 Dump 标签页以及与之配套的dump命令背后的实现原理。一、函数总览把 Dump 窗口指到指定地址在 x64dbg 的 CPU 视图中Dump 窗口用于以十六进制字节流的形式查看任意内存区域是逆向分析与恶意软件样本分析时最常用的窗口之一。插件开发者经常需要在定位到某个数据结构、堆块或缓冲区后把 Dump 窗口同步跳转过去此时就需要调用GuiDumpAt系列函数。文档给出的核心声明如下void GuiDumpAt(duint va);va要显示的虚拟地址Virtual Address即 Dump 窗口将要跳转到的目标地址。返回值void该函数不返回任何值调用后无需检查失败标志。从 bridgemain.h 可以看到该函数以BRIDGE_IMPEXP导出属于 x64dbg 桥接层的公开 API插件在包含bridgemain.h后即可直接链接调用。与其成对出现的还有针对指定 Dump 标签页的变体 GuiDumpAtN.mdvoid GuiDumpAtN(duint va, int index);va目标虚拟地址。indexDump 窗口的索引号指定将地址应用到第几个 Dump 标签页。两者的关系是GuiDumpAt作用于当前活动的 Dump 窗口而GuiDumpAtN可以精确控制多个 Dump 标签页中的任意一个——x64dbg 允许同时打开多个 Dump 标签页分别盯住不同的内存区域GuiDumpAtN让插件可以逐一管理它们。二、参数语义与使用注意事项2.1va的取值虚拟地址而非物理地址duint是 x64dbg 定义的与目标架构字长一致的整数类型32 位构建下为 32 位64 位构建下为 64 位因此va应传入进程的虚拟地址空间中的地址例如模块基址、堆地址或表达式计算出的结果。该地址不要求一定可读——Dump 窗口只是切换到该地址进行展示是否有效取决于被调试进程的实际内存布局。2.2index的取值从 0 开始的 Dump 标签页序号在GuiDumpAtN中index对应 Dump 窗口标签页的序号。在桥接层实现中这个整型值会被转换为指针宽度后随消息传递见下文源码分析因此从插件侧传 0 表示第一个 Dump 标签页1 表示第二个依此类推。2.3 返回值无返回、无错误码两个函数均返回void这意味着调用方无法通过返回值判断地址是否合法或窗口是否存在。设计上它们是尽力而为的 GUI 指示消息桥接层只负责把请求投递给 GUI 线程地址合法性验证与展示效果由 GUI 侧处理。如果插件需要确认跳转是否成功可以配合MemIsValidReadPtr见 memory.cpp等内存查询接口先行校验。三、源码级剖析一条消息走完的完整调用链3.1 桥接层_gui_sendmessage投递 GUI 消息在 bridgemain.cpp 中GuiDumpAt的实现极为简洁BRIDGE_IMPEXP void GuiDumpAt(duint va) { _gui_sendmessage(GUI_DUMP_AT, (void*)va, 0); }而 GuiDumpAtN 则是BRIDGE_IMPEXP void GuiDumpAtN(duint va, int index) { _gui_sendmessage(GUI_DUMP_AT_N, (void*)va, (void*)(duint)index); }可以看到二者都通过_gui_sendmessage将请求封装为一条 GUI 消息va作为param1index作为param2原样传递。这种桥接消息机制是 x64dbg 的核心架构——调试器核心dbg 模块与 GUIgui 模块运行在不同的上下文中所有跨模块交互都通过 bridgemain.h 定义的消息常量与_gui_sendmessage完成从而保证线程安全与解耦。从代码结构可以推断GuiDumpAt的消息GUI_DUMP_AT只携带一个参数GUI 侧收到后自然作用于当前活动的 Dump 窗口而GUI_DUMP_AT_N携带两个参数可精确定位到某个 Dump 标签页。3.2 GUI 侧Bridge 对象转发为 Qt 信号GUI 进程中的消息分发位于 Bridge.cppcase GUI_DUMP_AT: emit dumpAt((dsint)param1); break;以及case GUI_DUMP_AT_N: emit dumpAtN((duint)param1, (int)(duint)param2); break;对应源码位置见 Bridge.cpp 与 Bridge.cpp。GUI 侧把桥接消息进一步转换为 Qt 信号dumpAt/dumpAtN由 CPU 视图中的 Dump 控件槽函数接收最终调用底层的数据模型与视图刷新逻辑将 Dump 窗口滚动到va地址并重新渲染字节内容。这印证了文档中show the dump at this address在该地址展示 Dump的描述整条链路是插件/命令 → 桥接消息 → Qt 信号 → Dump 控件刷新的单向请求流。3.3 命令层内置dump命令如何调用它们GuiDumpAt系列不仅服务插件也被 x64dbg 自身的命令系统复用。在 cmd-gui.cpp 中dump命令的实现展示了两个函数的分工bool cbDebugDump(int argc, char* argv[]) { if(IsArgumentsLessThan(argc, 2)) return false; duint addr 0; if(!valfromstring(argv[1], addr)) { dprintf(QT_TRANSLATE_NOOP(DBG, Invalid address \%s\!\n), argv[1]); return false; } if(argc 2) { duint index 0; if(!valfromstring(argv[2], index)) { dprintf(QT_TRANSLATE_NOOP(DBG, Invalid address \%s\!\n), argv[2]); return false; } GuiDumpAtN(addr, int(index)); } else { ACTIVEVIEW activeView; GuiGetActiveView(activeView); int dumpIndex; if(sscanf_s(activeView.title, Dump %d, dumpIndex) 1) GuiDumpAtN(addr, dumpIndex); else GuiDumpAt(addr); } GuiShowCpu(); GuiFocusView(GUI_DUMP); return true; }这段代码完整展示了命令dump addr [index]的分流逻辑参数解析第一个参数必须是可被valfromstring解析的表达式支持寄存器、变量、算术表达式等详见 表达式文档解析失败会输出 Invalid address 并返回false。显式指定索引若提供了第二个参数argc 2则调用GuiDumpAtN(addr, index)跳转到指定序号index的 Dump 标签页。智能推断当前 Dump若未提供索引命令会通过GuiGetActiveView获取当前活动视图尝试从其标题解析出Dump %d形式的序号——如果当前活动视图恰好是某个 Dump 标签页就对该标签页调用GuiDumpAtN保持就地切换否则退化为调用GuiDumpAt作用于活动 Dump 窗口。收尾动作GuiShowCpu()确保 CPU 视图可见GuiFocusView(GUI_DUMP)把焦点交给 Dump 窗口让用户立即看到切换结果。这个实现为插件开发者提供了很好的参考范式优先用GuiDumpAtN精确控制目标标签页仅在无法确定索引时使用GuiDumpAt。同时它也说明插件完全可以通过组合GuiGetActiveView、GuiShowCpu、GuiFocusView等桥接 API 复刻命令行的完整交互体验。四、典型插件应用场景4.1 场景一点击反汇编行跳转 Dump插件可以监听反汇编视图的选中事件当用户选中一条指令时若操作数是内存引用插件解析出目标地址后调用GuiDumpAt(addr)让 Dump 窗口立刻跟随显示该操作数指向的内存实现点击即转储的联动体验。4.2 场景二多标签页分工监视在分析堆内存或跟踪多个缓冲区时插件可预先打开多个 Dump 标签页然后针对每个标签页调用GuiDumpAtN(va, i)例如GuiDumpAtN(heapBase, 0)显示堆头、GuiDumpAtN(buf1, 1)显示输入缓冲、GuiDumpAtN(buf2, 2)显示输出缓冲形成固定的多路监视面板。4.3 场景三自定义命令包装插件注册自己的命令时可以在解析完表达式后直接复用GuiDumpAt例如实现一个mydump expr命令先通过内存有效性检查再跳转比直接调用内置dump多一层防护。需要注意的是valfromstring等表达式解析函数位于 dbg 模块value.cpp插件需按 插件 API 文档 的规范正确初始化后才能调用。五、与相关函数的配合使用在 x64dbg 的 GUI 桥接 API 家族中GuiDumpAt不是孤立存在的它与以下函数经常协同工作GuiDumpAtN定位到第 N 个 Dump 标签页本文已详述。GuiShowCpu / GuiFocusView让 CPU 视图含 Dump 子窗口可见并获得焦点保证跳转结果被用户看到。GuiGetActiveView查询当前活动视图及其标题用于判断当前位于哪个 Dump 标签页dump命令正是利用它做智能分流。GuiSelectionSet / GuiSelectionGet读写各视图的选中范围配合GuiDumpAt可以做到选中即跳转。需要特别强调的是GuiDumpAt与 Dump 窗口中跟随follow操作的区别前者是编程式跳转由插件或命令主动发起而窗口内部的跟随、同步滚动等行为由 GUI 自身逻辑维护。插件若需要实现持续的地址联动应在合适的时机重复调用GuiDumpAt例如响应调试事件回调而非依赖 GUI 的自动同步。六、小结维度GuiDumpAtGuiDumpAtN声明void GuiDumpAt(duint va)void GuiDumpAtN(duint va, int index)作用目标当前活动 Dump 窗口指定序号index的 Dump 标签页返回无无桥接消息GUI_DUMP_ATGUI_DUMP_AT_N典型调用方插件、dump命令无索引分支插件、dump命令显式索引分支GuiDumpAt系列是 x64dbg 插件体系中最常用也最直观的 GUI 控制入口之一插件只需一行调用即可把 Dump 窗口引导到任意虚拟地址而桥接层bridgemain.cpp、GUI 信号层Bridge.cpp与命令层cmd-gui.cpp的三级实现又为理解 x64dbg dbg 与 GUI 分离、消息驱动的架构提供了一个绝佳的入门样例。在自己的插件中建议遵循dump命令的成熟模式能确定 Dump 索引就用GuiDumpAtN否则退化为GuiDumpAt再配合GuiShowCpu与GuiFocusView完善交互闭环。【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表