Wie könnte ich Bash verwenden, um 2 Bytes in einer Binärdatei zu finden, ihre Werte zu erhöhen und zu ersetzen?

8

Ich versuche, zwei Bytes in der Binärdatei zu finden, dann den Wert dieser beiden Bytes zu erhöhen und sie in der Datei zu ersetzen. Diese beiden Bytes befinden sich an den Positionen 0x82-0x83. Im Moment habe ich diese beiden Bytes erfolgreich damit extrahiert:

#!/usr/bin/env bash
BYTES=$(tail -c +131 "$1" | head -c 2)

Diese Bytes haben den Wert : 1B 1F. Ich stecke fest mit:

  1. Wie konvertiere ich Bytes in Ganzzahlen? Es sollte 6943dezimal sein.
  2. Anhängen / Echo von Binärdaten an eine Datei
  3. So schreiben Sie mehr Bytes in die Datei an den Positionen 0x82-0x83. Ich könnte es gebrauchen head -c 130 original.bin >> new_file.bin && magic_command_writing_bytes_to_file >> new_file.bin && tail -c +133 original.bin, aber es muss einen besseren Weg geben.

Ich könnte das in PHP machen, es sollte einfacher sein, aber ich bin interessiert, wie man das in Bash macht.

piotrekkr
quelle

Antworten:

5

Testen mit dieser Datei:

$ echo hello world > test.txt
$ echo -n $'\x1b\x1f' >> test.txt
$ echo whatever >> test.txt
$ hexdump -C test.txt 
00000000  68 65 6c 6c 6f 20 77 6f  72 6c 64 0a 1b 1f 77 68  |hello world...wh|
00000010  61 74 65 76 65 72 0a                              |atever.|
$ grep -a -b --only-matching $'\x1b\x1f' test.txt 
12:

In diesem Fall ist das 1B 1Falso in Position 12.

  • In Ganzzahl konvertieren (es gibt wahrscheinlich einen einfacheren Weg)

    $ echo 'ibase=16; '`xxd -u -ps -l 2 -s 12 test.txt`  | bc
    6943
    
  • Und umgekehrt:

    $ printf '%04X' 6943 | xxd -r -ps | hexdump -C
    00000000  1b 1f                                             |..|
    $ printf '%04X' 4242 | xxd -r -ps | hexdump -C
    00000000  10 92                                             |..|
    
  • Und wieder in die Datei einfügen:

    $ printf '%04X' 4242 | xxd -r -ps | dd of=test.txt bs=1 count=2 seek=12 conv=notrunc
    2+0 records in
    2+0 records out
    2 bytes (2 B) copied, 5.0241e-05 s, 39.8 kB/s
    
  • Ergebnis:

    $ hexdump -C test.txt
    00000000  68 65 6c 6c 6f 20 77 6f  72 6c 64 0a 10 92 77 68  |hello world...wh|
    00000010  61 74 65 76 65 72 0a                              |atever.|
    
Frostschutz
quelle
Ja, es ist genau das, wonach ich gesucht habe. Vielen Dank.
Piotrekkr
@frostschutz: \xIn Zeile zwei Ihres Beispielcodes fehlt ein Fehler . Es sollte sein echo -n $'\x1b\x1f' >> test.txt.
Eric
1
In Ganzzahl konvertieren (es gibt wahrscheinlich einen einfacheren Weg) Oh ja, das gibt es! :) erik hat den besten befehl gewählt, also werde ich seine linie einfach an deine anpassen: printf "%d" 0x1B1Fwird den job gut machen, um dein 6943ergebnis zu erhalten ; Von da an können Sie printf "%d" $(xxd -u -ps -l 2 -s 12 test.txt)stattdessen eine wesentlich intelligentere Linie verwenden, die Sie nicht mehr benötigen bc.
Syntaxfehler
2

Oh, das tut mir leid. Diese Antwort ist veraltet, da ich dachte, Sie haben hexadezimale Werte als ASCII in Ihre Datei geschrieben.


Sie können die Hex-Zahlen über in ein Dezimalsystem konvertieren printf "%d" 0x1B1F.

Wenn Sie die Bytes in einer Variablen gespeichert haben, erhalten BYTES=1B1FSie das Ergebnis mit printf "%d" 0x$BYTES.

Also, wenn Sie die Anzahl erhöhen möchten, tun Sie

$ echo $(($(printf "%d" 0x$BYTES) +1))
6944

Dann konvertieren Sie es zurück

printf '%X' $(($(printf "%d" 0x$BYTES) +1))
1B20
erik
quelle