2011-01-24 5 views
28

コマンドラインからバイナリを変更する簡単な方法はありますか? のは、私は私のバイナリが1234abcdが含まれていることを知っていると私は(あなたがアイデアを得る)12FFabcdまたはFFFFabcdにそれを変更したいか、多分FF34FFabc0としましょう:-)私はhttp://stahlworks.com/dev/swiss-file-knife.htmlなどの特殊な目的のツールを使用せずにすることを実現するかもしれませんどのようにCLI:アドレスにバイトを書き込む(コマンドラインからhexedit/modifyバイナリ)

または類似。

標準のLinuxツールだけでコマンドラインから実行するのはすばらしいことです。

おそらく、代わりに0x000000のオフセット、0x00001のオフセット、12のFFを直接書き換えたい16進文字列を検索する方が良いでしょう。

ありがとうございます!

P.S:私は、以下を追加する必要があります

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

答えて

1

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

ディストリビューションにそれがない場合は、build and install it from sourceとすることができます。

+0

スクリプト可能で、コマンドラインから直接実行する必要があります。私は、 "バイナリは、ディストリビューションに含まれているAB - オフセット - 100000 - ファイルthebinary.bin"のようなものを探しています。 「dd」で可能だとは確信していますが、マニュアルページの周りに頭を囲むことができませんでした。 – Josh

2

vimに付属するxxdツールは、バイナリファイルを16進数でダンプし、変更された16進ダンプから新しいバイナリファイルを作成することを可能にします。

+0

しかし、それはコマンドラインからもうまくいかないでしょう(Dansの返信に私のコメントを見てください)、そうですか? – Josh

+0

これはうまくいくはずです: 'xxd -ps ... | sed -s "s /.../.../g/" | xxd -r ... ' –

+1

さらには' xxd -r -s ' –

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

DD引数:の

  • |パッチを適用するファイル
  • bs |一度に1バイトしてください
  • シーク |ポジション100(小数)に移動
  • conv = notrunc | (デフォルトではありませんどのDD)編集後の出力を切り捨て、別のを探して

一つジョシュはありません。)

+0

これはゼロを書き込むためには機能していないようです。 –

+1

美しいエレガントなソリューション!このコマンドを使ってバイトを挿入することは可能ですか?または、パッチを適用したファイルを別のファイル名に出力するには?または、シーク位置がファイルサイズのような変数に基づいているか? – ben

5

は、ここで次のパラメータを取ります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 
2

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(接頭辞なし)の両方で指定します。

0

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) 

状態=なしあなたはDDのうちいずれかの統計をしたくないときに非常に便利。

関連する問題