web-dev-qa-db-fra.com

CLI: Écriture octet à l'adresse (hexedit/modify binary à partir de la ligne de commande)

Existe-t-il un moyen simple de modifier un fichier binaire à partir de la ligne de commande?

Comment puis-je atteindre cet objectif sans utiliser d’outils spéciaux tels que http://stahlworks.com/dev/swiss-file-knife.html ou similaire.

Ce serait bien de le faire en ligne de commande uniquement avec les outils linux standard.

Ou peut-être même mieux au lieu de chercher la chaîne hexagonale que je veux remplacer écrivant directement FF à Offset 0x10000, 12 à Offset 0x100001 et ainsi de suite.

Une idée?

Merci d'avance!

P.S .: Je devrais ajouter ce qui suit:

Il devrait être scriptable et exécuté directement à partir de la ligne de commande. Je cherche quelque chose comme "binaire qui est inclus dans la distribution - écrit AB --at-offset 100000 - fichier thebinary.bin". Je suis à peu près sûr que c'est possible avec "dd", mais je n'ai pas réussi à comprendre la page de manuel.

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

dd arguments:

  • de | fichier à patcher
  • bs | 1 octet à la fois s'il vous plaît
  • chercher | aller à la position 100 (décimal)
  • conv = notrunc | ne pas tronquer la sortie après l'édition (ce que dd fait par défaut)

Un Josh cherchant un autre;)

66
Josh

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

  • le nom du fichier,
  • un décalage de l'octet dans le fichier à réécrire, et
  • la nouvelle valeur de l'octet (un nombre).
#!/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
6
sinharaj

Les solutions basées sur printf+dd ne semblent pas fonctionner pour l'écriture de zéros. Voici une solution générique dans python3 (incluse dans toutes les distributions modernes) qui devrait fonctionner pour toutes les valeurs d'octet ...

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

Remarque: Ce code peut gérer les nombres saisis en hexa (préfixé par 0x) et en déc (sans préfixe).

5
Autodidact

l'outil xxd, fourni avec vim (et donc probablement disponible), permet de vider un fichier binaire en hexadécimal et de construire un nouveau fichier binaire à partir d'un vidage hexadécimal modifié.

2
SK-logic

Écrire le même octet à deux positions différentes dans le même fichier avec une seule ligne.

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 = aucun très utile lorsque vous ne voulez pas de statistiques sur dd.

1
memscan

Si vous n'avez pas besoin que ce soit un script, 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 référentiel de paquets de la distribution).

Si votre distribution ne l’a pas, vous pouvez construire et l’installer à partir de la source .

1
Dan Moulding

Quelques alternatives:

1
eadmaster