news 2026/9/13 4:48:13

Linux下用sed和xxd处理二进制文件的技巧

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux下用sed和xxd处理二进制文件的技巧

1. 项目概述:二进制文件与sed的奇妙碰撞

在Linux系统管理中,我们经常使用sed命令处理文本文件,但很少有人意识到这个强大的流编辑器还能操作二进制文件。传统认知中,sed是文本处理工具,而二进制文件似乎属于hexdump或xxd的领域。但实际上,通过巧妙的参数组合和编码转换,sed完全可以胜任简单的二进制文件修改任务。

我最初发现这个技巧是在调试一个嵌入式设备时,需要修改固件中的某个配置标志位。当时手头没有专业的十六进制编辑器,但发现sed配合适当的编码转换,竟然完美解决了问题。这种方法特别适合以下场景:

  • 快速修改二进制文件中的特定字节序列
  • 在自动化脚本中批量处理固件文件
  • 系统恢复时修改关键二进制配置
  • 嵌入式开发中的快速原型调试

2. 核心原理:二进制与文本的编码转换

2.1 二进制表示法的本质

二进制文件本质上是由字节序列组成,每个字节对应0-255的数值。sed处理二进制文件的关键在于正确编码转换:

二进制字节 <-> 十六进制表示 <-> 文本格式

常用的转换方式包括:

  • xxd:将二进制转为十六进制文本
  • hexdump:类似xxd但输出格式不同
  • od:八进制/十六进制转储工具
  • tr:字符替换工具

2.2 sed处理二进制的工作流程

完整处理流程分为四个阶段:

  1. 二进制转文本
xxd -p input.bin > temp.hex

将二进制文件转换为连续的十六进制字符串,每字节对应两个十六进制字符。

  1. sed文本处理
sed 's/c3a8/c3a9/g' temp.hex > modified.hex

在十六进制文本中查找替换特定字节序列。

  1. 文本转二进制
xxd -r -p modified.hex > output.bin

将修改后的十六进制文本转回二进制格式。

  1. 校验处理
cmp -l input.bin output.bin | head -n 5

对比原始文件和修改后的差异。

3. 实战操作:修改二进制文件中的魔数

3.1 准备测试文件

首先创建一个包含特定字节序列的测试文件:

echo -n -e '\x7f\x45\x4c\x46\x02\x01\x01\x00' > elf_header.bin

这是一个ELF文件头的起始魔数。

3.2 查找替换操作

执行完整的查找替换流程:

xxd -p elf_header.bin | sed 's/7f454c46/7f454c47/g' | xxd -r -p > modified_elf.bin

这里我们将ELF魔数中的'F'(0x46)改为'G'(0x47)。

3.3 高级模式匹配

对于复杂的二进制模式,可以使用正则表达式:

xxd -p firmware.bin | sed -E 's/(01)([0-9a-f]{2})(00)/\1ff\3/g' | xxd -r -p > patched_firmware.bin

这个命令查找01 XX 00模式的字节序列,并将中间的XX替换为ff。

4. 注意事项与疑难解答

4.1 常见问题处理

  1. 编码问题: 如果直接使用sed处理二进制文件可能导致编码错误。务必先通过xxd转换:
# 错误方式 sed 's/\x7fELF/\x7fELG/' binary_file # 可能损坏文件 # 正确方式 xxd -p binary_file | sed 's/7f454c46/7f454c47/' | xxd -r -p
  1. 大小写敏感: 十六进制匹配默认区分大小写,建议统一处理:
xxd -p file.bin | tr 'a-f' 'A-F' | sed 's/C3A8/D3A9/g' | xxd -r -p
  1. 多行处理: 默认xxd每行显示有限字节,添加-c参数:
xxd -p -c 1000000 large_file.bin > large_file.hex # 单行输出

4.2 性能优化技巧

对于大文件处理:

  1. 使用管道避免临时文件:
xxd -p bigfile.bin | sed 's/pattern/replacement/' | xxd -r -p > newfile.bin
  1. 限制替换范围:
dd if=large.bin bs=1k count=100 | xxd -p | sed 's/.../' | xxd -r | dd of=large.bin conv=notrunc

只处理文件前100KB部分。

  1. 并行处理:
split -b 10M bigfile.bin chunk_ for f in chunk_*; do xxd -p $f | sed 's/.../' | xxd -r -p > new_$f & done wait cat new_chunk_* > new_bigfile.bin

5. 高级应用场景

5.1 固件版本号修改

假设固件中版本号存储在特定偏移量:

# 查找替换版本号1.0.0(31 2e 30 2e 30)为1.0.1 xxd -p firmware.img | sed 's/312e302e30/312e302e31/' | xxd -r -p > new_firmware.img

5.2 二进制文件打补丁

创建补丁脚本:

#!/bin/bash # patch_binary.sh ORIG=$1 NEW=$2 PATTERN=$3 REPLACE=$4 xxd -p "$ORIG" | sed "s/$PATTERN/$REPLACE/g" | xxd -r -p > "$NEW"

使用示例:

./patch_binary.sh original.bin patched.bin "deadbeef" "cafebabe"

5.3 嵌入式开发调试

修改硬件寄存器配置:

# 将GPIO配置从0xA0改为0xB0 xxd -p config.bin | sed 's/a0/b0/' | xxd -r -p > new_config.bin

6. 安全注意事项

  1. 备份原始文件
cp original.bin original.bin.bak

二进制文件一旦损坏可能无法恢复。

  1. 校验修改
sha1sum original.bin modified.bin diff <(xxd original.bin) <(xxd modified.bin)
  1. 权限管理
chmod 400 original.bin # 防止意外修改 sudo chown root:root system_binary # 保持系统文件权限
  1. 文件锁定
flock -x original.bin -c "xxd -p original.bin | sed 's/.../' | xxd -r -p > modified.bin"

7. 替代方案比较

工具/方法优点缺点适用场景
sed+xxd无需安装额外工具,适合脚本化处理大文件效率低简单字节替换
hexedit交互式操作直观需要单独安装手动编辑
bbe专为二进制编辑设计学习曲线陡峭复杂二进制处理
radare2功能强大体积庞大逆向工程
Python灵活可控需要编程知识复杂逻辑处理

对于大多数简单替换,sed+xxd组合是最轻量快速的解决方案。我在路由器固件修改中,90%的情况都使用这种方法。

8. 实战经验分享

  1. 处理含换行符的二进制
tr -d '\n' < binary_file | xxd -p | sed '...' | xxd -r -p

先移除所有换行符避免解析错误。

  1. 精确偏移量修改
dd if=file.bin bs=1 count=100 > header xxd -p header | sed 's/.../' | xxd -r -p > new_header dd if=file.bin bs=1 skip=100 > body cat new_header body > new_file.bin
  1. 批量处理技巧
find /firmware -name "*.bin" -print0 | xargs -0 -I{} sh -c 'xxd -p "{}" | sed "s/old/new/g" | xxd -r -p > "{}.new"'
  1. 版本回退方案
# 保存替换记录 echo "Replaced $(xxd -p file.bin | grep -c 'pattern') occurrences" >> patch.log # 使用git管理修改 git init && git add . && git commit -m "Before binary patch"

这些技巧都是我在实际工作中积累的宝贵经验,特别是处理嵌入式系统固件时,这种轻量级方法往往是最快捷的解决方案。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 4:47:24

GPT-4到智能体的技术跃迁与多模态AI发展

1. 大模型技术演进全景&#xff1a;从GPT-4到智能体的关键跃迁2023年GPT-4的发布标志着大语言模型&#xff08;LLM&#xff09;进入工业化应用阶段&#xff0c;而2024年GPT-4o的推出则彻底改写了多模态交互的规则手册。作为从业者&#xff0c;我亲历了从单模态文本处理到全模态…

作者头像 李华
网站建设 2026/9/13 4:45:13

VeapAI:一站式开源AI知识库与RAG问答平台

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 4:43:57

自适应RAG技术解析:动态优化检索与生成策略

1. 什么是Adaptive RAG&#xff1f;Adaptive RAG&#xff08;自适应检索增强生成&#xff09;是传统RAG技术的进阶版本&#xff0c;它通过动态调整检索策略和生成过程&#xff0c;使大模型能够更智能地应对不同复杂度的查询需求。简单来说&#xff0c;就像给AI装了个"智能…

作者头像 李华