资讯动态

x64dbg 桥接 API 解析:GuiScriptSetInfoLine 如何向脚本视图写入 Info 信息行

发布时间:2026/9/20 0:46:22 来源:尧图企业网站定制
逆向工程调试器开发工具应用安全【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址https://gitcode.com/gh_mirrors/x6/x64dbg点击查看免费下载x64dbgAn open-source user mode debugger for Windows专注于逆向工程与恶意软件分析通过一套桥接bridge机制将调试核心src/dbg与 Qt 图形界面src/gui解耦。GuiScriptSetInfoLine正是这套桥接 API 中面向**脚本视图Script View**的一组调用之一其作用是把一段文本写入脚本视图指定行的 Info 列。本文以该函数为主线结合桥接层的完整调用链讲解其参数语义、底层实现与典型使用场景帮助插件开发者与脚本引擎维护者准确使用这一 API。函数签名与基本语义GuiScriptSetInfoLine的声明位于桥接头文件 src/bridge/bridgemain.h属于BRIDGE_IMPEXP导出的 GUI 桥接函数族BRIDGE_IMPEXP void GuiScriptSetInfoLine(int line, const char* info);其语义非常直观将脚本视图中第line行的 Info 列内容设置为字符串info。x64dbg 的脚本视图ScriptView是一个三列表格各列含义在 ScriptView.cpp 的构造代码中有明确定义addColumnAt(8 charwidth * 4, tr(Line), false); // 列 0行号 addColumnAt(8 charwidth * 60, tr(Text), false); // 列 1脚本代码文本 addColumnAt(8 charwidth * 40, tr(Info), false); // 列 2信息列也就是说GuiScriptSetInfoLine最终更新的正是第 2 列Info 列的内容——该列通常用于显示脚本执行过程中的附加提示信息。参数说明line—— 目标行号基于 1 的行号类型int含义脚本视图中要写入 Info 信息的目标行号。注意行号基准该参数使用从 1 开始的行号与 GUI 侧内部使用的 0 基索引相差 1。从 GUI 端实现 ScriptView.cpp 可以看到这一点void ScriptView::setInfoLine(int line, QString info) { setCellContent(line - 1, 2, info); reloadData(); //repaint }setCellContent接收的是 0 基行号与列号因此传入line后会先执行line - 1再做写入。同理调试器侧在调用时也遵循 1 基行号约定见下文脚本日志实现。info—— 要写入的文本内容类型const char*含义要显示在 Info 列的文本字符串通常为 UTF-8 编码。桥接层会将该 C 字符串转换为QString再交给 GUI见 Bridge.cpp因此字符串的编码一致性推荐 UTF-8是保证中文等非 ASCII 文本正确显示的前提。返回值该函数没有返回值返回类型为void。信息写入是发后即忘式的异步投递——调用方无需也不能依赖返回值判断写入是否成功。底层调用链一次完整的桥接往返GuiScriptSetInfoLine的完整实现横跨调试器核心、桥接层与 GUI 三个模块理解这条链路有助于排查插件中调用无效的问题。第一步调试器侧发起消息src/dbg→ bridge函数本体定义在 src/bridge/bridgemain.cppBRIDGE_IMPEXP void GuiScriptSetInfoLine(int line, const char* info) { _gui_sendmessage(GUI_SCRIPT_SETINFOLINE, (void*)(duint)line, (void*)info); }它并不直接操作任何 UI而是把参数打包进消息GUI_SCRIPT_SETINFOLINE并交给_gui_sendmessage投递。该消息在两个方向上都有正式的类型声明桥接头文件 bridgemain.h 中的消息宏表msg(GUI_SCRIPT_SETINFOLINE, int line, const char* info) \头文件同时导出的函数声明bridgemain.h。第二步GUI 侧接收消息并派发bridge → Qt 信号桥接 DLL 在 GUI 进程中的消息分发器 src/gui/Src/Bridge/Bridge.cpp 处理该消息case GUI_SCRIPT_SETINFOLINE: emit scriptSetInfoLine((int)(duint)param1, QString((const char*)param2)); break;消息参数在此处完成类型还原line从duint转回intinfo从const char*构造为QString然后以 Qt 信号scriptSetInfoLine(int, QString)发射信号声明见 Bridge.h。第三步ScriptView 槽函数落盘到表格Qt 信号 → UIScriptView在构造函数中通过connect将信号绑定到自身槽函数见 ScriptView.cppconnect(Bridge::getBridge(), SIGNAL(scriptSetInfoLine(int, QString)), this, SLOT(setInfoLine(int, QString)));槽函数setInfoLineScriptView.cpp如前所述把内容写入(line - 1, 2)单元格并触发reloadData()重绘。至此一次从调试器核心到界面表格的完整信息写入完成。典型使用场景脚本日志输出仓库中对GuiScriptSetInfoLine最直接的实际调用位于脚本引擎 src/dbg/simplescript.cppvoid ScriptLogLocked(const char* msg) { if(!bScriptLogEnabled) return; GuiScriptSetInfoLine(scriptIpOld, msg); }这是 x64dbg 内建脚本引擎的日志输出逻辑当脚本日志开关bScriptLogEnabled开启时把要记录的文本写入当前指令指针所在行scriptIpOld的 Info 列。也就是说脚本执行到哪一行该行的 Info 列就会随之更新为最新日志——这正是调试脚本时最常见的可视化反馈方式。值得注意的是scriptIpOld与GuiScriptSetIpsimplescript.cpp 等处调用所维护的scriptIp是同一套 1 基行号体系与桥接 API 的行号约定完全一致二者配合即可实现移动指针 行内提示的联动效果。使用示例以插件开发场景为例假设插件加载了一个外部脚本文件希望在脚本执行到第 10 行时在该行 Info 列显示一段提示#include bridgemain.h // 在脚本执行回调中调用 void OnScriptStep() { // 在第 10 行的 Info 列写入提示文本 GuiScriptSetInfoLine(10, Current line executed by plugin callback); // 也可以配合行指针移动使用 GuiScriptSetIp(10); // 若执行出错可用 GuiScriptError 弹出错误对话框 // GuiScriptError(10, Something went wrong at line 10); }结合上述桥接链路该调用会依次完成bridgemain.cpp打包消息 →Bridge.cpp分发 →ScriptView::setInfoLine写入第 10 行内部line - 1 9的 Info 列并重绘。与同族桥接函数的关系GuiScriptSetInfoLine隶属于一组完整的脚本控制桥接 API它们共同覆盖脚本视图的增删改查与交互全部声明集中在 bridgemain.h函数作用GuiScriptAdd(int count, const char** lines)向脚本视图批量追加代码行GuiScriptClear()清空脚本视图GuiScriptSetIp(int line)设置/移动当前执行指针IPGuiScriptError(int line, const char* message)在指定行触发错误弹窗GuiScriptSetTitle(const char* title)设置脚本视图窗口标题GuiScriptSetInfoLine(int line, const char* info)向指定行 Info 列写入文本本文主题GuiScriptMessage(const char* message)弹出一条普通消息GuiScriptMsgyn(const char* message)弹出 Yes/No 询问并返回用户选择GuiScriptEnableHighlighting(bool enable)开关脚本语法高亮它们通过消息宏表bridgemain.h逐一映射到GUI_SCRIPT_*消息并由Bridge.cpp中的case GUI_SCRIPT_*分支统一派发。想要完整定制脚本视图行为的开发者可将本函数与上述同族 API 组合使用。实践要点总结行号是 1 基的传入的line从 1 开始计数GUI 内部会自动-1转为 0 基索引传入 0 或超出脚本行数范围的行号不会产生有效写入但函数本身不会报错。写入目标是 Info 列更新的是 ScriptView 三列布局中的第 2 列Info与代码文本列Text互不影响适合存放运行提示、日志摘要等附加信息。异步投递、无返回值函数为void消息经桥接层异步送达 GUI不要依赖返回值也不要在同一线程内假设 UI 已立即完成重绘。编码建议info参数建议使用 UTF-8 编码桥接层会将其转换为QString非 UTF-8 文本可能出现乱码。源码研读入口完整的实现与调用证据可依次查阅 bridgemain.cpp消息封装、Bridge.cpp消息分发、ScriptView.cppUI 落盘以及 simplescript.cpp脚本日志的实际调用官方 API 文档页见 GuiScriptSetInfoLine.md。赞分享逆向工程调试器开发工具应用安全【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址https://gitcode.com/gh_mirrors/x6/x64dbg点击查看免费下载相关推荐x64dbg 插件开发指南GuiScriptSetTitle 详解——为脚本视图设置窗口标题的桥接 APIx64dbg 插件开发指南GuiScriptSetTitle 详解——为脚本视图设置窗口标题的桥接 API GuiScriptSetTitle 是 x64db逆向工程调试器开发工具应用安全x64dbg 桥接 API 解析GuiUpdateDumpView 函数与 Dump 视图刷新机制x64dbg 桥接 API 解析GuiUpdateDumpView 函数与 Dump 视图刷新机制 本文以 GuiUpdateDumpView 官方 API逆向工程调试器开发工具应用安全x64dbg BridgeSettingSet 详解向调试器设置库写入配置的桥接 API 实战指南x64dbg BridgeSettingSet 详解向调试器设置库写入配置的桥接 API 实战指南 导读 BridgeSettingSet 是 x64dbg逆向工程调试器开发工具应用安全创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价