x64dbg 收藏工具菜单 AddFavouriteTool 命令:为 Favourites 菜单添加自定义工具与快捷键
【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg
导读
AddFavouriteTool是 x64dbg 调试器中用于向Favourites(收藏)菜单添加自定义外部工具的脚本/命令行指令,配合其姊妹命令AddFavouriteCommand、AddFavouriteToolShortcut以及图形界面中的 "Manage Favourite Tools" 对话框,可以把常用的外部工具、调试脚本和内部命令收纳进菜单,并绑定全局快捷键。阅读本文后,你将掌握在 x64dbg 中通过命令行为 Favourites 菜单添加工具(含%PID%、%DEBUGGEE%、%MODULE%、%-{...}-%占位符替换)、设置工具描述与快捷键、管理菜单条目的完整方法,并理解其底层存储与启动机制。
命令概览
AddFavouriteTool的完整命令原型如下:
AddFavouriteTool arg1 [arg2]其中:
arg1(必填):工具的可执行文件完整路径(例如C:\Tools\peid.exe);arg2(可选):工具的描述文字。设置后,该描述会显示在 Favourites 菜单中,替代完整的路径。
重要占位符说明:路径中可以使用%PID%特殊占位符,在工具启动前会被替换为被调试进程的 PID。这意味着你可以在同一收藏项中动态传入当前调试会话的进程 ID,例如C:\Tools\procdump.exe -accepteula -ma %PID% dump.dmp。
结果变量:该命令不设置任何结果变量,执行成功与否通过命令是否返回true(命令框不报错)来体现。
参数解析的源码实现
在 src/dbg/commands/cmd-gui.cpp 中,命令的回调函数cbInstrAddFavTool负责解析参数:
bool cbInstrAddFavTool(int argc, char* argv[]) { // filename, description if(IsArgumentsLessThan(argc, 2)) return false; if(argc == 2) GuiAddFavouriteTool(argv[1], nullptr); else GuiAddFavouriteTool(argv[1], argv[2]); return true; }可以看到:缺少arg1时命令直接返回false(失败);只传一个参数时,描述以nullptr传入;传入两个参数时,第二个参数作为描述。随后通过 GUI 桥接函数GuiAddFavouriteTool将数据传递给图形界面层。
Favourites 菜单是什么
Favourites 菜单位于 x64dbg 主界面菜单栏,是一个完全可定制的菜单。点击其中的 "Manage Favourite Tools" 菜单项会弹出管理对话框,你可以在对话框中添加自定义工具并为其分配热键。默认情况下,菜单中显示的是工具或脚本的路径;若为条目设置了描述(description),菜单将显示描述文字而非路径。该描述机制正是AddFavouriteTool的arg2参数所设置的字段。
这一机制在 docs/gui/menus/Favourites.rst 中有权威说明,同时指出该菜单支持三类条目:
| 条目类型 | 说明 | 添加方式 |
|---|---|---|
| Tool(工具) | 启动一个外部可执行程序 | GUI 对话框 /AddFavouriteTool |
| Script(脚本) | 运行 x64dbg 脚本文件 | GUI 对话框 |
| Command(命令) | 执行一条 x64dbg 内部命令 | GUI 对话框 /AddFavouriteCommand |
占位符与格式化替换
在 Favourites 菜单中,工具条目支持以下占位符替换机制(源码实现在 src/gui/Src/Gui/MainWindow.cpp 的MainWindow::clickFavouriteTool中):
| 占位符 | 替换内容 | 示例 |
|---|---|---|
%PID% | 被调试进程的十进制 PID;未调试时为 0 | %PID%→12345 |
%DEBUGGEE% | 被调试程序(debuggee)的完整路径(不加引号) | C:\malware\sample.exe |
%MODULE% | 反汇编视图中当前模块的完整路径(不加引号) | C:\malware\sample.exe |
%-????-% | 对????处的内容执行格式字符串(Formatting)展开 | %-{cip}-%→0x401000 |
对应源码中的替换逻辑:
duint PID = DbgValFromString("$pid"); toolPath.replace(QString("%PID%"), QString::number(PID), Qt::CaseInsensitive); toolPath.replace(QString("%DEBUGGEE%"), mMRUList->getEntry(0), Qt::CaseInsensitive); char modpath[MAX_MODULE_SIZE] = ""; DbgFunctions()->ModPathFromAddr(DbgValFromString("dis.sel()"), modpath, MAX_MODULE_SIZE); toolPath.replace(QString("%MODULE%"), modpath, Qt::CaseInsensitive);对于%-????-%占位符,源码使用StringFormatInline对占位符内部内容做内联格式化,例如%-{cip}-%会被替换为cip寄存器的十六进制值。格式字符串的完整语法可参考 docs/introduction/Formatting.md。
替换完成之后,x64dbg 调用CreateProcessW启动工具,并在日志中输出 "Starting tool ..." 信息(GuiAddLogMessage(tr("Starting tool %1\n")...))。
命令行实操示例
添加一个工具(带描述)
在 x64dbg 命令框输入:
AddFavouriteTool C:\Tools\ImportREC.exe Import Reconstruction执行后,Favourites 菜单中会出现名为 "Import Reconstruction" 的条目,点击即可启动C:\Tools\ImportREC.exe。
添加一个工具(不带描述)
AddFavouriteTool C:\Tools\peid.exe菜单中将直接显示完整路径C:\Tools\peid.exe。
结合占位符的动态工具
借助%PID%可以构建依赖当前进程上下文的工具调用:
AddFavouriteTool C:\Tools\procdump.exe -accepteula -ma %PID% C:\dumps\dump.dmp当调试会话中点击该收藏项时,%PID%会被替换为当前被调试进程的 PID;未处于调试状态时替换为 0。
配套命令:添加命令收藏
与工具不同,AddFavouriteCommand 用于把内部命令收藏进菜单:
AddFavouriteCommand bphws csp其第二个参数是可选快捷键。其命令处理函数cbInstrAddFavCmd位于 src/dbg/commands/cmd-gui.cpp。
配套命令:设置工具快捷键
AddFavouriteToolShortcut(别名SetFavouriteToolShortcut)用于为已存在的收藏工具设置快捷键:
SetFavouriteToolShortcut C:\Tools\peid.exe Ctrl+Alt+P其回调函数cbInstrSetFavToolShortcut位于 src/dbg/commands/cmd-gui.cpp,要求至少 3 个参数(命令名 + 工具完整路径 + 快捷键),快捷键必须与已存在的收藏工具路径精确匹配才能生效。
底层存储:Bridge 与配置键
命令到 GUI 的桥接
上述命令回调最终调用桥接层函数,实现在 src/bridge/bridgemain.cpp:
BRIDGE_IMPEXP void GuiAddFavouriteTool(const char* name, const char* description) BRIDGE_IMPEXP void GuiAddFavouriteCommand(const char* name, const char* shortcut) BRIDGE_IMPEXP void GuiSetFavouriteToolShortcut(const char* name, const char* shortcut)它们把命令参数跨线程传递给 GUI 进程,最终由 Favourites 管理对话框对应的界面类FavouriteTools(src/gui/Src/Gui/FavouriteTools.cpp)落盘存储。
配置文件键名
收藏数据持久化在 x64dbg 的配置文件中,段名为Favourite,键名采用序号后缀形式:
| 键名 | 含义 |
|---|---|
Tool1、Tool2… | 工具完整路径 |
ToolShortcut1、ToolShortcut2… | 工具快捷键 |
ToolDescription1、ToolDescription2… | 工具描述 |
Script1… | 脚本路径 |
Command1… | 收藏命令文本 |
CommandShortcut1… | 收藏命令快捷键 |
这些键由FavouriteTools对话框的确认逻辑统一写入:点击 OK 时,代码将表格内容以Tool%1、ToolShortcut%1、ToolDescription%1的格式循环写入BridgeSettingSet;同时为防残留旧数据,会从当前条目数 + 1开始将多余的旧键清空(src/gui/Src/Gui/FavouriteTools.cpp)。
菜单的动态重建
x64dbg 启动时根据这些配置键动态重建 Favourites 菜单:从序号 1 开始循环读取Tool%1/Command%1等键,为每个条目创建带star图标的QAction,通过setGlobalShortcut绑定快捷键,并同时加入 Favourites 菜单与收藏工具栏(src/gui/Src/Gui/MainWindow.cpp 附近)。
通过 GUI 对话框管理收藏
除了命令行,还可以通过图形界面完成全部管理操作:
- 点击菜单栏Favourites → Manage Favourite Tools打开管理对话框(
FavouriteTools,对应 UI 定义见 src/gui/Src/Gui/FavouriteTools.ui); - 对话框包含Tool / Script / Command三个标签页,分别管理三类收藏;
- 工具标签页支持:添加(Browse 浏览文件选择器,记住上次路径
LastToolPath)、编辑路径、删除、上移/下移调整顺序、设置描述("This string will appear in the menu.")、录制快捷键; - 快捷键录入时会与全局快捷键表冲突检查——若与已有全局快捷键重复,输入框会进入错误状态(
setErrorState(true))并拒绝保存,见 src/gui/Src/Gui/FavouriteTools.cpp。
常见问题与注意事项
%PID%仅用于工具路径:占位符替换只发生在点击 Tool 条目并启动进程时;Script 与 Command 条目不执行进程级占位符替换。%DEBUGGEE%与%MODULE%不加引号:官方文档明确指出这两者替换为不带引号的完整路径,若路径含空格需自行在收藏条目中加引号处理。- 描述覆盖路径显示:一旦设置描述(
arg2),菜单将显示描述而非路径;想要还原为路径显示,可在管理对话框中清空描述。 - 快捷键冲突:收藏条目的快捷键不得与 x64dbg 全局快捷键冲突,否则录入会被拒绝。
- 无结果变量:
AddFavouriteTool不设置$result等任何结果变量,脚本中如需判断成败可结合命令返回值处理。
总结
AddFavouriteTool是把外部工具无缝集成进 x64dbg 工作流的入口:一条命令即可把任意可执行程序(配合%PID%、%DEBUGGEE%、%MODULE%与%-{...}-%占位符实现动态参数)收藏到 Favourites 菜单,再通过AddFavouriteToolShortcut绑定快捷键,实现"一键启动分析工具"的高效工作流。其完整链路——命令解析(cmd-gui.cpp)→ 桥接转发(bridgemain.cpp)→ 配置持久化(FavouriteTools.cpp)→ 菜单重建与进程启动(MainWindow.cpp)——展示了 x64dbg 命令系统与 GUI 层协作的典型模式,也为逆向工程与恶意软件分析场景下的工具链自动化提供了标准范式。
【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考