![如何使用 Bash 在二进制文件中查找 2 个字节、增加它们的值并进行替换?](https://linux22.com/image/46036/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20Bash%20%E5%9C%A8%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6%E4%B8%AD%E6%9F%A5%E6%89%BE%202%20%E4%B8%AA%E5%AD%97%E8%8A%82%E3%80%81%E5%A2%9E%E5%8A%A0%E5%AE%83%E4%BB%AC%E7%9A%84%E5%80%BC%E5%B9%B6%E8%BF%9B%E8%A1%8C%E6%9B%BF%E6%8D%A2%EF%BC%9F.png)
我尝试在二进制文件中找到两个字节,然后增加这两个字节的值并在文件中替换它们。这两个字节位于 0x82-0x83 位置。目前,我已经使用以下命令成功提取了这两个字节:
#!/usr/bin/env bash
BYTES=$(tail -c +131 "$1" | head -c 2)
这些字节具有值:1B 1F
。我被困住了:
- 如何将字节转换为整数?它应该是
6943
十进制。 - 如何将二进制数据附加/回显到文件
- 如何在文件内的位置 0x82-0x83 上写入增加的字节。我可以使用
head -c 130 original.bin >> new_file.bin && magic_command_writing_bytes_to_file >> new_file.bin && tail -c +133 original.bin
,但一定有更好的方法。
我可以在 PHP 中做到这一点,它应该更容易,但我感兴趣如何在 bash 中做到这一点。
答案1
使用此文件进行测试:
$ echo hello world > test.txt
$ echo -n $'\x1b\x1f' >> test.txt
$ echo whatever >> test.txt
$ hexdump -C test.txt
00000000 68 65 6c 6c 6f 20 77 6f 72 6c 64 0a 1b 1f 77 68 |hello world...wh|
00000010 61 74 65 76 65 72 0a |atever.|
$ grep -a -b --only-matching $'\x1b\x1f' test.txt
12:
所以在这种情况下,1B 1F
位于位置12
。
转换为整数(可能有更简单的方法)
$ echo 'ibase=16; '`xxd -u -ps -l 2 -s 12 test.txt` | bc 6943
反之亦然:
$ printf '%04X' 6943 | xxd -r -ps | hexdump -C 00000000 1b 1f |..| $ printf '%04X' 4242 | xxd -r -ps | hexdump -C 00000000 10 92 |..|
并将其放回文件中:
$ printf '%04X' 4242 | xxd -r -ps | dd of=test.txt bs=1 count=2 seek=12 conv=notrunc 2+0 records in 2+0 records out 2 bytes (2 B) copied, 5.0241e-05 s, 39.8 kB/s
结果:
$ hexdump -C test.txt 00000000 68 65 6c 6c 6f 20 77 6f 72 6c 64 0a 10 92 77 68 |hello world...wh| 00000010 61 74 65 76 65 72 0a |atever.|
答案2
哦对不起。这个答案已经过时了,因为我认为你的文件中有以 ascii 形式写入的十六进制值。
您可以通过将十六进制数转换为十进制数printf "%d" 0x1B1F
。
如果您已将字节保存在变量中,BYTES=1B1F
那么您将得到结果printf "%d" 0x$BYTES
。
所以,如果你想增加数量
$ echo $(($(printf "%d" 0x$BYTES) +1))
6944
然后再转换回来
printf '%X' $(($(printf "%d" 0x$BYTES) +1))
1B20