我有一个 android 启动映像,每次刷新内核时都需要对其进行修补。修补包括使用十六进制编辑器(我使用了 ghex)向启动映像添加 4096 个字节,这是一个非常繁琐的过程,因为您必须手动将 4096 个数字添加到文件中。因此,我想编写一个脚本来自动化该过程。
它不像简单地编辑文件,它需要十六进制编辑器。
具体来说,我想附加 0x30、0x83、0x19、0x89、0x64,然后是 0x00
答案1
这是你应该能够做的事情dd
免责声明:请记住,它dd
被亲切地称为d冰岛克朗destroyer:在尝试此操作之前,请确保您对原始文件有足够的备份。
例如,我们首先创建一个最小测试文件:
$ printf 'hello' > testfile
$ xxd testfile
00000000: 6865 6c6c 6f hello
当然,这只是 5 个字节 - 实际上它将是您的图像文件。
现在我们要写入更多字节,0x30、0x83、0x19、0x89、0x64,并用空字节 0x00 填充,直到块大小达到(比如说)128 字节,然后将其附加到文件中。这只是为了说明- 您实际上将ibs=4096
在您的案例中使用。
$ printf '\x30\x83\x19\x89\x64' | dd of=testfile ibs=128 conv=sync,notrunc oflag=append
0+1 records in
0+1 records out
128 bytes copied, 0.000500623 s, 256 kB/s
我们来检查一下结果:
$ xxd testfile
00000000: 6865 6c6c 6f30 8319 8964 0000 0000 0000 hello0...d......
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000080: 0000 0000 00 .....
这是原始的 5 个字节testfile
,后面跟着填充到 128 字节块大小的新字节序列,总共 133 个字节(十六进制偏移量00000085
)。
答案2
两者head
都tail
可以通过他们的--bytes
选择对您的文件进行手术。
# assume: boot.img is the to-be-modified file, my4096 is your 4096 bytes,
# and you want to replace bytes 4097-8192 of the file. newboot.img is the result.
( \
head --bytes=4096 boot.img ;\
cat my4096;\
tail --bytes=+8193 boot.img \
) >newboot.img
或者,您可以使用ed
, 或sed
, 或 ...