Cutter 快捷键完全指南:从默认按键到反汇编、图形与调试工作流
【免费下载链接】cutterFree and Open Source Reverse Engineering Platform powered by rizin项目地址: https://gitcode.com/gh_mirrors/cu/cutter
本篇指南以 Cutter 官方用户文档 shortcuts.rst 为核心骨架,结合仓库中 DefaultShortcuts.cpp 的完整快捷键注册表与 ShortcutManager 的实现细节,系统梳理 Cutter 的全部默认快捷键。读完本文,你将掌握全局导航、各 Widget 呼出、反汇编/图形视图编辑、以及调试会话控制的全套键盘操作,并能理解这些快捷键在源码中的注册机制与自定义方式。
快捷键的底层机制:ShortcutManager 与 DefaultShortcuts
Cutter 的快捷键并非散落在各个 UI 文件中的魔法键位,而是由一套集中的注册表统一管理。所有默认快捷键都定义在 DefaultShortcuts.cpp 中,以QHash<QString, Shortcut>的形式存在,每个条目包含:
- ID 标识:如
Disassembly.defineFunction、Debug.toggleBreakpoint,采用“类别.动作”的命名规范; - 键位序列:
QList<QKeySequence>,一个动作可绑定多个键位; - 描述文本与上下文:用于 UI 展示与翻译(通过
QT_TRANSLATE_NOOP标记,见 DefaultShortcuts.h 中的Shortcut结构体)。
运行时,各 Widget 通过单例 ShortcutManager(Shortcuts()宏)统一取键位并创建动作。例如Shortcuts()->makeAction("Debug.start", this)会一次性完成QAction的快捷键设置与文本翻译(见 DebugActions.cpp),makeQShortcut则用于直接挂在某个 Widget 上的QShortcut(如 DisassemblerGraphView.cpp 中的Graph.takeTrue等)。
值得注意的实现细节是:ShortcutManager::getKeySequences会优先检查用户自定义键位(getCustomKeySequences),为空时才回落到默认注册表。从 ShortcutManager.cpp 的注释可见,自定义快捷键的持久化支持当前尚未实现,因此本文以下表格均以默认键位为准。
全局快捷键:贯穿整个界面的通用操作
以下全局快捷键在任何工作区下都生效,对应 DefaultShortcuts.cpp 中General.、Console.、Omnibar.等前缀的条目:
| 快捷键 | 功能 | 源码 ID |
|---|---|---|
.(句点) | 聚焦控制台输入框 | Console.focusConsole |
G/S | 聚焦搜索栏 | General.seek/General.showFilter |
Ctrl/Cmd+R | 刷新当前内容 | General.refreshContents |
General.refreshContents在主窗口中被显式绑定到“刷新”动作(见 MainWindow.cpp)。搜索栏相关快捷键由Search.前缀补充,例如Ctrl/Cmd+F呼出/隐藏搜索栏(Search.toggle)、Enter查找下一个、Shift+Enter查找上一个、Ctrl/Cmd+Enter跳到最后一项、Ctrl/Cmd+O打开搜索选项菜单(见 DefaultShortcuts.cpp)。
此外,General.类别还提供了不少文档表格未列出的实用键位:
| 快捷键 | 功能 | 源码 ID |
|---|---|---|
$ | 跳转到当前函数末尾 | General.seekToFunctionEnd |
^ | 跳转到当前函数开头 | General.seekToFunctionStart |
Ctrl/Cmd+Z / Shift+Ctrl/Cmd+Z | 撤销/重做 Seek(Back/Forward) | General.back/General.forward |
Esc | 清除过滤器 | General.clearFilter |
Widget 快捷键:快速呼出各信息窗口
Cutter 的字符串、导入导出、图形、控制台等面板均支持一键呼出(Toggle),对应源码中的Strings.toggle、Graph.toggle、Imports.toggle、Exports.toggle、Console.toggle:
| 快捷键 | 功能 |
|---|---|
Shift+F12 | 呼出/隐藏 Strings(字符串)窗口 |
Shift+G | 呼出/隐藏 Graph(图形)窗口 |
Shift+I | 呼出/隐藏 Imports(导入)窗口 |
Shift+E | 呼出/隐藏 Exports(导出)窗口 |
Ctrl+\`` 或:` | 呼出/隐藏 Console(控制台)窗口 |
这些 Toggle 动作由各 Widget 自行注册:例如 StringsWidget.cpp 与 ImportsWidget.cpp 中的makeQShortcut("Strings.toggle" / "Imports.toggle", main)、GraphWidget.cpp 中的Graph.toggle、ExportsWidget.cpp 中的Exports.toggle。控制台除切换外还有独立的辅助键:Ctrl/Cmd+L清空输出、↑/↓翻历史、Tab自动补全、Esc清空输入(Console.前缀,见 ConsoleWidget.cpp)。
反汇编视图快捷键:静态分析的核心操作
原文档强调:反汇编视图的大部分快捷键同样适用于反汇编图形视图(Disassembly Graph view)。完整键位表如下:
| 快捷键 | 功能 |
|---|---|
Esc | Seek 到上一个位置 |
Space | 切换到反汇编图形视图 |
Ctrl/Cmd+C | 复制 |
; | 添加注释 |
P | 在当前地址定义新函数 |
Shift+P | 编辑函数 |
U | 取消定义函数 |
N | 重命名当前函数/标志 |
Shift+N | 重命名此处引用的标志/函数 |
Y | 编辑/重命名局部变量 |
A | 将当前地址设为字符串 |
C | 将当前地址设为代码 |
X | 显示交叉引用(Xrefs) |
Ctrl/Cmd++ | 放大 |
Ctrl/Cmd+- | 缩小 |
Ctrl/Cmd+= | 重置缩放 |
上述动作在 DisassemblyContextMenu.cpp 中通过initShortcutAction(&action..., "Disassembly.xxx", ...)批量接入右键菜单,是反汇编行右键菜单(详见 disassembly-context-menu.rst)与键盘操作共用的一套动作体系。以 DefaultShortcuts.cpp 的Disassembly.类别为准,还可补充以下高频键位:
| 快捷键 | 功能 | 源码 ID |
|---|---|---|
Ctrl/Cmd+Alt+C | 复制指令字节 | Disassembly.copyInstructionBytes |
Shift+X | 查看局部变量的 Xrefs | Disassembly.XRefsForVariables |
G | 修改/添加全局变量 | Disassembly.globalVariable |
Shift+A | 以高级(Advanced)方式设为字符串 | Disassembly.setAsStringAdvanced |
* | 以高级方式设为数据 | Disassembly.setToDataEx |
D | 切换为数据(Switch Data) | Disassembly.setToData |
H/J/K/L | 光标左/下/上/右移动 | Disassembly.moveLeft/Down/Up/Right |
Ctrl/Cmd+Alt+C | 复制指令字节 | Disassembly.copyInstructionBytes |
代码定位同样重要:Esc用于返回上一个 seek 位置(General.seekPrev,见 DecompilerWidget.cpp),而撤销/重做 seek 对应Ctrl/Cmd+Z与Ctrl/Cmd+Shift+Z。
图形视图快捷键:以键盘驱动图漫游
图形视图(Disassembly Graph View)除了共享上文多数快捷键外,还有一套针对控制流图的专属导航键位(源码前缀Graph.,见 DefaultShortcuts.cpp):
| 快捷键 | 功能 |
|---|---|
Esc | Seek 到上一个位置 |
Space | 切换回反汇编视图 |
Ctrl/Cmd+鼠标滚轮 | 缩放 |
+ | 放大 |
- | 缩小 |
= | 重置缩放 |
J | 下一条指令 |
K | 上一条指令 |
T | 沿真分支/无条件分支前进 |
F | 沿假分支/无条件分支前进 |
J/K/T/F四个键是图漫游的灵魂:J、K沿当前基本块内逐条移动指令,T、F则直接跳入对应的分支目标块。它们的实现位于 DisassemblerGraphView.cpp,通过Graph.takeTrue、Graph.takeFalse、Graph.nextInstr、Graph.prevInstr四个 QShortcut 挂载。图形视图的功能细节可进一步参考 graph-widget-context-menu.rst。
调试快捷键:断点与单步控制
调试会话相关的快捷键由DebugActions统一注册(源码前缀Debug.,见 DefaultShortcuts.cpp),主键位如下:
| 快捷键 | 功能 |
|---|---|
F9 | 开始调试 |
F7 | 单步步入(Step into) |
F8 | 单步步过(Step over) |
F5 | 继续执行(Continue) |
F2或Ctrl/Cmd+B | 添加/移除断点 |
Ctrl/Cmd+F2 | 编辑或打开高级断点对话框 |
断点相关操作进一步对应 BreakpointsDialog 与 BreakpointWidget 中的动作,且与文档 breakpoints-widget-context-menu.rst 描述的右键菜单联动。调试工具栏的更多功能(如 Continue until Main/Call/Syscall)可参考 debug-buttons-toolbar.rst。此外Debug.类别还包含一些扩展键位:
| 快捷键 | 功能 | 源码 ID |
|---|---|---|
Ctrl/Cmd+F5 | 反向继续(Continue backwards) | Debug.continueBack |
Ctrl/Cmd+F7 | 反向单步(Step backwards) | Debug.stepBack |
Ctrl/Cmd+F8 | 单步跳出(Step out) | Debug.stepOut |
扩展键位速查:其他类别的默认快捷键
除了上述文档重点覆盖的四大类别,Cutter 的注册表还内置了大量未收录进shortcuts.rst的默认键位。借助偏好设置中的快捷键面板(见下文)可以随时查阅,这里列出部分高频条目:
- Hex 视图:
Ctrl/Cmd+C复制(Hex.copy)、N在地址处添加标志(Hex.addFlag)、M添加标记(Hex.addMark); - Types 类型管理:
Shift+D删除、Shift+E编辑、Shift+X导出、Shift+L加载、Shift+R重命名、Shift+U显示用法、Enter/Shift+V查看(Types.前缀,见 DefaultShortcuts.cpp); - Omnibar 地址栏:
Esc清空、Ctrl/Cmd+Enter显示更多补全、Ctrl/Cmd+Shift+Enter显示全部补全(Omnibar.前缀); - 图形总览(Overview):
+放大、-缩小; - Docking 停靠:
Alt启用/禁用停靠(Docking.toggle)。
在界面中查看与管理快捷键
所有快捷键都会在**偏好设置 → Shortcuts(快捷键)**页面中集中展示。其实现是 ShortcutOptionsWidget:
- 以树形结构按类别(General、Disassembly、Decompiler、Strings、Graph、Breakpoint、Console、Hex、Debug、Functions、Omnibar、Exports、Imports、Graph Overview、Docking)分组展示,每一行包含Command(命令)、Shortcut(快捷键)、Description(描述)三列;
- 顶部提供过滤器输入框,按命令名、快捷键或描述实时过滤,便于快速定位某个键位(
filterShortcutTree实现); - 树默认按命令名升序排列并全部展开。
从 ShortcutOptionsWidget.cpp 的实现可以看到,面板数据来自Shortcuts()->getAllShortcuts(),即遍历默认注册表并读取每个 ID 的键位序列;若有多个键位则用逗号分隔显示。偏好设置整体入口参见 preferences.rst。
小结
Cutter 的快捷键体系以 DefaultShortcuts.cpp 的集中注册表为数据源,经 ShortcutManager 单例分发给各 Widget 与菜单动作,最终在偏好设置面板中可视化呈现。掌握G/S全局搜索、Space视图切换、P/U/N函数与标志操作、T/F/J/K图漫游、以及F5/F7/F8/F9/F2调试控制这组核心键位,即可在不触碰鼠标的情况下完成从定位、分析到调试的完整逆向工作流。随着版本演进,部分键位可能在偏好设置面板中调整,建议以面板中实时展示的内容为准。
【免费下载链接】cutterFree and Open Source Reverse Engineering Platform powered by rizin项目地址: https://gitcode.com/gh_mirrors/cu/cutter
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考