バイナリファイルの既知の場所にあるバイトを特定の値に変更する必要があり、コマンドラインツールを使用してこれを達成する方法を探しています。
制限要因:
- バイトを変更する必要があります。
- ファイルのバイト位置を知っています。
- 私が望む値をバイト単位で知っています。 0x01〜0x19の範囲の印刷できない文字を含め、何でも構いません。
- 新しい値は古い値に依存しないため、古い値を取得する必要はありません。
ファイルの9番目のバイトを0にするには
dd if=/dev/zero of=/the/file bs=1 seek=8 count=1 conv=notrunc
ファイルにゼロ以外のコンテンツが必要な場合は、正しいビット値を含むコンテンツを次のようにパイプしますdd
。
spit-out-bytes | dd of=/the/file bs=1 seek=8 count=1 conv=notrunc
私はそれに何を使用しますかspit-out-bytes
?
答え1
まず、あなたの例が間違っています。 9番目のバイトの代わりに最初のバイトを上書きします(入力でseek
はなく出力が必要ですskip
)。また、(防止のため)ブロックデバイスではなく通常のファイルの場合は、conv=notrunc
ファイルを1バイトに切り捨てます。
dd bs=1 seek=8 count=1 conv=notrunc if=/dev/zero of=somefile
すべてのddコマンドを実行する前に3回確認してください。
私はそれに何を使用しますか
spit-out-bytes
?
echoやprintfを試してみてください。
$ echo -n -e '\x00\x88\xaa\xff' | hexdump -C
00000000 00 88 aa ff |....|
00000004
$ printf '\x00\x88\xaa\xff' | hexdump -C
00000000 00 88 aa ff |....|
00000004
count=1
ただし、技術的にソースサイズが1バイトにすぎないと確信している場合は、ddコマンドをスキップできます。ただし、万が一に備えて一時的に保管することをお勧めします。出力に余分なバイトを含めるのは簡単です(たとえば、改行が追加さecho
れることがよくあります)。