Bashを使用してバイナリファイルで2バイトを検索し、それらの値を増やして置き換えるにはどうすればよいですか?


8

バイナリファイル内の2バイトを見つけて、それらの2バイトの値を増やし、ファイル内で置き換えようとしています。これらの2バイトは、位置0x82-0x83にあります。今のところ、これを使用してこれらの2バイトを正常に抽出しました。

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

これらのバイトには値があります1B 1F。私は立ち往生しています:

  1. バイトを整数に変換する方法は?694310進数でなければなりません。
  2. バイナリデータをファイルに追加/エコーする方法
  3. ファイル内の増加したバイトを位置0x82-0x83に書き込む方法。を使用することもできますがhead -c 130 original.bin >> new_file.bin && magic_command_writing_bytes_to_file >> new_file.bin && tail -c +133 original.bin、もっと良い方法があるはずです。

私はそれをPHPで行うことができますが、もっと簡単になるはずですが、bashでこれを行う方法に興味があります。

回答:


5

このファイルでのテスト:

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

したがって、この場合1B 1Fはの位置にあり12ます。

  • 整数に変換します(おそらくもっと簡単な方法があります)

    $ echo 'ibase=16; '`xxd -u -ps -l 2 -s 12 test.txt`  | bc
    6943
    
  • そしてその逆:

    $ printf '%04X' 6943 | xxd -r -ps | hexdump -C
    00000000  1b 1f                                             |..|
    $ printf '%04X' 4242 | xxd -r -ps | hexdump -C
    00000000  10 92                                             |..|
    
  • そしてそれをファイルに戻します:

    $ 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
    
  • 結果:

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

はい、まさにそれが私が探していたものです。ありがとう。
piotrekkr 2013

@frostschutz:\xサンプルコードの2行目にバグがあります。それはあるはずですecho -n $'\x1b\x1f' >> test.txt
erik 2013

1
整数に変換する(おそらくもっと簡単な方法があるでしょう)ああ、そうです!:) erikが最高のコマンドを選択したので、私は彼のラインをあなたのコマンドに適応printf "%d" 0x1B1Fさせます6943。あなたの結果を得るためにうまく仕事をします。それからは、printf "%d" $(xxd -u -ps -l 2 -s 12 test.txt)代わりに非常にスマートなラインを使用できbc、もう必要ありません。
syntaxerror

2

あ、ごめんなさい。16進数の値がファイルにasciiとして記述されていると思ったので、この回答は古くなっています。


を使用して、16進数を10進数に変換できprintf "%d" 0x1B1Fます。

変数にバイトを保存したBYTES=1B1F場合は、で結果を取得しprintf "%d" 0x$BYTESます。

したがって、数を増やしたい場合は、

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

次に、それを元に戻します

printf '%X' $(($(printf "%d" 0x$BYTES) +1))
1B20
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.