web-dev-qa-db-ja.com

バイナリファイルの8進または16進ダンプを解釈する方法は?

バイナリファイルには文字列といくつかの数値があります。od -c filenameまたはstrings filenameを実行すると、文字列が正しく表示されます。しかし、数字はどうですか?彼らは奇妙なフォーマットになっています。

od -c filenameを実行した後のテキストは次のようになります。

 0000000 036\0 032 004 SD\0\0\0\0 seq 1 
 0000020\0\0\0\0\0\0\0\0\t\0ó002 3 001 
 0000040&\ 0 032\f O 2 006\0\0\0 osfus 1 
 0000060 002 001 3 001ÿ\ r\0\0\t\0\0 @ 3 ×
 0000100 233º004\0é003\0\0&\ 0 032\f O 2 7\0 
 0000120\0\0 osfeu 1 002 2 001é235 
 0000140\0\0 035 003\0 @ 3×233º004\0Ñ\ a\0\0 
 0000160ä\ 0 032\f O r E\0\0\0 osfap 1 

これを解読する方法は?

私もhexdump -C filenameを試しました

出力は次のようになります。

 00000000 1e 00 1a 04 53 44 00 00 00 00 73 65 71 31 20 20 | .... SD .... seq1 | 
 00000010 20 20 00 00 00 00 00 00 00 00 09 00 f3 02 33 01 | ..........ó.3。| 
 00000020 26 00 1a 0c 4f 32 06 00 00 00 6f 73 66 75 73 31 |&... O2 .... osfus1 | 
 00000030 20 20 f3 02 33 01 ff 0d 00 00 09 00 00 40 33 d7 | ó.3.ÿ...... @ 3×| 
 00000040 9b ba 04 00 e9 03 00 00 26 00 1a 0c 4f 32 37 00 |.º..é...&... O27。| 
 00000050 00 00 6f 73 66 65 75 31 20 20 f3 02 33 01 e9 9d | ..osfeu1ó.3.é.| 
 00000060 00 00 1d 03 00 40 33 d7 9b ba 04 00 d1 07 00 00 | ..... @ 3×.º..Ñ... | 
 00000070 e4 00 1a 0c 4f 72 45 00 00 00 6f 73 66 61 70 31 |ä ... OrE ... osfap1 | 

明確にするために、通常のファイルであるメインファイルには、表示されていた属性が1つ奇妙な形式であったため、raw /バイナリファイルを調べています。

通常のファイルで8進ダンプを実行すると、表示の問題が解決しました。

grep 'id=123' regular_file | head -1 | od -cを使用すると、そこに何の数字があるかを確認できました。私は1を期待していましたが、001として表示されました。

14
user14039

数値を保存する方法はたくさんあります-ASCII( '、'を使用して小数部を区切るなど、ロケール固有のバリアントを持つことができますORグループ化)、2進整数(可変ビット数)/ float/double(すべてエンディアンアーキテクチャ、およびファイルを生成するソフトウェアが表現を形式化するかどうかによって異なる場合があります)、BCD(非圧縮、パック、固定小数点およびその他のバリアント)、Bi -5進コード10進数...

基準はありません。

4
symcbean

コンピュータサイエンスで最初に覚えなければならないことの1つは、Data + Interpretation = Useful Informationでした。これの当然の結果は、データや解釈が欠けている場合、何もないということです。データ自体はそれを解釈する方法を教えてくれません。 (これを伝えるメタデータを持つことができますが、metadataを解釈する方法も知る必要があります)

このような状況下で、私はこれを試すことをお勧めします:

file filename

それが次のようなものになった場合:

filename: data

そして、あなたは絶対にフォーマットが何であるか、それがどのプログラムであるか、その使用法は何か、またはfilenameの内容について何も知らないので、おそらくあなたはあきらめる。

8進ダンプ出力

od(8進ダンプ)は、テキストと8進のハイブリッドダンプを生成します。非数字は、osfなどの印刷可能な文字、または\0(ASCII 0、NUL)、または\a(ASCII 7、BEL)、または標準のC接頭辞0(例:032 = 26 in 10進数)。ファイルは8ビットバイトのストリームとして解釈されます。

16進ダンプ出力

hexdumpは、従来の16進ダンプを生成します。一方の列は16進数の8ビットバイトをリストし、もう一方はASCII文字を示します)印刷できないASCII文字であるか、ASCII文字ではない、その位置に.が表示されている)です。ここでも、ファイル8ビットバイトのストリームとして解釈されます

整数

ファイルが100%バイナリ整数で構成されている場合(つまり、ある種の整数表現のヘッダーなしの均一な1次元配列である場合)、次のすべての質問に答える必要があります。

  • それらは「適切な」バイナリ、または バイナリコード10進数(BCD) ですか? (おそらくバイナリ)
  • ビット幅はどれくらいですか?
  • それらの幅が8の倍数でない場合、それらはSMSメッセージまたはBase64のようにビットパックされていますか、それともバイト単位ですか?
  • 幅が8ビット以上の場合、 バイト順 とは何ですか?ビッグエンディアン、リトルエンディアン、またはその他の珍しい種類ですか?
  • 整数は 符号付き、または符号なし ですか?
  • 署名されている場合、それらは 2の補数 (可能性が高い)、または 1の補数 、または珍しく奇妙なもので表されていますか?

たぶん、今忘れているものがもっとあるでしょう。

そして、これは、コンピュータの一般的な最新のアーキテクチャに由来する、整数の1次元の均一な配列のためのものです。データになんらかの複雑さがある場合、状況は非常に複雑になり、形式を推測するだけではなく、宝くじに当たるのが簡単になります。そして、あなたがを持っているは、形式を知らない限り、推測(教育的な推測ですが推測)をする必要があります。

19
Alexios