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.
printf '\x31\xc0\xc3' | dd of=test_blob bs=1 seek=100 count=3 conv=notrunc
dd arguments:
Un Josh cherchant un autre;)
Voici une fonction Bash replaceByte
, qui prend les paramètres suivants:
#!/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
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).
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é.
É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.
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 .
Quelques alternatives:
ucon64 --nbak --poke=OFF:V FILE
( destiné à ROM dumps , devrait fonctionner avec n'importe quel fichier binaire, mais pas avec l'édition in-situ)printf '\x31' | dd of=FILE bs=1 seek=OFFSET count=1 conv=notrunc
( enveloppé dans un shellscript comme celui-ci qui permet également de lire )