ddと少し競合がありますか?

ddと少し競合がありますか?

バイナリファイルの既知の場所にあるバイトを特定の値に変更する必要があり、コマンドラインツールを使用してこれを達成する方法を探しています。

制限要因:

  • バイトを変更する必要があります。
  • ファイルのバイト位置を知っています。
  • 私が望む値をバイト単位で知っています。 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れることがよくあります)。

おすすめ記事