Jos*_*osh 39 shell scripting hex patch edit
是否有任何直接的方法来修改命令行中的二进制文件?假设我知道我的二进制包含1234abcd,我想将其更改为12FFabcd或FFFFabcd,甚至可能是FF34FFab0(你明白了):-)
如果不使用任何特殊用途工具(如http://stahlworks.com/dev/swiss-file-knife.html或类似工具),我将如何实现这一目标.
只使用标准的linux工具从命令行执行它会很棒.
或者甚至更好,而不是搜索十六进制字符串,我想直接替换在Offset 0x10000处写入FF,在Offset 0x100001处写入12,依此类推.
任何的想法?
提前致谢!
PS:我应该添加以下内容:
它应该是可编写脚本的,并直接从命令行运行.我正在寻找类似"二进制 - 包含在发行版 - 写入AB --at-offset 100000 --file thebinary.bin"之类的内容.我很确定使用"dd"是可能的,但是我无法绕过手册页.
Jos*_*osh 75
printf '\x31\xc0\xc3' | dd of=test_blob bs=1 seek=100 count=3 conv=notrunc
Run Code Online (Sandbox Code Playgroud)
dd参数:
一个乔希正在寻找另一个;)
在printf+dd基础的解决方案似乎并没有写出来零工作.这是python3中的通用解决方案(包含在所有现代发行版中),它应该适用于所有字节值...
#!/usr/bin/env python3
#file: set-byte
import sys
fileName = sys.argv[1]
offset = int(sys.argv[2], 0)
byte = int(sys.argv[3], 0)
with open(fileName, "r+b") as fh:
fh.seek(offset)
fh.write(bytes([byte]))
Run Code Online (Sandbox Code Playgroud)
用法...
set-byte eeprom_bad.bin 0x7D00 0
set-byte eeprom_bad.bin 1000 0xff
Run Code Online (Sandbox Code Playgroud)
注意:此代码可以处理十六进制(前缀为0x)和十进制(无前缀)的输入数字.
这是一个Bash函数replaceByte,它采用以下参数:
#!/bin/bash
# param 1: file
# param 2: offset
# param 3: value
function replaceByte() {
printf "$(printf '\\x%02X' $3)" | dd of="$1" bs=1 seek=$2 count=1 conv=notrunc &> /dev/null
}
# Usage:
# replaceByte 'thefile' $offset 95
Run Code Online (Sandbox Code Playgroud)
如果您不需要它可编写脚本,您可以尝试hexedit实用程序。它在许多 Linux 发行版中都可用(如果默认情况下未安装,通常可以在发行版的软件包存储库中找到它)。
如果您的发行版没有它,您可以从源代码构建并安装它。