十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Cutter 反汇编视图断点管理:从 Add/remove breakpoint 到高级断点对话框的完整指南

Cutter 反汇编视图断点管理:从 Add/remove breakpoint 到高级断点对话框的完整指南 Cutter 反汇编视图断点管理从 Add/remove breakpoint 到高级断点对话框的完整指南【免费下载链接】cutterFree and Open Source Reverse Engineering Platform powered by rizin项目地址: https://gitcode.com/gh_mirrors/cu/cutter导读本文围绕 Cutter基于 rizin 的开源逆向工程平台反汇编视图中与断点管理相关的右键上下文菜单展开完整讲解「Add/remove breakpoint」与「Advanced breakpoint」两个核心菜单项的触发方式、快捷键、适用场景及其背后的源码实现。读完本文你将掌握在反汇编视图中快速切换软件断点、通过高级对话框配置硬件断点 / 条件断点 / 跟踪断点 / 断点命令的完整操作流程并能从 Cutter 源码层面理解断点的创建、编辑与底层 rizin 交互链路。一、菜单入口与操作概览在 Cutter 的反汇编视图中对任意一条指令单击右键即可弹出反汇编上下文菜单其中包含一个名为Breakpoint的子菜单用于集中管理断点。该子菜单包含两项菜单项功能默认快捷键Add/remove breakpoint在当前地址添加断点若已存在断点则移除F2亦绑定CtrlBAdvanced breakpoint打开高级断点对话框配置硬件、条件等高级断点CtrlF2该子菜单由 DisassemblyContextMenu.cpp 中的addBreakpointMenu()方法构建先通过addMenu(tr(Breakpoint))创建子菜单再将actionAddBreakpoint与actionAdvancedBreakpoint两个动作依次加入两个动作分别通过快捷键标识Debug.toggleBreakpoint与Debug.advancedBreakpoint注册。二、Add/remove breakpoint在当前地址快速切换断点2.1 描述与操作步骤描述在当前指令地址添加一个断点如果该地址已经存在断点则执行移除操作即一个「切换toggle」语义。操作步骤在反汇编视图中右键点击一条指令选择Breakpoint - Add/remove breakpoint。快捷键F2默认绑定同时在 DefaultShortcuts.cpp 中额外绑定了CtrlB作为备选键位。2.2 底层实现从菜单动作到 rizin在 DisassemblyContextMenu.cpp 中addBreakpointTriggered()直接调用Core()-toggleBreakpoint(offset)其中offset是右键点击时菜单记录的目标地址由setOffset(RVA offset)传入。toggleBreakpoint在 Cutter.cpp 中的实现为void CutterCore::toggleBreakpoint(RVA addr) { CORE_LOCK(); rz_core_debug_breakpoint_toggle(core, addr); emit breakpointsChanged(addr); }可以看到 Cutter 将切换逻辑委托给 rizin 高层 APIrz_core_debug_breakpoint_toggle并在操作完成后发出breakpointsChanged信号驱动断点列表BreakpointWidget、反汇编视图等界面同步刷新。2.3 菜单文本的动态切换值得注意的一个细节是菜单项文本并不是固定不变的。在aboutToShowSlot()菜单即将显示时触发中Cutter 会查询当前地址是否存在断点并据此动态改写动作文本见 DisassemblyContextMenu.cppconst bool hasBreakpoint Core()-breakpointIndexAt(offset) -1; actionAddBreakpoint.setText(hasBreakpoint ? tr(Remove breakpoint) : tr(Add breakpoint)); actionAdvancedBreakpoint.setText(hasBreakpoint ? tr(Edit breakpoint) : tr(Advanced breakpoint));也就是说当目标地址已有断点时右键菜单会显示「Remove breakpoint」没有断点时才显示「Add breakpoint」。同理高级断点菜单项在断点存在时变为「Edit breakpoint」。breakpointIndexAt在 Cutter.cpp 中通过rz_bp_get_index_at判断该地址在 rizin 断点列表中的索引是否存在。三、Advanced breakpoint高级断点对话框3.1 描述与操作步骤描述打开高级断点对话框。该对话框不仅支持在当前地址创建常规软件断点还支持配置硬件断点、条件断点、断点命令、跟踪断点、启用状态等高级选项。操作步骤在反汇编视图中右键点击一条指令选择Breakpoint - Advanced breakpoint。快捷键CtrlF2默认绑定见 DefaultShortcuts.cpp。3.2 底层实现新建还是编辑由断点状态决定advancedBreakpointTriggered()的实现见 DisassemblyContextMenu.cppvoid DisassemblyContextMenu::advancedBreakpointTriggered() { const int index Core()-breakpointIndexAt(offset); if (index 0) { BreakpointsDialog::editBreakpoint(Core()-getBreakpointAt(offset), parentForDialog()); } else { BreakpointsDialog::createNewBreakpoint(offset, parentForDialog()); } }即如果目标地址已有断点则基于现有断点信息打开编辑模式editBreakpoint否则以当前地址预填位置字段并打开新建模式createNewBreakpoint。两种模式复用同一个 BreakpointsDialog 对话框其窗口标题分别为 Edit breakpoint 与 New breakpoint。对话框确认后createNewBreakpoint调用Core()-addBreakpoint(getDescription())editBreakpoint调用Core()-updateBreakpoint(index, getDescription())见 BreakpointsDialog.cpp。四、高级断点对话框字段详解根据 BreakpointsDialog.cpp 与 BreakpointsDialog.ui 的源码对话框可配置以下字段4.1 位置类型Position Type类型含义说明Address地址输入地址或创建断点时计算的表达式Named命名以表达式形式存储断点位置Module offset模块偏移相对于某加载模块的偏移量需同时指定模块名选择 Module offset 时会启用模块选择下拉框moduleName模块列表来源于Core()-getMemoryMap()的去重结果并支持包含匹配的自动补全。位置输入框为空时对话框的 OK 按钮会被禁用refreshOkButton。4.2 断点类型与硬件权限软件断点Software默认类型通过修改指令流实现中断。硬件断点Hardware选择后需指定访问权限与尺寸读ReadRZ_PERM_R写WriteRZ_PERM_W执行ExecuteRZ_PERM_X断点尺寸size默认值来自下拉框最终通过Core()-num()解析权限选择存在互斥约束见configureCheckboxRestrictions勾选读/写会取消执行勾选执行会取消读/写且三者中至少保留一项。在 Cutter.cpp 的addBreakpoint中硬件断点会通过config.permission ~(RZ_PERM_X)计算出 watchpoint 保护位再调用rz_debug_bp_add创建断点。4.3 条件、命令与行为选项字段作用源码对应Condition条件表达式命中条件满足时才触发断点breakpointCondition可编辑下拉框写入 rizin 的cond字段Command断点命中时自动执行的命令breakpointCommand多行文本域写入 rizin 的data字段Trace跟踪断点命中时记录执行轨迹checkTrace通过setBreakpointTrace设置trace属性Enabled断点是否启用checkEnabled控制enabled属性在addBreakpoint中非空的条件与命令分别通过updateOwnedCharPtr(breakpoint-cond, ...)与updateOwnedCharPtr(breakpoint-data, ...)写入 rizin 的RzBreakpointItem结构跟踪选项则在断点创建后调用setBreakpointTrace(index, config.trace)单独设置见 Cutter.cpp。五、断点数据模型与底层 rizin 交互链路5.1 BreakpointDescription 数据模型高级对话框通过getDescription()将界面输入收集为BreakpointDescription结构BreakpointsDialog.cpp包含addr、index、size、positionExpression、type、permission、command、condition、hw、trace、enabled等字段反向地rizin 的rz_bp_item_t也会通过breakpointDescriptionFromRizinCutter.cpp转换为该结构供编辑对话框回填。5.2 关键调用链总结右键菜单点击 └─ DisassemblyContextMenu::addBreakpointTriggered / advancedBreakpointTriggered ├─ CutterCore::toggleBreakpoint(offset) │ └─ rz_core_debug_breakpoint_toggle(core, addr) // rizin └─ BreakpointsDialog::createNewBreakpoint / editBreakpoint ├─ CutterCore::addBreakpoint(desc) │ └─ rz_debug_bp_add(core-dbg, addr, size, hw, watchpoint, perm, module, delta) └─ CutterCore::updateBreakpoint(index, desc) └─ rz_bp_del addBreakpoint先删后建其中updateBreakpoint采用「先按地址删除再重新创建」的方式Cutter.cpp源码注释指出这是为了规避rz_bp_del_index对非地址型Named/Module断点按索引删除的缺陷。5.3 断点状态的查询与同步无论是菜单文本动态切换、还是高级对话框的新建/编辑分流都依赖CutterCore::breakpointIndexAt(addr)查询地址对应的断点索引并配合getBreakpointAt(addr)获取完整的BreakpointDescription。所有增删改操作完成后都会发出breakpointsChanged信号驱动断点停靠窗口BreakpointWidget与代码视图同步刷新保证界面与 rizin 内部状态一致。六、快捷键与自定义两个断点菜单项的快捷键通过 Cutter 的 ShortcutManager 注册默认定义位于 DefaultShortcuts.cpp{ Debug.toggleBreakpoint, { { Qt::Key_F2, Qt::CTRL | Qt::Key_B }, QT_TRANSLATE_NOOP(DecompilerContextMenu, Add/remove breakpoint), DecompilerContextMenu } }, { Debug.advancedBreakpoint, { { Qt::CTRL | Qt::Key_F2 }, QT_TRANSLATE_NOOP(DecompilerContextMenu, Advanced breakpoint), DecompilerContextMenu } },也就是说Add/remove breakpointF2或CtrlBAdvanced breakpointCtrlF2这些快捷键与反汇编视图共享同一套注册体系上下文名为DecompilerContextMenu反汇编与反编译菜单均复用该快捷键并可在「设置 - 快捷键」界面中由用户自定义。类似地断点列表窗口自身还有独立的快捷键Breakpoint.toggleBreakpoint空格键与Breakpoint.delBreakpointDelete 键可在 DefaultShortcuts.cpp 中查看。七、典型使用场景与小结快速设断点分析时对目标指令直接按F2即可在反汇编视图中实现断点的新增/移除切换配合断点列表窗口的空格键切换效率最高。条件与命令断点当需要在特定条件如寄存器值、内存值满足时才中断或在命中时自动执行输出寄存器、dump 内存等命令时使用CtrlF2打开高级对话框配置 Condition 与 Command。硬件断点/观察点在调试需要监控内存读写而非仅执行的场景下选择 Hardware 断点并勾选读/写权限Cutter 会将其转换为 rizin 的 watchpoint 语义watchpointProt permission ~RZ_PERM_X创建。跟踪断点需要记录程序执行轨迹时勾选 Trace 选项断点命中将写入执行轨迹数据。通过「快速切换 高级对话框」的组合Cutter 在反汇编视图这一个右键菜单入口内覆盖了从最常用软件断点到硬件观察点、条件触发、命令注入、轨迹跟踪的完整断点能力并且全部能力都能追溯到清晰的源码实现DisassemblyContextMenu.cpp、BreakpointsDialog.cpp、Cutter.cpp便于二次开发与深度定制。相关参考文档manage-breakpoints-context-menu.rst、debug-context-menu.rst。【免费下载链接】cutterFree and Open Source Reverse Engineering Platform powered by rizin项目地址: https://gitcode.com/gh_mirrors/cu/cutter创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表