ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Cutter 反汇编右键菜单之 Patching 二进制补丁实战指南

Cutter 反汇编右键菜单之 Patching 二进制补丁实战指南 Cutter 反汇编右键菜单之 Patching 二进制补丁实战指南【免费下载链接】cutterFree and Open Source Reverse Engineering Platform powered by rizin项目地址: https://gitcode.com/gh_mirrors/cu/cutterCutter 是基于 rizin 的自由开源逆向工程平台其反汇编与图视图Graph中的右键菜单集成了完整的二进制修补Patching能力。本文以官方文档 docs/source/user-docs/menus/disassembly-context-menu/patching.rst 为骨架深入讲解 Edit 子菜单下 Edit Instruction、Edit Bytes、Nop Instruction、Reverse Jump 四个补丁操作的用法、适用场景与底层实现原理帮助读者在 Cutter 中直接修改二进制指令而无需跳转到外部十六进制编辑器。反汇编右键菜单中的 Patching 入口在 Cutter 的反汇编Disassembly或图Graph视图中右键点击任意一条指令弹出的 DisassemblyContextMenu 会包含一个Edit子菜单。该子菜单由addEditMenu()方法构建共包含四个与指令修补直接相关的动作见 src/menus/DisassemblyContextMenu.cpp菜单项说明Instruction以汇编文本方式编辑当前指令Nop Instruction将当前指令的整段字节用 NOP 填充Bytes以十六进制字节方式编辑当前指令Reverse Jump反转条件跳转指令如je与jne互换所有修补操作在执行前都会调用IOModesController::prepareForWriting()确保当前 IO 模式具备写入能力src/common/IOModesController.h 中定义了READ_ONLY / CACHE / WRITE三种模式。这意味着即使文件以只读方式打开Cutter 也会提示切换为 Cache 或 Write 模式后再进行修改避免直接破坏源文件。Edit Instruction以汇编文本编辑指令功能描述输入一条或多条汇编指令来替换当前指令。Cutter 会自动汇编输入内容并即时预览这些指令对应的机器码字节。操作步骤在反汇编视图中右键点击一条指令选择Edit - Instruction。交互流程与源码实现触发该操作时Cutter 会读取当前指令的旧汇编文本getInstructionOpcode与旧机器码getInstructionBytes打开 EditInstructionDialog 并预填旧指令文本完整调用链见 src/menus/DisassemblyContextMenu.cppprepareForWriting()确保可写对话框以EDIT_TEXT模式打开标题为Edit Instruction at 0x...输入框预填当前指令的助记符文本用户输入新指令后若与旧指令不同调用Core()-editInstruction(offset, opcode, fillWithNops)写入写入完成后发出instructionChanged信号反汇编视图自动刷新。实时字节预览对话框输入框每次文本变化都会触发updatePreview()src/dialogs/EditInstructionDialog.cpp。在EDIT_TEXT模式下Cutter 调用 rizin 的汇编器Core()-assemble(input)将文本转为字节再用十六进制字符串展示在对话框的instructionLabel标签中让你在点击 OK 之前就能确认将要写入的机器码若汇编失败结果为空或包含 invalid标签会显示Unknown Instruction。NOP 填充选项与文档配套的对话框界面 src/dialogs/EditInstructionDialog.ui 显示Edit Instruction模式下有一个默认勾选的复选框Fill all remaining bytes with NOP opcodes。它的意义在于新指令的机器码长度可能短于原指令勾选后剩余字节会用 NOP 填充避免残留旧指令尾字节导致反汇编错位取消勾选则只写入新指令字节、保留尾部多余字节。该选项通过needsNops()读取src/dialogs/EditInstructionDialog.cpp底层分别调用rz_core_write_assembly_fill或rz_core_write_assemblysrc/core/Cutter.cpp。适用场景将函数开头修改为跳转如jmp 0x...实现打补丁/挂钩就地改写运算指令、常量立即数所在指令需要精确控制写入字节数时配合 NOP 填充选项使用。Edit Bytes直接编辑十六进制字节功能描述输入一串十六进制字节来替换当前指令。Cutter 会自动反汇编这些字节并预览它们将被解码为哪些指令。操作步骤右键点击一条指令选择Edit - Bytes。与 Edit Instruction 的对比两者共用同一个 EditInstructionDialog通过InstructionEditMode枚举区分EDIT_TEXT汇编文本模式与EDIT_BYTES字节模式。差异主要体现在预览方向Edit Instruction文本 → 汇编器 → 字节预览assembleEdit Bytes字节 → 反汇编器 → 指令文本预览disassemble见 src/dialogs/EditInstructionDialog.cpp。字节模式下fillWithNops复选框不可见src/dialogs/EditInstructionDialog.cpp因为字节的长度由你直接输入决定无需 NOP 填充。触发与写入editBytesTriggered()src/menus/DisassemblyContextMenu.cpp会预填当前指令的原始字节仅当新字节串与旧值不同时调用Core()-editBytes(offset, bytes)。底层通过rz_core_write_hexpair将十六进制字符串直接写入目标地址src/core/Cutter.cpp。适用场景精确指定机器码例如手工构造0x90之外的特定填充字节输入已知字节序列并立即查看其反汇编结果验证解码是否正确在汇编器不支持某架构指令时直接以字节方式写入。Nop Instruction将指令整体 NOP 化功能描述将当前指令所占的全部字节用 NOP空操作指令填充。Cutter 会按指令实际长度填满 NOP不会多填也不会少填。操作步骤右键点击一条指令选择Edit - Nop Instruction。底层实现nopInstructionTriggered()直接调用Core()-nopInstruction(offset)底层封装了 rizin 的rz_core_hack(core, nop)命令src/core/Cutter.cpp。该命令内部会先解码当前地址的指令、确定其字节长度再以对应数量的 NOPx86 下通常为0x90整体覆盖。执行后同样发出instructionChanged信号刷新视图。适用场景快速禁用函数调用、函数序言/尾声如栈帧建立指令抹除条件跳转或冗余 mov 指令用于控制流改造相比手动计算指令长度的 Edit Bytes 方式Nop Instruction 由工具自动按指令长度填充更安全高效。Reverse Jump反转条件跳转功能描述针对条件跳转指令Cutter 自动识别其反义指令并完成替换例如je相等则跳与jne不相等则跳互换。该功能只对条件跳转conditional jump生效。操作步骤右键点击一条条件跳转指令选择Edit - Reverse Jump。菜单的智能显隐与前面三个操作不同Reverse Jump 并非始终可见。菜单弹出前showReverseJmpQuery()会解码当前指令并检查其操作类型是否为RZ_ANALYSIS_OP_TYPE_CJMP条件跳转只有满足条件才显示该菜单项src/menus/DisassemblyContextMenu.cpp。因此在jmp等无条件跳转上右键时看不到此选项。底层实现jmpReverseTriggered()调用Core()-jmpReverse(offset)底层封装 rizin 的rz_core_hack(core, recj)命令src/core/Cutter.cpp由 rizin 根据指令集规则自动选择反义助记符。典型场景绕过登录/授权检查将jne authorized反转为je authorized修改循环终止条件、越界检查等分支逻辑相比手动重写整条指令反转跳转仅改一个条件码改动面最小。实践要点与注意事项可写模式前提四个操作均需经过prepareForWriting()检查。若当前为只读模式Cutter 会引导切换到 Cache内存中修改退出时决定是否写回或 Write直接写盘模式请按需选择汇编器依赖Edit Instruction依赖 rizin 内置汇编器菜单弹出时通过actionEditInstruction.setEnabled(Core()-hasAssembler())控制可用性src/menus/DisassemblyContextMenu.cpp若架构没有对应汇编支持该项会置灰改动可追踪每次写入都会发出instructionChanged信号反汇编、图、十六进制视图等关联组件会同步刷新存档提醒修改属于文件级变更请结合 Cutter 的 IO 模式与文件保存流程确认是否需要持久化到磁盘。延伸阅读完整的反汇编右键菜单功能列表复制、注释、Flag、函数编辑、交叉引用等docs/source/user-docs/menus/disassembly-context-menu.rst菜单各子项与界面组织源码src/menus/DisassemblyContextMenu.cpp指令/字节编辑对话框实现src/dialogs/EditInstructionDialog.cpp 与 src/dialogs/EditInstructionDialog.ui底层写入指令封装src/core/Cutter.cpp反汇编与图视图相关功能src/widgets/DisassemblyWidget.cpp 与 src/widgets/DisassemblerGraphView.cpp【免费下载链接】cutterFree and Open Source Reverse Engineering Platform powered by rizin项目地址: https://gitcode.com/gh_mirrors/cu/cutter创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表