web-dev-qa-db-ja.com

バイナリファイルを表示する方法

私が理解していることから、コンパイラは、CPUが読み取ることができる1と0で構成されるバイナリファイルを作成します。バイナリファイルがありますが、それを開いて1と0を確認するにはどうすればよいですか?テキストエディターはそれを開くことができないと言います...

追伸1と0のプレーンバイナリコードである必要があるアセンブリコンパイル済みバイナリがありますか?

51
Martin Zeltin

この答え による tyranid によると:

hexdump -C yourfile.bin 

もちろんそれを編集したくない限り。ほとんどのLinuxディストリビューションには、デフォルトでhexdumpがあります(ただし、すべてではないことは明らかです)。


更新

この答え による Emilio Bool によると:

xxdは2進数と16進数の両方を実行します

ビンの場合:

xxd -b file

16進数の場合:

xxd file
107
Rahul

さまざまな人々がクエリのいくつかの側面に答えましたが、すべてではありません。

コンピュータ上のすべてのファイルは1と0として保存されます。画像、テキストファイル、音楽、実行可能なアプリケーション、オブジェクトファイルなど.

それらはすべて0と1です。唯一の違いは、何を開くかによって解釈が異なることです。

catを使用してテキストファイルを表示すると、実行可能ファイル(この場合はcat)が1と0をすべて読み取り、それらを関連するアルファベットまたは言語の文字に変換して表示します。 。

画像ビューアを使用してファイルを表示すると、1と0をすべて取り、それらを画像に変換します。これは、ファイルの形式とそれをすべて機能させるためのロジックによって異なります。

コンパイルされたバイナリファイルも同じで、1と0として格納されます。

arzyfexの答えは、それらのファイルをさまざまな方法で表示するツールを提供しますが、バイナリとしてファイルを読み取ることは、コンピュータ上の任意のファイルに対して機能します。それらのフォーマットの。

実行可能バイナリファイルの機能を理解したい場合は、アセンブラー言語を(最初から)示す方法で表示する必要があります。

objdump -d /path/to/binary

これは逆アセンブラーであり、バイナリコンテンツを取得してアセンブラー(非常に低レベルのプログラミング言語)に変換します。 objdumpはデフォルトで常にインストールされるとは限らないため、Linux環境によってはインストールする必要がある場合があります。

いくつかの外部の読書。

注意:@Wildcardが指摘するように、ファイルには文字1と0が含まれていないことに注意してください(画面に表示されます)。 、実際の数値データ、オン(1)またはオフ(0)の個々の情報ビットが含まれます。その説明でさえ、真実の近似にすぎません。重要な点は、1と0を表示するビューアを見つけた場合でも、ファイルからのデータを解釈していて、ASCII 0と1の文字を表示していることです。データはバイナリ形式で保存されます(上記のバイナリ番号のリンクを参照してください) Pierre-Olivierのコミュニティwikiエントリ これについて詳しく説明しています。

46
EightBitTony

低レベルでは、ファイルは0と1のシーケンスとしてエンコードされます。

しかし、プログラマーでさえ実際にそこに行くことはめったにありません。

最初(そしてこの0と1の話よりも重要です)、コンピュータが操作するものはすべてnumbers

  • 文字は、文字セットテーブルを使用して番号でコード化されます。たとえば、ASCIIを使用してコード化すると、文字「A」の値は65になります。参照 http://www.asciitable.com

  • ピクセルは1つ以上の数値でコード化されます(多くのグラフィック形式があります)たとえば、標準の3色形式では、黄色のピクセルは次のようにエンコードされます:赤は255、緑は255、青は0。参照 http://www.quackit.com/css/css_color_codes.cfm (色を選択して、R、G、Bのセルを確認)

  • バイナリ実行可能ファイルはアセンブリで記述されています。各アセンブリ命令は番号としてコード化されています。たとえば、アセンブリ命令MOVB $0x61,%alは2つの数値でコード化されます:176,97 http://www.sparksandflames.com/files/x86InstructionChart.html を参照してください(16進表記のため、各命令には00からFFまでの番号が関連付けられています)使用されます。以下を参照してください)

2番目に:各数値は、複数の表現またはnotations

私が23個のリンゴを持っているとしましょう。

  • 10個のリンゴのグループを作成すると、10個のリンゴの2つのグループと3個のリンゴのグループができます。 23と書くと、まさにそのとおりです。2(10)、次に3(単位)です。
  • しかし、16個のリンゴのグループを作ることもできます。それで、16個のグループの1つと、7つの孤独なリンゴを取得します。 hexadecimal表記(つまり、16基数と呼ばれます)では、17(16 + 7)と記述します。 10進表記と区別するために、16進表記は通常、接頭辞または接尾辞(17h、#17、または$ 17)で示されます。しかし、16個以上の16のグループ、または9個以上の単独のリンゴを表すにはどうすればよいでしょうか。単純に、A(10)からF(15)までの文字を使用します。数値31(31リンゴのように)は、16進数で#1Fと表記されます。

  • 同じ行で、2つのリンゴのグループを作成できます。 (2つのグループの2つのリンゴのグループ、つまりgroup-of-2x2-applesなど)。次に、23は次のとおりです。1group-of-2x2x2x2-apples、0 group-of-2x2x2-apples、1 group-of-2x2apples、1 group of 2 apples、および1 group Appleバイナリでは10111と表示されます。

https://en.wikipedia.org/wiki/Radix を参照)

物理的には、2つの状態(スイッチ)を許可するメカニズムは、メモリストレージ内のディスク上と同様に簡単に実行できます。

そのため、数値と見なされるデータとプログラムは、バイナリ形式で記述および操作されます。

次に、データタイプに応じて、適切な形式(文字A、黄色のピクセル)に変換または実行(MOV命令)します。

hexdumpは、データ(またはアセンブリプログラム)を16進数形式でコード化した数値をリストします。次に、計算機を使用して、対応するバイナリ形式を取得できます。

14

私は od(オクタルダンプ) から始め、システムによっては objdump などのツールが役立つ場合があります。

10
Thomas Dickey

Linux stringsコマンドは、印刷可能な文字の文字列をファイルに出力します。例:

$ strings /usr/bin/gnome-open 
/lib64/ld-linux-x86-64.so.2
3;o:)
libgnome-2.so.0
_ITM_deregisterTMCloneTable
g_object_unref
gmon_start__
g_dgettext
_Jv_RegisterClasses
g_strdup
_ITM_registerTMCloneTable
g_error_free
gnome_program_init
libgnome_module_info_get
libgio-2.0.so.0
g_ascii_strncasecmp

など...それはバイナリよりもかなり読みやすいです。

4
ponsfrilus

一連の16進値として表示される16進エディタで開くことができます。 xxd file

あなたは何を成し遂げようとしているのですか?

4
theblazehen

bviは、vimキーバインドを備えたバイナリVIsualエディターです。ほとんどのLinuxシステムで使用できます。

enter image description here

4
Gilles Castel

まだ混乱しているように思われる重要な部分:16進値は、バイナリ値の異なる表現にすぎません。ほとんどの16進エディターまたは16進ダンプは、バイナリベースよりも読みやすいため、16進ベースで値を表示します。

例えば。:

バイナリ:

xxd -b README.md                                                                
00000000: 00100011 00100000

10進数で35と32です。

xxd README.md                                                                   
00000000: 2320

また、10進数で35と32

3
Thursday Next

次のようにすると、vimのファイルをバイナリで表示できます。

  • vimでファイルを開く
  • :% !xxd -bを入力しています

xxdコマンドはさらに調整できます。次に例を示します。

  • -g4を追加して、32ビットパックのビットをグループ化します。
  • 出力をフォーマットする-c4を追加して、1行あたり4バイトにする

上記の両方のフラグを追加すると、1行に1つの32ビット整数が得られます。

2
Leandros

これは、たとえば、Ruby one-liner:

$ Ruby -e 'while c=STDIN.read(1); printf "%08b" % c.bytes.first; end'

従来のCベースのシステムは、AFAIKでバイナリを出力するための粗末なサポートを備えています。 16進ダンプとは異なり、読み取りが非常に難しいため、通常はあまり役に立ちません。

1
PSkocik

GHexはあなたの友達です:)
コマンドラインを使用してインストールできます

Ubuntu:

Sudo apt-get install ghex

Fedora:

Sudo yum install ghex

0
craken