Cutter 菜单栏全解析:从 File 到 Help 的完整操作参考与源码实现对照
【免费下载链接】cutterFree and Open Source Reverse Engineering Platform powered by rizin项目地址: https://gitcode.com/gh_mirrors/cu/cutter
本文系统梳理 Cutter(基于 rizin 的开源逆向工程平台)主菜单栏的全部菜单项,包括 File、Edit、View、Windows、Plugins、Debug 以及 Debug → View 与 Help 八个菜单的功能、操作路径与快捷键,并结合源码说明这些菜单项背后的实现机制(如 I/O 三模式控制器、布局管理与插件菜单扩展),帮助读者快速掌握 Cutter 的日常操作方式并理解其 GUI 层的组织原理。
菜单栏的位置取决于桌面环境:可能位于窗口顶部,也可能位于屏幕顶部(全局菜单栏)。以下章节与 菜单栏文档 及其子页面一一对应。
File 菜单:文件、映射与 I/O 模式管理
File 菜单涵盖新窗口、文件映射、PDB 导入、写入模式切换、项目保存、代码导出、Rizin 脚本执行与会话退出。
新窗口与文件映射
- New Window(
File -> New Window,快捷键Ctrl+N):在不退出当前会话的前提下打开 Cutter 新实例,开始新的逆向会话。 - Map File(
File -> Map File,快捷键Ctrl+M):将其他文件的内容映射进与已加载二进制共享的 I/O 空间,映射位置可以是随机的或指定的偏移。从文档描述看,这是复现运行环境的基础工具:可以加载并映射 core 文件、调试会话、框架所依赖的全部库和文件,从而在静态环境中重现目标二进制的完整依赖视图。 - Import PDB(
File -> Import PDB):加载外部 PDB 文件以补充调试信息。Cutter 不依赖 Windows API 解析 PDB,因此可在 Linux、macOS 等其他平台加载 Windows 二进制符号。
三种 I/O 模式:Write、Cache 与 Read-Only
File → Set mode 子菜单提供三种模式切换,这是 Cutter 修改二进制的核心安全机制:
| 模式 | 操作路径 | 行为 | 风险 |
|---|---|---|---|
| Write mode | File -> Set mode -> Write mode | 启用写模式,所有补丁与编辑直接写回磁盘上的原始文件 | 每次修改都会落到磁盘,存在风险 |
| Cache mode | File -> Set mode -> Cache mode | 修改只保存在内存缓存中,不触碰磁盘文件,需通过 Commit changes 显式提交 | 更安全,无数据丢失风险 |
| Read-Only mode | File -> Set mode -> Read-Only mode | 禁止一切补丁与编辑;仅在 Write/Cache 模式下可切换 | 默认模式 |
Read-Only 是 Cutter 打开文件时的默认模式,除非用户显式启用 Write 或 Cache。Commit Changes from Cache(File -> Commit changes)用于把 Cache 模式下的全部修改一次性应用到磁盘文件——这是 Cache 模式相对 Write 模式的唯一"落盘"入口。
从源码结构看,这三种模式由 IOModesController 统一管理,其Mode枚举定义了READ_ONLY、CACHE、WRITE三个状态,并提供getIOMode()/setIOMode(Mode mode)接口。主窗口实现(约 230-240 行)中,菜单动作分别调用ioModesController.setIOMode(IOModesController::Mode::CACHE)、WRITE、READ_ONLY,印证了菜单项与三态控制器的直接对应关系。
项目保存与代码导出
- Save(
File -> Save,Ctrl+S):将会话保存为项目文件;若当前会话尚未关联项目文件,会弹出 "Save as..." 对话框。 - Save As...(
File -> Save As...):保存会话当前状态,包括函数名、注释等分析成果。注意该功能文档标注为 Beta 阶段。 - Export as Code(
File -> Export as code):将完整二进制导出为可在编程语言中使用的格式,支持 Python 数组、Java、多种 C 数组格式、JavaScript 等。文档特别强调:这不是反编译功能,只是数据到代码字面量的转换。
运行 Rizin 脚本与退出
Run Rizin script(File -> Run Rizin script)用于执行 Rizin 脚本——即包含一系列 Rizin 命令的文件,可手工编写,也可由 Rizin 命令自动生成(以星号结尾的命令,如afl*,会输出可重放的命令脚本)。文档给出的示例脚本:
?e hello world ?v 10+5 pdf @ mainQuit(File -> Quit,Ctrl+Q):退出当前会话,退出前会询问是否保存会话以免丢失数据。
Edit 菜单:导航历史与偏好设置
Edit 菜单相对精简,核心是寻址历史导航与设置入口。
- Search(
Edit -> Search):显示 Search 组件。 - Undo Seek(
Edit -> Undo Seek,Alt+Left):回退到上一个浏览位置。 - Redo Seek(
Edit -> Redo Seek,Alt+Right):前进到寻址历史中的下一位置。这两个动作共同构成"浏览历史"栈,语义类似浏览器的后退/前进,但作用于逆向工作区中的地址跳转。 - Preferences(
Edit -> Preferences):打开偏好设置对话框,用于访问和定义 Cutter 的各项配置。
View 菜单:刷新、缩放与布局管理
View 菜单负责内容刷新、外观选项与布局持久化。
刷新与重置
- Refresh Contents(
View -> Refresh Contents):在部分场景下(例如从内置 Rizin 控制台定义了新函数后),组件显示的信息可能不是最新的;刷新会从会话中重新拉取最新数据并更新各视图。文档注明自动感知底层变更并自动刷新目前是进行中的工作。 - Reset to default layout(
View -> Reset to default layout):将当前布局重置为 Cutter 默认布局。 - Reset Settings(
View -> Reset Settings):将当前设置重置为 Cutter 默认设置。
面板锁定与标签栏
- Unlock Panels(
View -> Unlock Panels):勾选与否决定各组件是否允许被移动或关闭;取消勾选可防止误操作改变当前布局。 - Show Tabs at the Top(
View -> Show Tabs at the Top):切换标签栏位置。 - Grouped dock dragging(
View -> Grouped dock dragging):启用后拖动某个组件会连同与其分组的组件一起拖动;若要单独拖动分组中的某个组件,需从标签页本身而非标题栏拖拽。禁用该选项则始终按单个组件拖动。
缩放
- Zoom In(
View -> Zoom -> Zoom In,Ctrl++):放大 Graph、Disassembly、Hexdump 等组件内容。 - Zoom Out(
View -> Zoom -> Zoom Out,Ctrl+-):缩小。 - Reset(
View -> Zoom -> Reset,Ctrl+=):恢复默认缩放。
布局的保存与管理
- Save Layout(
View -> Save Layout):以指定名称保存当前布局。一个布局包含当前打开的组件集合、它们的位置以及部分属性。 - Manage layouts(
View -> Manage layouts):对已保存的布局执行重命名或删除。 - Layouts 子菜单(
View -> Layouts -> 布局名):把所选布局加载到当前视图;加载布局本身不会随操作被修改,若要保存变更需另行使用 Save Layout。
这些布局文档对应 布局偏好文档。
Windows 菜单:分析视图与组件实例管理
Windows 菜单是组件开关的主入口,分为"显示已有组件"与"新增组件实例"两类。
信息显示组件
- Dashboard(
Windows -> Dashboard):显示二进制基本信息面板,包括文件名、二进制格式(PE、ELF64 等)、位数(16/32/64)、架构(x86、ARM 等)、访问模式(Read/Write/Execute)、大小、二进制类型、编写语言、编译器检测、Stack Canaries、NX 位、位置无关代码、校验和(MD5、SHA1 等)、熵值等。 - Functions(
Windows -> Functions):列出 Cutter 识别的函数及名称、地址、大小等信息;Main、Entrypoint 和外部函数会以特定颜色高亮以便快速定位。 - Decompiler(
Windows -> Decompiler):显示当前函数的反编译结果。文档指出 Cutter 发布版默认附带两个反编译器:rz-ghidra 与 rz-dec(后者"即将提供");该组件支持地址同步、重命名、重新定类型等交互操作,且可通过插件扩展更多反编译器。 - Graph Overview(
Windows -> Graph Overview):Graph 视图的缩略总览形式,以拉远的视角帮助理解函数整体控制流。 - Search(
Windows -> Search):打开 Search 面板,可在二进制中搜索数据、字符串、十六进制内容等。 - Strings(
Windows -> Strings,Shift+F12):显示程序中的可打印字符串,组件内组合框可选择显示整个二进制或特定段/节中的字符串。 - Types(
Windows -> Types):打开 Types 组件,用于定义、加载、导出和管理结构体、枚举等数据类型。 - Comments(
Windows -> Comments):显示当前会话的自动注释与用户自定义注释。 - Console(
Windows -> Console,:或 `Ctrl+``):打开内置 Rizin 控制台,可直接执行 Rizin 命令。
新增组件实例
以下菜单项用于创建组件的新实例,以便同时查看多个位置:
- Add Decompiler(
Windows -> Add Decompiler):新增反编译组件实例,配合多个反编译器同时查看多个反编译函数。 - Add Disassembly(
Windows -> Add Disassembly):新增反汇编实例。 - Add Graph(
Windows -> Add Graph):新增 Graph 实例。文档说明了 Graph 视图的结构:每个节点代表函数内一个基本块,块间进出边代表控制流。 - Add Hexdump(
Windows -> Add Hexdump,Shift+G):新增十六进制转储实例。
Plugins 菜单:插件扩展点
Plugins 子菜单包含由已加载插件创建的各种窗口与视图。默认情况下该菜单为空,直到有插件向其注册动作与菜单项。
从源码结构看,主窗口界面定义在 MainWindow.ui(约 158 行)中即预置了menuPlugins这一顶级菜单容器;MainWindow.cpp 中还存在addMenuFileAction(QAction *action)(约 571 行)这类向菜单动态追加动作的接口,以及getMenuByType(MenuType type)(约 541 行)供插件按类型定位目标菜单。可以推断,插件通过 PluginManager 加载后,借助这些接口把自身动作挂接到 Plugins 菜单及相关菜单上,从而形成"默认空菜单、随插件填充"的行为。
Debug 菜单:调试与模拟执行控制
Debug 菜单提供调试会话的启动与执行控制。
会话启动
- Start debug(
Debug -> Start debug,F9):对当前加载的二进制启动调试会话。 - Start emulation(
Debug -> Start emulation):对当前二进制启动模拟会话。Cutter 支持多种文件格式的模拟。与调试不同,模拟并非真正执行二进制,而是逐条模拟指令——这对分析自包含函数、密码学算法或数据去混淆非常有用;且模拟不受运行平台限制,例如可在 Windows 上模拟 ELF 文件、在 Linux 上模拟 DLL。 - Attach to process(
Debug -> Attach to process):将 Cutter 调试器附加到已运行的进程,而非生成新进程。 - Connect to a remote debugger(
Debug -> Connect to a remote debugger):通过提供远程调试器的 IP 与端口,连接 GDB、WinDbg 等远程调试器。
单步与继续
| 动作 | 操作路径 | 快捷键 | 行为 |
|---|---|---|---|
| Step Into | Debug -> Step | F7 | 执行单条汇编指令,步入函数与循环 |
| Step Over | Debug -> Step over | F8 | 执行单条指令,跨过程序;被调用函数会被执行,暂停点为函数调用后的下一条指令 |
| Step Out | Debug -> Step out | Ctrl+F8 | 执行代码,直到当前函数返回时暂停 |
| Continue | Debug -> Continue | F5 | 继续执行,直到命中断点、被用户手动挂起或程序退出 |
| Continue until call | Debug -> Continue until call | — | 继续执行直到遇到函数调用 |
| Continue until syscall | Debug -> Continue until syscall | — | 继续执行直到遇到系统调用 |
Debug → View 菜单:调试辅助视图
Debug 下的 View 子菜单集中了调试态的辅助组件开关。除 Backtrace 外的多数视图文档标注仅在 Debug 模式下可用。
- Backtrace(
Debug -> View -> Backtrace):显示回溯窗口。 - Breakpoints(
Debug -> View -> Breakpoints):显示断点组件,可列出、管理、增删和定义断点。 - Threads(
Debug -> View -> Threads):列出运行中应用的线程。 - Processes(
Debug -> View -> Processes):显示所有子进程并允许在进程间切换,对内核调试或跟踪 fork 行为尤其有用。 - Memory map(
Debug -> View -> Memory map):显示运行进程的已映射内存页,包括已加载库的映射与动态分配的映射。 - Registers(
Debug -> View -> Registers):显示运行进程的寄存器与标志信息;不仅可查看,还可直接修改。 - Register References(
Debug -> View -> Register References):Registers 组件的扩展视图,支持对寄存器值进行多层深度的解引用(telescope)。 - Stack(
Debug -> View -> Stack):显示运行进程栈值与栈结构。
Help 菜单:版本、反馈与文档
- About(
Help -> About):查看当前版本、已安装插件、作者、构建选项、许可证等信息。 - Report an issue(
Help -> Report an issue):在浏览器中打开 Cutter 的 GitHub 新 issue 页面,并自动填充 issue 模板中的相关信息。 - Documentation(
Help -> Documentation):在浏览器中打开 Cutter 用户文档。
源码级补充:菜单是如何组织的
从 MainWindow.ui 可以看到,菜单栏由一个QMenuBar(约 36 行)承载,内部按顶级菜单组织为menuFile(51 行)、menuSetMode(63 行,即 Set mode 子菜单)、menuView(95 行)、menuZoom(102 行)、menuLayouts(111 行)、menuTools(131 行)、menuHelp(137 行)、menuEdit(145 行)、menuWindows(154 行)、menuPlugins(158 行)、menuAddInfoWidgets(163 行)、menuAddDebugWidgets(168 行)、menuDebug(183 行)等,与上文各菜单一一对应。其中menuAddInfoWidgets与menuAddDebugWidgets对应 Windows 菜单中的"新增组件实例"子菜单。
MainWindow.cpp 中除菜单动作到IOModesController的映射外,还维护了面向插件的扩展菜单机制(约 146-147 行创建了名为 "Plugins" 的反汇编/可寻址上下文扩展菜单,2041 行的getContextMenuExtensions(ContextMenuType type)提供统一访问),说明菜单体系同时服务于主菜单栏与上下文菜单两类扩展点。
快捷键方面,各菜单项标注的快捷键(Ctrl+N、F7/F8、`Ctrl+`` 等)由 DefaultShortcuts.cpp 中的默认快捷键表统一注册,可在偏好设置的快捷键选项中调整。
快速参考表
| 菜单 | 典型操作 | 快捷键 |
|---|---|---|
| File | New Window | Ctrl+N |
| File | Map File | Ctrl+M |
| File | Save | Ctrl+S |
| File | Quit | Ctrl+Q |
| Edit | Undo Seek / Redo Seek | Alt+Left/Alt+Right |
| View | Zoom In / Out / Reset | Ctrl++/Ctrl+-/Ctrl+= |
| Windows | Strings | Shift+F12 |
| Windows | Add Hexdump | Shift+G |
| Windows | Console | :或 `Ctrl+`` |
| Debug | Start debug | F9 |
| Debug | Step / Step over / Step out | F7/F8/Ctrl+F8 |
| Debug | Continue | F5 |
【免费下载链接】cutterFree and Open Source Reverse Engineering Platform powered by rizin项目地址: https://gitcode.com/gh_mirrors/cu/cutter
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考