コマンドラインからバイナリを変更する簡単な方法はありますか?私のバイナリに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ページに頭を回すことができませんでした。
何か案が?
前もって感謝します!
printf '\x31\xc0\xc3' | dd of=test_blob bs=1 seek=100 count=3 conv=notrunc
dd引数:
ジョシュは別のものを探しています;)
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(プレフィックスなし)の両方で入力番号を処理できます。
以下は、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
vimに付属しているxxdツール(したがって、利用できる可能性が非常に高い)は、バイナリファイルを16進ダンプし、変更された16進ダンプから新しいバイナリファイルを構築できます。
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から統計を取得したくない場合に非常に役立ちます。
スクリプト可能にする必要がない場合は、「hexedit」ユーティリティを試すことができます。多くのLinuxディストリビューションで利用できます(デフォルトでインストールされていない場合、通常はディストリビューションのパッケージリポジトリにあります)。
ディストリビューションにない場合は、 ビルドしてソースからインストール できます。
いくつかの選択肢:
ucon64 --nbak --poke=OFF:V FILE
( ROMダンプ の意味、任意のバイナリファイルで機能するが、インプレース編集は不可)printf '\x31' | dd of=FILE bs=1 seek=OFFSET count=1 conv=notrunc
( 読み取りも許可するこのようなシェルスクリプトでラップ )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