
1. 嵌入式固件改字节为什么绕不开 dd 和 010 Editor做嵌入式开发或者逆向分析时经常遇到一个很具体的需求整个固件几 MB但只需要改其中一个字节。比如某个校验位要翻转、某个配置标志要从 0x00 改成 0x01、某个版本号字符串里的数字要替换。这时候你不可能重新编译整个工程也不一定拿得到源码只能直接对二进制文件动手。改二进制文件里的某个字节本质上就两件事第一找到这个字节在文件里的偏移量第二把新值写进去而且不能破坏后面的内容。听起来简单但实际操作里坑不少——用错参数会把文件截断偏移算错会改到隔壁字节写完不验证根本不知道有没有生效。我平时主要用两种方式配合命令行用 dd 做精准写入适合脚本化和批量处理图形化用 010 Editor 做交叉验证和可视化定位适合确认偏移和检查结果。这篇就围绕嵌入式固件和二进制补丁这个场景把 dd 按偏移改写单字节的完整流程讲清楚包括偏移怎么算、命令怎么写、hexdump 怎么对比验证以及 010 Editor 在哪个环节介入最合适。适合谁看写过固件但没直接改过二进制的嵌入式工程师、做固件补丁和逆向分析的开发者、以及需要自动化修改二进制文件的测试人员。下面所有命令都可以直接复制到 Linux 或 macOS 终端里跑Windows 下用 WSL 或者 Git Bash 也能执行。2. 前置准备TaoToken 与工具链在动手改字节之前先把环境和工具理清楚。dd 是 Linux/macOS 自带的不用额外装010 Editor 是图形化十六进制编辑器Windows/macOS/Linux 都有版本。如果你在写脚本自动化处理固件可能还会用到 Python 或者 shell 来批量调用 dd。另外如果你在开发过程中需要调用大模型来辅助分析固件结构、生成补丁脚本或者解释某段汇编可以用 TaoToken 做统一的模型接入。它的 API 地址是 https://taotoken.net/api 兼容常见的 OpenAI 风格调用方式在脚本里直接配 base_url 就能用。对于需要长期跑编码任务或者 Agent 流程的场景可以了解下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。如果只是想快速验证某个模型对二进制格式的理解可以直接在模型对话页面测试https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。工具链清单工具用途获取方式dd命令行按偏移写入字节Linux/macOS 自带010 Editor图形化定位偏移、交叉验证官网下载hexdump / xxd查看二进制内容Linux/macOS 自带printf生成要写入的字节shell 内置TaoToken API脚本中调用模型辅助分析https://taotoken.net/api先把这些准备好后面操作会顺畅很多。特别提醒改任何二进制文件之前先备份一份原始文件这是铁律。3. 可复制配置dd 按偏移改写单字节的完整命令3.1 理解 dd 的关键参数dd 的核心逻辑是从输入读数据写到输出可以控制读多少、写到哪里、怎么转换。改单个字节时最关键的几个参数是if输入文件这里我们用管道从 printf 拿数据所以不写 ifof输出文件也就是你要改的那个二进制文件bs1块大小设为 1 字节这样 seek 和 count 的单位就是字节count1只写 1 个字节seekN跳过输出文件的前 N 个字节从第 N 个字节开始写convnotrunc不截断输出文件这个必须加否则文件会被截成只剩前面部分注意 seek 是从 0 开始计数的。seek27 表示从文件开头跳过 27 个字节写入位置是第 28 个字节偏移量 27。这一点很容易搞混后面会专门讲偏移计算。3.2 基础命令写入一个字节假设要把 temp.elf 文件中偏移量 27 处的字节改成 0x80命令如下printf \x80 | dd oftemp.elf bs1 count1 seek27 convnotrunc拆解一下printf 生成一个字节 0x80通过管道传给 dddd 把这个字节写到 temp.elf 的偏移量 27 处只写 1 个字节不截断文件。执行后会看到类似输出10 records in 10 records out 1 byte copied, 0.000123 s, 8.1 kB/s这说明写入了 1 个字节成功。3.3 写入多个字节如果要连续写入多个字节比如把偏移量 27 开始的 4 个字节改成 0x80 0x01 0x02 0x03printf \x80\x01\x02\x03 | dd oftemp.elf bs1 count4 seek27 convnotrunccount 改成 4printf 里按顺序写多个 \x 转义即可。3.4 从文件读取要写入的字节如果新值不是手写的而是来自另一个文件比如 patch.bindd ifpatch.bin oftemp.elf bs1 count1 seek27 convnotrunc这里 if 指定输入文件count 控制写几个字节。3.5 偏移量的计算方式偏移量怎么来几种常见途径第一种用 010 Editor 打开文件光标点到目标字节底部状态栏会显示偏移量Offset直接读出来。第二种用 hexdump 或 xxd 查看配合 grep 定位。比如找字符串 VERSION 的位置xxd temp.elf | grep -i version输出会显示偏移量和对应的十六进制内容。第三种如果知道目标字节在某个结构体里的相对位置加上结构体在文件中的起始偏移算出绝对偏移。第四种用 readelf 或 objdump 查看节区偏移再叠加节内偏移。不管用哪种方式算出来的偏移量直接填到 seek 里就行。记住 seek 的值等于偏移量不是偏移量加一。4. 验证请求与成功结果hexdump 对比与 010 Editor 交叉验证4.1 改写前的 hexdump先看改写前偏移量 27 附近的内容hexdump -C -s 16 -n 32 temp.elf参数说明-C 显示十六进制和 ASCII-s 16 从偏移量 16 开始-n 32 显示 32 个字节。输出示例00000010 00 00 00 00 00 00 00 00 00 00 00 41 42 43 44 45 |...........ABCDE| 00000020 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 |FGHIJKLMNOPQRSTU|偏移量 27 对应的是第一行里的第 12 个字节0x10 11 0x1B 27也就是 0x41字符 A。4.2 执行改写printf \x80 | dd oftemp.elf bs1 count1 seek27 convnotrunc4.3 改写后的 hexdumphexdump -C -s 16 -n 32 temp.elf输出00000010 00 00 00 00 00 00 00 00 00 00 00 80 42 43 44 45 |...........\x80BCDE| 00000020 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 |FGHIJKLMNOPQRSTU|可以看到偏移量 27 处的 0x41 变成了 0x80后面的 0x42 0x43 0x44 0x45 都没变。这说明写入成功而且没有破坏后续内容。4.4 用 010 Editor 交叉验证打开 010 Editor加载 temp.elf按 CtrlG 跳转到偏移量 27确认该位置显示为 0x80。同时检查文件大小有没有变化——如果 dd 忘了加 convnotrunc文件会被截断成 28 字节010 Editor 里一眼就能看出来。010 Editor 还有一个好处是可以直接编辑并保存适合手动微调。但如果是批量处理或者需要脚本化还是 dd 更合适。两者配合010 Editor 用来定位和验证dd 用来执行写入。4.5 用 cmp 做二进制对比如果想确认只改了一个字节可以用 cmp 对比原始备份和修改后的文件cmp -l temp.elf.bak temp.elf输出会列出所有不同的字节位置和值。如果只输出一行说明只改了一个字节。5. 本篇常见错排查5.1 文件被截断现象改完之后文件变小了后面的内容全没了。原因dd 默认会截断输出文件除非加 convnotrunc。解决命令里必须带 convnotrunc。这是最常见的坑没有之一。5.2 偏移量算错改到了隔壁字节现象hexdump 一看目标字节没变旁边的字节变了。原因seek 的值和偏移量的对应关系搞混了。seek27 是从第 0 字节跳过 27 个写入第 28 个字节也就是偏移量 27。如果你以为 seek27 是写第 27 个字节偏移量 26就会错一位。解决记住 seek 的值等于目标字节的偏移量。用 010 Editor 确认偏移量后再填。5.3 bs 没设成 1seek 单位不对现象写入位置偏离很远。原因bs 默认是 512 字节seek27 表示跳过 27 个 512 字节的块也就是偏移量 13824完全不是你要的位置。解决改单字节时 bs1 必须显式写上。5.4 printf 的转义问题现象写入的字节不是预期的值。原因不同 shell 对 printf 的 \x 转义支持不一样。bash 里 printf \x80 没问题但某些 sh 或者 zsh 配置下可能不识别。解决用 printf \x80 单引号或者用 echo -e 配合或者直接用 Python 生成字节。更稳妥的方式是用 xxd -r 从十六进制文本还原echo 80 | xxd -r -p | dd oftemp.elf bs1 count1 seek27 convnotrunc5.5 权限不足现象dd 报错 Permission denied。原因目标文件没有写权限或者被其他进程占用。解决chmod w temp.elf或者用 sudo。如果是嵌入式设备上的文件确认文件系统不是只读挂载的。5.6 写入后程序跑不起来现象字节改对了但固件烧录后设备不启动。原因可能改的字节涉及校验和、签名或者关键跳转指令。改完单字节后相关的 CRC 或哈希需要重新计算。解决确认目标字节是否受校验保护。如果是改完之后要同步更新校验值。这一步用 dd 单独改校验字段或者用脚本重新计算。6. 接入与自动化用 TaoToken 辅助固件分析如果你在批量处理固件补丁或者需要分析二进制结构来决定改哪个字节可以把 TaoToken 接进你的脚本流程。API 地址是 https://taotoken.net/api 兼容 OpenAI 风格的调用在 Python 里这样配from openai import OpenAI client OpenAI( base_urlhttps://taotoken.net/api, api_key你的API Key ) response client.chat.completions.create( modelclaude-sonnet-4-20250514, messages[ {role: user, content: 帮我分析这段 hexdump找出可能的版本号字段偏移} ] ) print(response.choices[0].message.content)API Key 在控制台创建https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里面有各语言的调用示例。对于需要长期跑编码任务或者 Agent 流程的场景Coding Plan 提供了更稳定的配额和并发https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。如果你用的是 Claude Code 或者类似的编码工具可以参考 Anthropic 接入配置https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。实际用下来把 dd 写入和模型辅助分析结合起来处理固件补丁的效率会高很多。模型帮你定位偏移和判断影响范围dd 负责精准执行010 Editor 做最终验证。整个流程跑通之后改一个字节就是几秒钟的事。