如何使用Bash在二进制文件中查找2个字节,增加它们的值并替换?


8

我试图在二进制文件中找到两个字节,然后增加这两个字节的值并将其替换为文件中的字节。这两个字节位于位置0x82-0x83上。现在,我已经使用此命令成功提取了这两个字节:

#!/usr/bin/env bash
BYTES=$(tail -c +131 "$1" | head -c 2)

这些字节的值是:1B 1F。我坚持:

  1. 如何将字节转换为整数?应该是6943十进制。
  2. 如何将二进制数据附加/回显到文件
  3. 如何在位置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中做到这一点感兴趣。

Answers:


5

使用此文件进行测试:

$ 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.|
    

是的,这正是我想要的。谢谢。
piotrekkr 2013年

@frostschutz:\x示例代码的第二行中有一个错误—缺失。应该是echo -n $'\x1b\x1f' >> test.txt
erik

1
转换为整数(可能有更简单的方法)哦,是的!:) erik选择了最好的命令,因此我将根据您的要求调整他的行:printf "%d" 0x1B1F可以很好地完成您的工作6943;从那开始,您可以使用一条更聪明的路线,printf "%d" $(xxd -u -ps -l 2 -s 12 test.txt)bc不再需要。
语法错误

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.