8

I'm trying to find two bytes inside binary file, then increase value of those two bytes and replace them inside file. Those two bytes are on positions 0x82-0x83. For now on I have successfully extracted those two bytes using this:

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

Those bytes have value: 1B 1F. I'm stuck with:

  1. How to convert bytes to integer? It should be 6943 decimal.
  2. How to append / echo binary data to file
  3. How to write increased bytes inside file on positions 0x82-0x83. I could use head -c 130 original.bin >> new_file.bin && magic_command_writing_bytes_to_file >> new_file.bin && tail -c +133 original.bin, but there must be better way.

I could do that in PHP, it should be easier, but I'm interested how to do this in bash.

0

2 Answers 2

7

Testing with this file:

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

So in this case the 1B 1F is at position 12.

  • Convert to integer (there is probably an easier way)

    $ echo 'ibase=16; '`xxd -u -ps -l 2 -s 12 test.txt`  | bc
    6943
    
  • And the reverse:

    $ printf '%04X' 6943 | xxd -r -ps | hexdump -C
    00000000  1b 1f                                             |..|
    $ printf '%04X' 4242 | xxd -r -ps | hexdump -C
    00000000  10 92                                             |..|
    
  • And putting it back in the file:

    $ 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
    
  • Result:

    $ 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.|
    
3
  • Yes, It's exactly what I was looking for. Thanks.
    – piotrekkr
    Aug 30, 2013 at 13:11
  • @frostschutz: There is a bug —a missing \x— in line two of your example code. It should be echo -n $'\x1b\x1f' >> test.txt.
    – erik
    Aug 30, 2013 at 20:07
  • 1
    Convert to integer (there is probably an easier way) Oh yes, there is! :) erik chose the best command, so I'll just adapt his line to yours: printf "%d" 0x1B1F will do the job just fine to obtain your 6943 result; going from that, you can use a significantly smarter line like printf "%d" $(xxd -u -ps -l 2 -s 12 test.txt) instead and you won't be needing bc any longer. Dec 2, 2014 at 17:08
3

Oh, sorry. This answer is obsolete, because I thought you have hexadecimal values written as ascii in your file.


You can convert the hex numbers to decimal system via printf "%d" 0x1B1F.

If you have saved the bytes in a variable BYTES=1B1F then you get the result with printf "%d" 0x$BYTES.

So, if you want to increase the number do

$ echo $(($(printf "%d" 0x$BYTES) +1))
6944

Then convert it back

printf '%X' $(($(printf "%d" 0x$BYTES) +1))
1B20

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .