Come potrei usare Bash per trovare 2 byte in un file binario, aumentare i loro valori e sostituirli?


8

Sto cercando di trovare due byte all'interno del file binario, quindi aumentare il valore di quei due byte e sostituirli all'interno del file. Quei due byte si trovano nelle posizioni 0x82-0x83. Per ora ho estratto con successo quei due byte usando questo:

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

Quei byte hanno valore: 1B 1F. Sono bloccato con:

  1. Come convertire byte in numero intero? Dovrebbe essere 6943decimale.
  2. Come aggiungere / echo dati binari al file
  3. Come scrivere byte aumentati all'interno del file nelle posizioni 0x82-0x83. Potrei usare head -c 130 original.bin >> new_file.bin && magic_command_writing_bytes_to_file >> new_file.bin && tail -c +133 original.bin, ma ci deve essere un modo migliore.

Potrei farlo in PHP, dovrebbe essere più facile, ma mi interessa come farlo in bash.

Risposte:


5

Test con questo file:

$ 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:

Quindi in questo caso 1B 1Fè in posizione 12.

  • Converti in numero intero (probabilmente esiste un modo più semplice)

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

    $ printf '%04X' 6943 | xxd -r -ps | hexdump -C
    00000000  1b 1f                                             |..|
    $ printf '%04X' 4242 | xxd -r -ps | hexdump -C
    00000000  10 92                                             |..|
    
  • E rimettendolo nel file:

    $ 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
    
  • Risultato:

    $ 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.|
    

Sì, è esattamente quello che stavo cercando. Grazie.
piotrekkr,

@frostschutz: è presente un errore — mancante \x— nella riga due del codice di esempio. Dovrebbe essere echo -n $'\x1b\x1f' >> test.txt.
Erik,

1
Converti in numero intero (probabilmente c'è un modo più semplice) Oh sì, c'è! :) erik ha scelto il comando migliore, quindi adatterò la sua linea alla tua: printf "%d" 0x1B1Ffarà bene il lavoro per ottenere il tuo 6943risultato; andando da quello, puoi usare una linea significativamente più intelligente come printf "%d" $(xxd -u -ps -l 2 -s 12 test.txt)invece e non ti servirà bcpiù.
syntaxerror,

2

Oh scusa. Questa risposta è obsoleta, perché pensavo che avessi valori esadecimali scritti come ascii nel tuo file.


È possibile convertire i numeri esadecimali in sistema decimale tramite printf "%d" 0x1B1F.

Se hai salvato i byte in una variabile BYTES=1B1F, ottieni il risultato con printf "%d" 0x$BYTES.

Quindi, se vuoi aumentare il numero, fallo

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

Quindi riconvertirlo

printf '%X' $(($(printf "%d" 0x$BYTES) +1))
1B20
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.