资讯动态

Cutter 反编译器右键菜单完全指南:从代码复制、注释管理到调试控制

发布时间:2026/9/20 16:02:45 来源:尧图企业网站定制
应用安全桌面应用开发工具【免费下载链接】cutterFree and Open Source Reverse Engineering Platform powered by rizin项目地址https://gitcode.com/gh_mirrors/cu/cutter点击查看免费下载Cutter 是依托 rizin 逆向引擎的开源逆向工程平台其反编译器Decompiler视图将汇编指令还原为可读的伪 C 代码而右键上下文菜单则是用户与反编译结果交互的快捷入口。本文以 decompiler-context-menu.rst 为骨架结合 DecompilerContextMenu.cpp 与 DecompilerContextMenu.h 的源码实现系统讲解反编译器右键菜单中每一项动作的用途、操作步骤与快捷键帮助你像操作汇编视图一样熟练地在伪代码中复制地址、跳转定位、管理注释、重命名符号、查看交叉引用并直接在反编译行上打断点与调试。菜单的本质上下文敏感的动态动作集反编译器右键菜单是一个「上下文敏感菜单context-sensitive menu」其中可用动作完全取决于光标所在位置的代码内容。从源码看DecompilerContextMenu 继承自QMenu其动作集合在构造时固定但每个动作的可见性、文案与可用性会在菜单弹出前通过aboutToShowSlot()DecompilerContextMenu.cpp动态刷新。菜单的弹出路径位于 DecompilerWidget.cppDecompilerWidget::showDecompilerContextMenu()直接调用mCtxMenu-exec(...)弹出菜单。在此之前DecompilerWidget::eventFilter 会在你按下鼠标右键且当前没有选中文本时先把文本光标定位到鼠标所在位置保证菜单始终作用于光标下的内容。菜单中的动作依赖两类底层数据RzCodeAnnotation注解annotationHere光标下的代码经 rizin 注释引擎标注后可区分「函数名引用」「全局变量引用」「常量变量引用」「函数局部变量」等类型详见 DecompilerContextMenu.h行内偏移集合firstOffsetInLine、availableBreakpoints反编译的每一行可能映射到多条汇编指令、多个地址菜单以「行内最早偏移」为基准处理注释、断点等操作见 DecompilerContextMenu.h。代码与地址复制类操作Copy复制描述将选中文本复制到剪贴板若无选区但光标位于某个单词上则复制该单词否则复制光标所在的整行。步骤选中文本后右键选择Copy。快捷键Ctrl-C该动作触发后由DecompilerWidget::copy()DecompilerWidget.cpp真正执行优先复制选区其次尝试复制光标下单词最后回退为复制整行。源码中actionCopyTriggered()通过emit copy()信号DecompilerContextMenu.cpp将请求转发给 DecompilerWidget其快捷键在 DefaultShortcuts.cpp 中注册为系统标准的Copy键序列。Copy Instruction Address复制指令地址描述复制光标下代码所映射指令的地址。步骤右键点击想获取地址的代码片段选择Copy instruction address (address)。快捷键无独立快捷键依赖Ctrl-C等场景区分。菜单文案中的地址会随光标实时更新aboutToShowSlot()中执行actionCopyInstructionAddress.setText(tr(Copy instruction address (%1)).arg(rzAddressString(offset)))DecompilerContextMenu.cpp。触发时actionCopyInstructionAddressTriggered()将offset光标处的指令偏移以十六进制形式写入剪贴板DecompilerContextMenu.cpp。这里的offset由 DecompilerWidget 在弹出菜单前通过setOffset()设置。Copy Address of Reference复制引用地址描述复制光标下引用reference的地址。此处的「引用」特指三类内容函数名、全局变量、带有地址的常量变量。步骤右键点击某个引用选择Copy address [of name] (address)。快捷键Ctrl-Shift-C源码中actionCopyReferenceAddress的可见性由isReference()决定即annotationHere存在且rz_annotation_is_reference()判定为真DecompilerContextMenu.cpp。菜单文案按引用类型区分三种形式DecompilerContextMenu.cpp函数名引用Copy address of 函数名 (地址)有 flag 的全局变量Copy address of flag名 (地址)其余情况Copy address (地址)。触发后actionCopyReferenceAddressTriggered()直接把annotationHere-reference.offset写入剪贴板DecompilerContextMenu.cpp。快捷键Ctrl-Shift-C在 DefaultShortcuts.cpp 中注册。跨视图定位类操作Show the code in another widget在其他组件中显示代码描述在另一个已打开的组件中显示光标下的代码若选择了尚未打开的组件类型则新建该组件并跳转。如果选择的是非反编译器组件则会打开光标下代码所映射的地址。步骤右键点击任意内容进入Show in子菜单从中选择一个组件或选择打开一个新组件。该子菜单由actionShowInSubmenu承载菜单弹出前会调用mainWindow-createShowInMenu(this, offset)动态重建DecompilerContextMenu.cpp这意味着你可以随时把伪代码中任意一行对应的地址切到反汇编、十六进制转储Hexdump、图视图等组件中去查看。Show in子菜单仅在firstOffsetInLine ! RVA_MAX即光标下有有效地址映射时显示DecompilerContextMenu.cpp。Show the selected item in another widget在其他组件中显示指定条目描述在另一个组件中显示光标下的条目条目包括函数、全局变量、带有地址的常量变量或新建组件显示。步骤右键点击某一条目进入Show 条目名 in子菜单或点击形如函数名 (地址)的条目项选择组件。这一组动作由updateTargetMenuActions()DecompilerContextMenu.cpp动态插入若光标下是全局变量或常量变量引用则按数据地址提示AddressTypeHint::Data创建跳转菜单菜单名形如Show flag名 in或Show 地址 in若光标下是函数名引用则按函数地址提示AddressTypeHint::Function创建菜单菜单名形如函数名 (地址)。与「Show in」子菜单的区别在于前者针对任意代码行后者专门针对被注解的具名条目且会按地址类型给出更精确的组件跳转提示。注释管理类操作Add and Edit Comment添加与编辑注释描述为光标下的代码行添加注释或编辑光标下的注释。「Edit Comment」仅对用户自定义注释可用。步骤右键选择Add Comment或Edit Comment。快捷键;aboutToShowSlot()中会先通过Core()-getCommentAt(firstOffsetInLine)查询该行是否已有注释DecompilerContextMenu.cpp无注释时动作显示为Add Comment并隐藏Delete comment已有注释时动作变为Edit Comment。触发后调用CommentsDialog::addOrEditComment(firstOffsetInLine, ...)打开注释对话框DecompilerContextMenu.cpp其实现位于 CommentsDialog.h。Delete a Comment删除注释描述删除光标下的注释若光标下没有注释则删除光标代码所映射偏移处的注释。步骤右键点击带有用户自定义注释的指令选择Delete comment。快捷键无独立快捷键。触发时直接调用Core()-delComment(firstOffsetInLine)DecompilerContextMenu.cpp删除该行最早偏移处的注释删除动作本身会广播commentsChanged信号触发反编译器刷新见 DecompilerWidget.cpp 的连接。符号命名类操作Rename function重命名函数描述重命名光标下的函数。步骤右键点击函数名选择Rename function name。快捷键N此动作是actionRenameThingHereDecompiler.renameThingHere快捷键N注册于 DefaultShortcuts.cpp对函数名注解的分支。aboutToShowSlot()中仅当annotationHere-type RZ_CODE_ANNOTATION_TYPE_FUNCTION_NAME时才显示Rename function 函数名DecompilerContextMenu.cpp。触发逻辑见actionRenameThingHereTriggered()DecompilerContextMenu.cpp若该地址尚不存在分析函数functionAt()返回空会弹出「Define this function at 地址」对话框调用Core()-createFunctionAt()新建函数若函数已存在弹出重命名对话框调用Core()-renameFunction()。Give a name or rename global variables为全局变量命名或重命名描述为光标下的全局变量起名或重命名它。步骤右键点击全局变量选择Add name to 全局变量地址或Rename name。快捷键N同样由actionRenameThingHere处理只是分支类型为RZ_CODE_ANNOTATION_TYPE_GLOBAL_VARIABLEDecompilerContextMenu.cpp若该地址已有 flagrz_flag_get_i()命中显示Rename flag名若没有 flag显示Add name to 光标下单词。触发时DecompilerContextMenu.cpp已有 flag 则调用Core()-renameFlag()否则调用Core()-addFlag(varAddr, newName, 1)为地址创建长度为 1 的 flag。Delete the name of a global variable删除全局变量的名字描述删除光标下全局变量的名字。步骤右键点击全局变量选择Remove name。快捷键无独立快捷键。actionDeleteName默认隐藏仅当光标下为已有 flag 的全局变量时显示DecompilerContextMenu.cpp。触发后调用Core()-delFlag(annotationHere-reference.offset)DecompilerContextMenu.cpp删除该地址的 flag。函数变量编辑类操作Rename Function Variable重命名函数变量描述重命名反编译函数中的局部变量与参数。注意该选项仅对在反汇编中定义的函数变量可用——即那些 rizin 在汇编层已识别并建模的局部变量/参数伪代码中临时生成如解引用产生的中间变量不在此列。步骤右键点击变量选择Rename variable name。快捷键N菜单显示前aboutToShowSlot()会判断isFunctionVariable()rz_annotation_is_variable()DecompilerContextMenu.cpp并将动作文案设为Rename variable 变量名DecompilerContextMenu.cpp。若variablePresentInRizin()在Core()-getVariables(offset)返回列表中查找同名变量DecompilerContextMenu.cpp返回 false则禁用动作并提示「Only local variables defined in disassembly can be renamed」。触发时调用Core()-renameFunctionVariable(newName, oldName, decompiledFunctionAddress)DecompilerContextMenu.cpp将变量改名与当前反编译的函数地址绑定。Edit Local Variables and Arguments编辑局部变量与参数描述重命名函数变量/参数或设置其类型。注意同样仅对在反汇编中定义的函数变量和参数可用。步骤右键点击变量选择Edit variable name。快捷键Y对应动作actionEditFunctionVariablesDecompiler.editFunctionVariables快捷键Y注册于 DefaultShortcuts.cpp。触发后打开 EditVariablesDialog 并传入decompiledFunctionAddress与变量名DecompilerContextMenu.cpp你可以在对话框中统一修改函数变量的名称与类型若变量不在 rizin 中会弹出与重命名一致的受限提示。交叉引用类操作Show Cross References显示交叉引用描述显示光标下引用的 X-Refs。此操作会打开 Cutter 的 X-Refs 对话框列出从该引用地址出发、以及指向该引用地址的所有交叉引用并可预览每条引用的上下文以便快速检查不同使用点。此处「引用」同样指函数名、全局变量和带地址的常量变量。步骤右键点击某个引用选择Show X-Refs。快捷键X动作可见性由isReference()控制非引用时不显示见 DecompilerContextMenu.cpp。触发后DecompilerContextMenu.cpp创建 XrefsDialog调用dialog.fillRefsForAddress(annotationHere-reference.offset, displayString, false)填充引用列表——函数名引用以函数名显示其余以十六进制地址显示。快捷键X对应General.showXRefsDefaultShortcuts.cpp 附近注册。调试上下文菜单Debug Context Menu反编译器的右键菜单下半部分Breakpoint与Debug两个子菜单专门用于调试场景。注意DecompilerContextMenu.cpp 中debugMenu的可见性由Core()-currentlyDebugging控制即调试子菜单仅在正在调试时显示。Add or Remove Breakpoint添加或移除断点描述在光标所在行的最早偏移处添加断点。若使用快捷键触发移除则移除该行定义的所有断点。步骤右键点击某行代码选择Breakpoint -- Add breakpoint或Breakpoint -- Remove breakpoint。快捷键F2菜单文案会根据该行已有的断点数量动态变化DecompilerContextMenu.cpp0 个断点显示Add breakpoint1 个断点显示Remove breakpoint多个断点显示Remove all breakpoints in line。actionToggleBreakpointTriggered()DecompilerContextMenu.cpp的逻辑为若该行已有断点availableBreakpoints非空则逐个Core()-toggleBreakpoint()移除并清空列表否则在firstOffsetInLine处添加断点。快捷键F2同时绑定Ctrl-B注册于 DefaultShortcuts.cpp。Advanced Breakpoint Dialog高级断点对话框描述打开高级断点对话框除了普通断点外还可以定义硬件断点、条件断点等。步骤右键点击某行代码选择Breakpoint -- Advanced breakpoint。若该行存在多个断点可通过Edit breakpoint子菜单选择要编辑的具体断点。快捷键Ctrl-F2aboutToShowSlot()中会为「Advanced breakpoint」动作动态构建子菜单当该行有多个断点时把breakpointsInLineMenu挂到动作下列出每个断点的地址点击任意一项即可通过BreakpointsDialog::editBreakpoint()编辑对应断点DecompilerContextMenu.cpp当该行只有一个或没有断点时动作直接显示为Edit breakpoint或Advanced breakpointDecompilerContextMenu.cpp。触发逻辑DecompilerContextMenu.cpp有断点则编辑最早的一个否则在firstOffsetInLine处通过BreakpointsDialog::createNewBreakpoint()新建。实现位于 BreakpointsDialog.h。快捷键Ctrl-F2注册于 DefaultShortcuts.cpp。Continue Until Line运行到指定行描述让程序继续执行直到到达选中行的偏移处。程序不保证一定到达该地址——如果中途先命中其他断点会触发并暂停如果一直未到达程序会持续运行直到退出。可用条件仅限Debug调试或 Emulation模拟模式。步骤在调试或模拟模式下右键点击某行代码选择Debug -- Continue until line。快捷键无独立快捷键。触发时调用Core()-continueUntilDebug(offset)DecompilerContextMenu.cpp由 rizin 调试后端执行「运行到指定偏移」的底层操作。Set Program Counter (PC)设置程序计数器描述将调试器的程序计数器PC设置为当前偏移。例如在 Intel 64 位程序中Cutter 会把RIP 寄存器的值设置为当前地址。可用条件仅限Debug 或 Emulation 模式。步骤在调试或模拟模式下右键点击某行代码选择Debug -- Set PC。快捷键无独立快捷键。菜单弹出时动作文案会根据当前架构动态显示为Set 寄存器名 here——aboutToShowSlot()中通过Core()-getRegisterName(PC).toUpper()获取寄存器名如 x86 的RIP、ARM 的PC见 DecompilerContextMenu.cpp。触发时DecompilerContextMenu.cpp先取寄存器名再调用Core()-setRegister(regName, rzAddressString(offset).toUpper())把 PC 改写为光标行偏移从而实现「跳转执行」效果。菜单项的动态行为小结下表汇总了反编译器右键菜单各动作的触发条件与可见性规则依据 DecompilerContextMenu.cpp 的aboutToShowSlot与各 action 的setAction*实现动作快捷键显示条件核心底层调用CopyCtrl-C始终可用DecompilerWidget::copy()Copy instruction address—光标下有地址映射剪贴板写入offsetCopy address of referenceCtrl-Shift-C光标下为引用函数名/全局变量/常量变量剪贴板写入reference.offsetShow in子菜单—firstOffsetInLine有效createShowInMenu()Show in子菜单—光标下为具名引用createShowInMenu(hintData/Function)Add/Edit Comment;行内有有效偏移CommentsDialog::addOrEditComment()Delete comment—行内已存在注释Core()-delComment()Rename functionN函数名注解createFunctionAt()/renameFunction()Add name/Rename global varN全局变量注解renameFlag()/addFlag()Remove—全局变量已有 flagCore()-delFlag()Rename variableN变量注解且变量在 rizin 中renameFunctionVariable()Edit variableY变量注解且变量在 rizin 中EditVariablesDialogShow X-RefsX光标下为引用XrefsDialog::fillRefsForAddress()Add/Remove breakpointF2始终可用Core()-toggleBreakpoint()Advanced breakpointCtrl-F2始终可用BreakpointsDialogContinue until line—仅 Debug/Emulation 模式Core()-continueUntilDebug()Set PC—仅 Debug/Emulation 模式Core()-setRegister()需要说明的是上文所有快捷键均以 DefaultShortcuts.cpp 中注册的默认值为准你可以在 Cutter 的「设置 → 快捷键」中按需自定义调试类动作断点、Continue until line、Set PC的实际可用性还取决于当前调试后端与架构支持。结语反编译器右键菜单把 rizin 的底层能力地址解析、flag 管理、注释、交叉引用、断点与寄存器控制封装为一个个贴近伪代码阅读习惯的动作。理解每个动作背后的「注解类型判定」与「行内偏移映射」逻辑后你可以更高效地在反编译视图中完成「读代码 → 定位符号 → 查看引用 → 重命名整理 → 下断点调试」的完整逆向工作流。若想深入了解菜单之外的反编译器特性如反编译器的选择与配置可继续查阅 docs/source/user-docs/features.rst 与 docs/source/user-docs/preferences/analysis.rst。赞分享应用安全桌面应用开发工具【免费下载链接】cutterFree and Open Source Reverse Engineering Platform powered by rizin项目地址https://gitcode.com/gh_mirrors/cu/cutter点击查看免费下载相关推荐如何完全掌控Windows右键菜单ContextMenuManager终极管理指南如何完全掌控Windows右键菜单ContextMenuManager终极管理指南 Windows右键菜单是我们日常操作电脑时最常用的功能之一但随着安装软件桌面应用系统工具Cutter 反汇编右键菜单 Debug 调试操作指南Continue Until Line 与 Set PC 的完整实现与用法Cutter 反汇编右键菜单 Debug 调试操作指南Continue Until Line 与 Set PC 的完整实现与用法 Cutter 是一款基于 r应用安全桌面应用开发工具右键菜单管理大师Windows右键菜单优化完全指南右键菜单管理大师Windows右键菜单优化完全指南 想要让Windows右键菜单变得干净整洁、高效实用吗ContextMenuManager正是您需要的Wi桌面应用系统工具上一篇mlx-community/AREX-Turbo-6bit深度测评44.5 tok/s解码速度与3.8GB显存占用的完美平衡下一篇DeepTutor v1.4.0-beta 深度解析Auto 模式路由、三层记忆子系统与 Agentic 引擎全栈统一创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价