it-swarm.com.de

CLI: Schreibe Byte an Adresse (hexedit/change binary von der Kommandozeile)

Gibt es eine einfache Möglichkeit, eine Binärdatei über die Befehlszeile zu ändern? Nehmen wir an, ich weiß, dass meine Binärdatei 1234abcd enthält, und ich möchte sie in 12FFabcd oder FFFFabcd oder vielleicht sogar FF34FFabc0 (Sie haben die Idee) ändern wollen :-)

Wie kann ich das erreichen, ohne spezielle Werkzeuge wie http://stahlworks.com/dev/swiss-file-knife.html oder ähnliches zu verwenden.

Es wäre großartig, es nur von der Kommandozeile aus mit nur Linux-Standardwerkzeugen auszuführen.

Oder vielleicht sogar besser für die Suche nach dem Hex-String, den ich direkt beim Schreiben von FF bei Offset 0x10000, 12 bei Offset 0x100001 usw. ersetzen möchte.

Irgendeine Idee?

Danke im Voraus!

P .: Ich sollte folgendes hinzufügen:

Es sollte skriptfähig sein und direkt von der Kommandozeile aus ausgeführt werden. Ich bin auf der Suche nach etwas wie "binär-was-ist-in-der-distro -write AB -at-offset 100000 -file thebinary.bin". Ich bin mir ziemlich sicher, dass dies mit "dd" möglich ist, aber ich konnte den Kopf nicht um die Manpage legen.

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

dd Argumente:

  • von | zu patchende Datei
  • bs | 1 Byte auf einmal bitte
  • suchen | gehe zu Position 100 (dezimal)
  • conv = notrunc | schneide die Ausgabe nach dem Bearbeiten nicht ab (was dd standardmäßig tut)

Ein Josh sucht nach einem anderen;)

66
Josh

Hier ist eine Bash-Funktion replaceByte, die die folgenden Parameter übernimmt:

  • der Name der Datei,
  • ein Offset des Bytes in der zu überschreibenden Datei und
  • der neue Wert des Bytes (eine Zahl).
#!/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

Die printf+dd-basierten Lösungen scheinen nicht zum Ausschreiben von Nullen zu funktionieren. Hier ist eine generische Lösung in python3 (in allen modernen Distros enthalten), die für alle Byte-Werte funktionieren sollte ...

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

Verwendungszweck...

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

Hinweis: Dieser Code kann Eingangsnummern sowohl in Hex (vorangestellt mit 0x) als auch in Dez (kein Präfix) verarbeiten.

5
Autodidact

das xxd-Tool, das mit vim geliefert wird (und daher wahrscheinlich verfügbar ist), ermöglicht es, eine binäre Datei im Hex-Dump zu speichern und aus einem modifizierten Hex-Dump eine neue Binärdatei zu erstellen.

2
SK-logic

Schreiben des gleichen Bytes an zwei verschiedenen Positionen in derselben Datei mit einem Einzeiler.

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)

status = keine sehr nützlich, wenn Sie keine Statistiken aus dd wollen.

1
memscan

Wenn Sie es nicht benötigen, um skriptfähig zu sein, können Sie das Dienstprogramm "hexedit" ausprobieren. Es ist in vielen Linux-Distributionen verfügbar (wenn es nicht standardmäßig installiert ist, befindet es sich normalerweise im Paket-Repository der Distribution).

Wenn Ihre Distribution es nicht hat, können Sie von Source erstellen und installieren.

1
Dan Moulding

Einige Alternativen:

1
eadmaster

Bezüglich Josh antworte: Falls du es für eine bestimmte Adresse machen willst

hexdump -C {file location}

mit einem Hex-Wert hätten Sie vielleicht versucht, 0x hinzuzufügen, aber es würde fehlschlagen:

dd: warning: ‘0x’ is a zero multiplier; use ‘00x’ if that is intended

Sie erreichen dies, indem Sie es mit $ (()) kapseln, das das Terminal als int-Wert übersetzt:

mybinary={file location}
printf '\x31\xc0\xc3' | dd of=$mybinary bs=1 seek=$((0x100)) count=3 conv=notrunc 
0
Antonin GAVREL