Write byte at address (hexedit/modify binary from the command line)
Solution 1:
printf '\x31\xc0\xc3' | dd of=test_blob bs=1 seek=100 count=3 conv=notrunc
dd arguments:
- of | file to patch
- bs | 1 byte at a time please
- seek | go to position 100 (decimal)
- conv=notrunc | don't truncate the output after the edit (which dd does by default)
One Josh looking out for another ;)
Solution 2:
Here's a Bash function replaceByte
, which takes the following parameters:
- the name of the file,
- an offset of the byte in the file to rewrite, and
- the new value of the byte (a number).
#!/bin/bash
# param 1: file
# param 2: offset
# param 3: value
function replaceByte() {
printf "$(printf '\\x%02X' $3)" | dd of="$1" bs=1 seek=$2 count=1 conv=notrunc &> /dev/null
}
# Usage:
# replaceByte 'thefile' $offset 95
Solution 3:
The printf+dd
based solutions do not seem to work for writing out zeros. Here is a generic solution in python3 (included in all modern distros) which should work for all byte values...
#!/usr/bin/env python3
#file: set-byte
import sys
fileName = sys.argv[1]
offset = int(sys.argv[2], 0)
byte = int(sys.argv[3], 0)
with open(fileName, "r+b") as fh:
fh.seek(offset)
fh.write(bytes([byte]))
Usage...
set-byte eeprom_bad.bin 0x7D00 0
set-byte eeprom_bad.bin 1000 0xff
Note: This code can handle input numbers both in hex (prefixed by 0x) and dec (no prefix).
Solution 4:
xxd tool, which comes with vim (and thus is quite likely to be available) allows to hex dump a binary file and construct a new binary file from a modified hex dump.