web-dev-qa-db-ja.com

アドレスにバイトを書き込む(コマンドラインからバイナリをhexedit / modify)

コマンドラインからバイナリを変更する簡単な方法はありますか?私のバイナリに1234abcdが含まれていることを知っていて、それを12FFabcdまたはFFFFabcdまたはFF34FFabc0に変更したいとします(アイデアがわかります):-)

http://stahlworks.com/dev/swiss-file-knife.html などの特別な目的のツールを使用せずにそれを実現するにはどうすればよいですか。

コマンドラインから標準のLinuxツールのみを使用して実行するのは素晴らしいことです。

または、16進文字列を検索する代わりに、オフセット0x10000にFFを直接置き換え、オフセット0x100001に12を書き込むなど、代わりに使用することもできます。

スクリプト可能で、コマンドラインから直接実行する必要があります。 「ディストリビューションに含まれているバイナリ--write AB --at-offset 100000 --file thebinary.bin」のようなものを探しています。 "dd"でそれが可能であると確信していますが、manページに頭を回すことができませんでした。

何か案が?

前もって感謝します!

43
Josh
printf '\x31\xc0\xc3' | dd of=test_blob bs=1 seek=100 count=3 conv=notrunc 

dd引数:

  • of |パッチするファイル
  • bs |一度に1バイトください
  • シーク |位置100(10進数)に移動
  • conv = notrunc |編集後に出力を切り捨てないでください(デフォルトではddが行います)

ジョシュは別のものを探しています;)

79
Josh

printf+ddベースのソリューションは、ゼロを書き込むために機能しないようです。すべてのバイト値で機能するはずのpython3の一般的なソリューション(すべての最新のディストリビューションに含まれています)は次のとおりです...

#!/usr/bin/env python3
#file: set-byte

import sys

fileName = sys.argv[1]
offset = int(sys.argv[2], 0)
byte = int(sys.argv[3], 0)

with open(fileName, "r+b") as fh:
    fh.seek(offset)
    fh.write(bytes([byte]))

使用法...

set-byte eeprom_bad.bin 0x7D00 0
set-byte eeprom_bad.bin 1000 0xff

注:このコードは、16進数(プレフィックス0x)とdec(プレフィックスなし)の両方で入力番号を処理できます。

7
Autodidact

以下は、Bash関数replaceByteで、次のパラメーターを取ります。

  • ファイルの名前、
  • 書き換えるファイル内のバイトのオフセット、および
  • バイトの新しい値(数値)。
#!/bin/bash

# param 1: file
# param 2: offset
# param 3: value
function replaceByte() {
    printf "$(printf '\\x%02X' $3)" | dd of="$1" bs=1 seek=$2 count=1 conv=notrunc &> /dev/null
}

# Usage:
# replaceByte 'thefile' $offset 95
6
sinharaj

vimに付属しているxxdツール(したがって、利用できる可能性が非常に高い)は、バイナリファイルを16進ダンプし、変更された16進ダンプから新しいバイナリファイルを構築できます。

3
SK-logic

1つのライナーで同じファイルの2つの異なる位置に同じバイトを書き込む。

printf '\x00'| tee >(dd of=filename bs=1 count=1 seek=692 conv=notrunc status=none) \
    >(dd of=filename bs=1 count=1 seek=624 conv=notrunc status=none)

status = none ddから統計を取得したくない場合に非常に役立ちます。

2
memscan

スクリプト可能にする必要がない場合は、「hexedit」ユーティリティを試すことができます。多くのLinuxディストリビューションで利用できます(デフォルトでインストールされていない場合、通常はディストリビューションのパッケージリポジトリにあります)。

ディストリビューションにない場合は、 ビルドしてソースからインストール できます。

1
Dan Moulding

いくつかの選択肢:

1
eadmaster

Joshの回答について:特定のアドレスに対して実行する場合

hexdump -C {file location}

いくつかの16進数値で0xを追加しようとした可能性がありますが、失敗します。

dd: warning: ‘0x’ is a zero multiplier; use ‘00x’ if that is intended

これは、ターミナルがint値として変換する$(())でカプセル化することで実現できます。

mybinary={file location}
printf '\x31\xc0\xc3' | dd of=$mybinary bs=1 seek=$((0x100)) count=3 conv=notrunc 
0
Antonin GAVREL