CLI: Ecrire byte à l'adresse (hexedit / modifier binaire à partir de la ligne de commande)

7 réponses

printf '\x31\xc0\xc3' | dd of=test_blob bs=1 seek=100 count=3 conv=notrunc 

arguments dd:

  • | fichier de patch
  • b | 1 octet à la fois s'il vous plaît
  • chercher | aller à la position 100 (décimal)
  • conv=notrunc | ne pas tronquer le résultat après le modifier (dd par défaut)

Un Josh à la recherche pour un autre ;)

61
répondu Josh 2013-03-06 17:32:53

Voici une fonction de Bash replaceByte, qui prend les paramètres suivants:

  • le nom du fichier,
  • un offset du byte dans le fichier à réécrire, et
  • la nouvelle valeur du octet (un nombre).
#!/bin/bash

# param 1: file
# param 2: offset
# param 3: value
function replaceByte() {
    printf "$(printf '\x%02X' )" | dd of="" bs=1 seek= count=1 conv=notrunc &> /dev/null
}

# Usage:
# replaceByte 'thefile' $offset 95
6
répondu sinharaj 2015-05-12 19:52:20

printf+dd les solutions basées ne semblent pas fonctionner pour écrire des zéros. Voici une solution générique en python3 (inclus dans toutes les distributions) qui devrait fonctionner pour toutes les valeurs d'octets...

#!/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]))

Utilisation...

set-byte eeprom_bad.bin 0x7D00 0
set-byte eeprom_bad.bin 1000 0xff

Note: ce code peut gérer les numéros d'entrée à la fois dans hex (préfixé par 0x) et dec (pas de préfixe).

5
répondu Sandeep Datta 2015-12-30 07:19:16

l'outil xxd, qui est livré avec vim (et donc très probablement disponible) permet de vider un fichier binaire et de construire un nouveau fichier binaire à partir d'un dump HEX modifié.

2
répondu SK-logic 2011-01-24 15:36:34

si vous n'en avez pas besoin pour être scriptable, vous pouvez essayer l'utilitaire "hexedit". Il est disponible dans de nombreuses distributions Linux (s'il n'est pas installé par défaut, il se trouve généralement dans le dépôt de paquets de la distribution).

Si votre distribution ne l'a pas, vous pouvez construire et d'installer à partir des sources.

1
répondu Dan Moulding 2011-01-24 16:55:09

d'autres solutions:

1
répondu eadmaster 2016-07-18 02:58:09

Écrire le même octet à deux positions différentes dans le même fichier avec un liner.

printf '\x00'| tee >(dd of=filename bs=1 count=1 seek=692 conv=notrunc status=none) \
    >(dd of=filename bs=1 count=1 seek=624 conv=notrunc status=none)

statut=none très utile lorsque vous ne voulez pas de statistiques de dd.

1
répondu memscan 2018-02-09 22:31:54