Cutter 逆向工程实战:Hexdump 右键菜单的 Patching(补丁写入)完整指南

发布时间:2026/9/20 23:13:31
Cutter 逆向工程实战:Hexdump 右键菜单的 Patching(补丁写入)完整指南 Cutter 逆向工程实战Hexdump 右键菜单的 Patching补丁写入完整指南【免费下载链接】cutterFree and Open Source Reverse Engineering Platform powered by rizin项目地址: https://gitcode.com/gh_mirrors/cu/cutter本文基于 Cutter基于 rizin 的免费开源逆向工程平台文档 docs/source/user-docs/menus/hexdump-context-menu/patching.rst 编写系统讲解 Hexdump 视图右键菜单Edit子菜单下全部 9 种补丁写入功能的用途、操作步骤与底层实现原理。读完本文你将掌握在二进制文件中写入字符串、宽字符串、Base64 编码数据、零字节与随机字节以及执行数值增减、偏移复制等二进制修补技能并理解 Cutter 的 IO 模式只读/缓存/写模式如何保障写入安全。前置知识打开 Hexdump 视图与理解写入目标地址Hexdump 是 Cutter 中用于以十六进制字节形式查看和编辑原始数据的核心视图。执行本文所有 Patching 操作前需要先通过主菜单View - Hexdump或快捷键打开将 Hexdump 面板调出并在其中用鼠标点击或键盘移动光标到目标字节位置。写入的目标地址由光标位置或选区共同决定。从源码看HexWidget::getLocationAddress()的实现为RVA HexWidget::getLocationAddress() { return !selection.isEmpty() ? selection.start() : cursor.address; }见 src/widgets/HexWidget.cpp即如果当前存在多字节选区所有写操作都会作用于选区起点如果没有选区则作用于光标所在地址。这一点对所有 Patching 功能都适用是理解后续行为的基础。IO 写入模式所有写操作的安全前提在执行任何写操作前Cutter 都会调用IOModesController::prepareForWriting()检查当前文件打开模式见 src/common/IOModesController.henum class Mode { READ_ONLY, CACHE, WRITE };Read-Only只读文件以只读方式打开所有编辑功能不可用Cache缓存/IO Cache修改先写入内存缓存不会直接落盘可在确认无误后通过File - Commit modifications to disk手动提交Write写修改会直接提交到磁盘上的文件。若文件处于只读模式prepareForWriting()会弹出错误对话框见 src/common/IOModesController.cpp提示用户当前无法编辑并提供三个选项Cancel取消本次写操作Reopen in Write mode以写模式重新打开文件需承担直接落盘风险Enable Cache mode开启缓存模式将修改暂存于内存之后可手动提交。对话框同时给出安全警告Write 模式下所有变更会立即提交到磁盘为了安全建议使用 Cache 模式并在确认后手动提交。这是 Cutter 对二进制修补操作的第一道保护机制。此外若已存在未提交的缓存修改切换模式时还会弹出确认框询问是否提交Save、丢弃Discard或取消Cancel对应源码中的askCommitUnsavedChanges()。字符串类写入字符串类功能集中在右键菜单Edit子菜单的上半部分源码中对应actionsWriteString动作列表见 src/widgets/HexWidget.cpp。它们都遵循同一操作路径右键点击目标字节 - 选择Edit- 选择对应写入项 - 在弹出的输入框中输入字符串。1. Write string写入 ASCII 字符串Description官方定义在当前地址写入 ASCII 字符串。若选择了多个字节字符串从选区起点开始写入。注意本项不会写入 null 终止符\0也不会写入宽字符串wide string如需这些特性请使用其他菜单项。Steps右键点击一个字节选择Edit - Write string。底层调用rz_core_write_string_at()见 src/widgets/HexWidget.cpp输入框标题为 Write string。由于不附加终止符写入后紧跟的原始字节会保留因此该功能适用于覆盖已有等长内容或非 C 字符串场景。2. Write length and string写入带长度前缀的字符串Description在当前地址写入一个长度前缀 ASCII 字符串。若选择了多个字节字符串从选区起点写入。虽然概念上与 Windows 的BSTRBasic String前 4 字节为长度、后随宽字符数据类似但本项不会在字符串末尾追加 WCHAR 类型的 null 终止符。Steps右键点击一个字节选择Edit - Write length and string。底层调用rz_core_write_length_string_at()见 src/widgets/HexWidget.cpp。适合构造 Pascal 风格或自定义带长度字段的字符串数据结构常用于逆向分析中手工构造序列化数据。3. Write wide string写入宽字符串Description在当前地址写入null 终止的宽字符串wide string。若选择了多个字节字符串从选区起点写入。Steps右键点击一个字节选择Edit - Write wide string。底层调用rz_core_write_string_wide_at()见 src/widgets/HexWidget.cpp。宽字符串即每个字符占 2 字节UTF-16LE 风格的字符串常见于 Windows 程序如Ltext或 Unicode 场景。该功能会自动为字符串附加宽字符 null 终止符2 个零字节。4. Write zero terminated string写入 null 终止字符串Description在当前地址写入null 终止的 ASCII 字符串。若选择了多个字节字符串从选区起点写入。Steps右键点击一个字节选择Edit - Write zero terminated string。底层调用rz_core_write_string_zero_at()见 src/widgets/HexWidget.cpp。这是标准 C 字符串的写入方式末尾自动追加0x00终止符适合修补二进制中的 C 风格字符串常量如文件名、提示消息、符号名等也是四个字符串类功能中最常用的一个。字符串类功能对比小结菜单项终止符编码底层 API典型用途Write string无ASCII/UTF-8rz_core_write_string_at覆盖等长内容Write length and string无长度前缀在前ASCII/UTF-8rz_core_write_length_string_at构造带长度字段的数据结构Write wide string有宽字符\0\0宽字符rz_core_write_string_wide_at修补 Unicode 字符串Write zero terminated string有0x00ASCII/UTF-8rz_core_write_string_zero_at修补 C 字符串常量四个功能输入框均要求非空字符串输入为空或取消对话框时操作会被安全中止。编码与批量写入5. Write encoded\decoded Base64 string写入编码/解码后的 Base64 字符串Description在当前地址写入 Base64编码后或解码后的字符串。若选择了多个字节字符串从选区起点写入。Steps右键点击一个字节选择Edit - Write De\Encoded Base64 string。在弹出的对话框中选择你要编码一个字符串还是解码一个字符串。该功能弹出Base64EnDecodedWriteDialog对话框 UI 定义见 src/dialogs/Base64EnDecodedWriteDialog.ui实现见 src/widgets/HexWidget.cppEncode 模式调用rz_core_write_base64_at()将输入的字符串先转为十六进制形式再以 Base64 编码写入Decode 模式调用rz_core_write_base64d_at()将输入的 Base64 文本解码为原始字节写入。在 Decode 模式下Cutter 会先校验输入合法性若输入包含 Base64 字母表a-zA-Z0-9/之外的字符、长度不是 4 的倍数或为空会弹出错误框 Error occured during decoding your input. Please, make sure, that it is a valid base64 string and try again. 并中止操作。该功能在逆向中常用于直接写入 shellcode 的 Base64 表示、注入经过编码的数据载荷等场景。6. Write zeroes写入零字节Description在当前地址写入指定数量的 null 字节0x00数量由用户指定。若选择了多个字节零字节从选区起点写入。Steps右键点击一个字节选择Edit - Write zeroes。在弹出的对话框中指定要写入多少个零字节。实现见 src/widgets/HexWidget.cpp若存在选区对话框会默认填充选区大小作为建议值数值输入框范围为1 ~ 0x7FFFFFFF。底层通过writeZeros()以 1024 字节为一批分块写入见 src/widgets/HexWidget.cpp避免为超大区域一次性分配内存。该功能常用来清除敏感数据、构造对齐填充或擦除代码段。7. Write random bytes写入随机字节Description在当前地址写入指定数量的随机字节数量由用户指定。若选择了多个字节字节从选区起点写入。Steps右键点击一个字节选择Edit - Write random bytes。在弹出的对话框中指定要写入多少字节。实现见 src/widgets/HexWidget.cpp与 Write zeroes 相同有选区时默认值为选区大小数值范围为1 ~ 0x7FFFFFFF。底层调用rz_core_write_random_at()。随机字节在脱壳、花指令处理、模糊测试样本构造等场景中常用于破坏或填充目标区域。8. Write hex bytes写入十六进制字节虽然 patching.rst 未将其列为单独小节但它是Edit菜单中实际存在的补充功能见 src/widgets/HexWidget.cpp与编码/批量写入归为一组。实现见 src/widgets/HexWidget.cpp在输入框中输入形如\x90\x90\x90支持\x前缀每 2 个十六进制字符一个字节的字节串解析后调用rz_core_write_at()写入。若存在选区最多写入与选区大小相同的字节数。该功能适合直接输入原始 shellcode 或机器码序列。偏移复制与数值运算Edit子菜单的其余功能源码中对应actionsWriteOther动作列表见 src/widgets/HexWidget.cpp位于分隔线下方聚焦于基于已有数据的修改。9. Duplicate bytes from offset从指定偏移复制字节Description从指定偏移复制 N 个字节到当前地址。复制的字节数与原偏移由用户指定。若选择了多个字节字节从选区起点写入。对话框内会提供预览面板显示将要复制的字节内容。Steps右键点击一个字节选择Edit - Duplicate from offset。在弹出的对话框中指定要从中复制的偏移以及要复制的字节数。实现见 src/widgets/HexWidget.cpp对话框 UI 见 src/dialogs/DuplicateFromOffsetDialog.ui偏移输入框Offset为无掩码的 16 位十六进制输入字节数N bytes为范围1 ~ 999999999的 SpinBox下方bytesLabel滚动区域实时预览待复制字节。底层调用rz_core_write_duplicate_at()。该功能常用于在二进制内搬运代码/数据块、复制函数体到新位置或制作补丁跳板。10. Increment/Decrement bytes字节数值增减Description对当前地址的Byte1 字节、Word2 字节、Dword4 字节或 Qword8 字节进行加/减运算。增减值由用户指定。若选择了多个字节操作作用于选区起点。Steps右键点击一个字节选择Edit - Increment/Decrement。在弹出的对话框中指定要修改的字节宽度Byte/Word/Dword/Qword、运算数值以及选择增加Increment还是减少Decrement。实现见 src/widgets/HexWidget.cpp对话框 UI 见 src/dialogs/IncrementDecrementDialog.ui包含 Interpret as 宽度下拉框、数值输入框以及 Increment/Decrement 两个单选按钮。底层调用rz_core_write_value_inc_at()Decrease 模式下数值取反后执行。这是逆向分析中最精细的修补手段可用于逐字节调整校验和、修改跳转偏移量如jmp的相对偏移、微调立即数等配合 Hexdump 刷新后可立即观察内存变化。操作通用要点与安全建议选区优先所有写操作在存在选区时都以选区起点为写入地址且 Write zeroes / Write random bytes / Write hex bytes 会默认以选区大小为建议长度注意选区只是锚点并不会限制写入区域。写前确认模式所有功能在弹窗输入前都先经过prepareForWriting()检查只读模式无法直接写入需先切换到 Write 或 Cache 模式。建议使用 Cache 模式修补二进制属于高风险操作官方实现也在错误提示中明确建议使用 Cache 模式暂存修改核对无误后再通过File - Commit modifications to disk手动提交避免误操作直接破坏源文件也可随时用撤销/重置缓存resetWriteCache放弃未提交修改。字符串语义差异写入前务必确认目标数据结构是否要求 null 终止符C 字符串或宽字符编码Windows Unicode选错格式会导致字符串被后续字节拼接而无法正确解析。相关资源本文档原文docs/source/user-docs/menus/hexdump-context-menu/patching.rstHexdump 核心实现src/widgets/HexWidget.cpp菜单构建见第 179-219 行写操作实现见第 1398-1627 行IO 模式控制器src/common/IOModesController.cpp、src/common/IOModesController.h相关对话框src/dialogs/IncrementDecrementDialog.ui、src/dialogs/DuplicateFromOffsetDialog.ui、src/dialogs/Base64EnDecodedWriteDialog.uiHexdump 右键菜单其他文档docs/source/user-docs/menus/hexdump-widget-context-menu.rst【免费下载链接】cutterFree and Open Source Reverse Engineering Platform powered by rizin项目地址: https://gitcode.com/gh_mirrors/cu/cutter创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询