CLI: Ecrire byte à l'adresse (hexedit / modifier binaire à partir de la ligne de commande)
Existe-t-il un moyen simple de modifier un binaire à partir de la ligne de commande? Disons que je sais que mon binaire contient 1234abcd et je veux le changer en 12FFabcd ou FFFFabcd ou peut-être même FF34FFabc0 (vous avez l'idée): -)
Comment puis-je y arriver sans utiliser d'outils spéciaux comme http://stahlworks.com/dev/swiss-file-knife.html<!--4 ou similaire.
ce serait génial de le faire à partir de la ligne de commande avec seulement linux standard outils.
ou peut-être même mieux à la place de chercher la chaîne hex que je veux remplacer en é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 doit être scriptable et exécuté directement depuis la ligne de commande. Je suis à la recherche de quelque chose comme "binaire-qui-est-inclus-dans-les-distro --écrire AB --à-décalage de 100000 --fichier thebinary.bac." Je je suis tout à fait sûr que c'est possible avec "dd", mais je n'ai pas été en mesure d'enrouler ma tête autour de la page de l'homme.
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 ;)
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
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).
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é.
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.
d'autres solutions:
- HexAlter (open source compilé outil)
ucon64 --nbak --poke=OFF:V FILE
( destined for ROM dumps, devrait fonctionner avec n'importe quel fichier binaire, mais pas de place d'édition)printf '\x31' | dd of=FILE bs=1 seek=OFFSET count=1 conv=notrunc
(enveloppé dans un shellscript comme celui-ci qui permet aussi de lire)
É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.