如何在Shell脚本中修改二进制文件?

3

有没有一种命令可以在shell中修改二进制文件?

首先,我创建了一个所有值都为0xFF的文件:

dd if=/dev/zero ibs=1K count=1 | tr "\000" "\377" > ./Test.img
hexdump Test.img

输出:

0000000 ffff ffff ffff ffff ffff ffff ffff ffff
*
0000400

接下来,我想修改一些字节值,例如:

0000000 aaaa ffff bbbb ffff cccc ffff ffff ffff
*
0000400

我该怎样改变那个呢?或者说有没有一个Shell脚本命令可以做到这一点?

1
请查看以下链接:http://unix.stackexchange.com/questions/214820/patching-a-binary-with-dd - xvan
Unix&Linux问题是“使用dd修补二进制文件”。 - Peter Mortensen
2个回答

2

使用Python

Python被设计成二进制兼容的,因此这里介绍一种方法:

python -c 'open("New.img", "wb").write( "\xaa\xaa\xff\xff\xbb\xbb\xff\xff\xcc\xcc" + open("Test.img", "rb").read()[10:] )'

我们可以使用 hexdump 命令来查看生成的文件:
hexdump New.img

输出:

0000000 aaaa ffff bbbb ffff cccc ffff ffff ffff
0000010 ffff ffff ffff ffff ffff ffff ffff ffff
*
0000400

使用Shell

Shell不是二进制安全的。例如,任何Shell字符串都不能包含字符\x00。因此,任何使用Shell的方法都可能会遇到令人不愉快的意外。然而,如果必须使用Shell,请尝试以下方法:

LC_ALL=C; { printf "%s" $'\xaa\xaa\xff\xff\xbb\xbb\xff\xff\xcc\xcc'; tail -c+11 New.img; } >New2.img

谢谢,但我想使用 shell 而不是 Python。 - CK vir
@CKvir 好的。已添加 Shell 方法,但请注意问题是固有的。 - John1024
如果我想更改第二行或其他行,我该怎么做? 0000010 ffff ffff ffff ffff ffff ffff AAAA ffff ...... 0000030 ffff ffff ffff ffff BBBB ffff ffff ffff - CK vir
而且还有一些问题,无论使用Python还是Shell,文件大小都会改变,我不希望文件大小改变,并且其他二进制值仍然保持为0xff,这可能吗? - CK vir
在我的测试中,无论是哪种方法,文件大小都没有改变。 - John1024

0
你可以使用vim -b bin-file-name。这将启动二进制模式下的Vim,允许您对任何文件进行任何操作,只要您知道自己在做什么即可。

问题是关于在 Shell 脚本中进行编辑。 - goertzenator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接