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


45

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

PSアセンブリコンパイルバイナリは、1と0のプレーンバイナリコードですか?


1
バイナリファイルを表示すると、ASCII文字として表示されます
-mazs


no-OPは「アセンブリコンパイル済みバイナリ」を指定しました。それは質問に対処しません。たとえば、音楽ファイルではなく、構造があります。OPが追加情報を提供しない場合、非構造化ツールが開始点です。
トーマスディッキー

1
私の答えをご覧ください。また、バイナリという用語は実際にはまったく異なる2つの方法で使用されることに注意してください。「バイナリファイル」とは、コンテキストが純粋なASCIIテキストではないファイルを意味します。「2進数」とは、2進数形式を使用して記述された数字を意味します。
ピエールオリビエヴァレス

@mazs ASCII?UTF-8はもっと可能性が高いと思いますが、プログラムがヒューリスティックによってそのようにエンコードされていると考えている場合は、何らかのコードページがあります。
JDługosz

回答:


99

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

hexdump -C yourfile.bin 

もちろん、編集したい場合を除きます。ほとんどのLinuxディストリビューションにはhexdumpデフォルトであります(明らかにすべてではありません)。


更新

エミリオ・ブールによるこの回答によると:

xxd バイナリと16進の両方を行います

binの場合:

xxd -b file

16進数の場合:

xxd file

これは本当に役に立ちました!ありがとう
シュラビャBoggarapu

45

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

コンピューター上のすべてのファイルは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を表示するビューアを見つけた場合でも、ファイルのデータを解釈し、0と1のASCII文字を表示していることです。データはバイナリ形式(上記の2進数のリンクをご覧ください)。 Pierre-Olivierのコミュニティwikiエントリでこれについて詳しく説明しています。


良い露出。「1」または「0」としてテキスト行に表示される文字は、コンピューターによって単一の「1」または「0」として保存されないことを追加できます。OPはそれについて混乱しているようです。
ワイルドカード

1
私はあなたの声明にします(つまり、同意しません)、「を使用してテキストファイルを表示するcatと、実行可能ファイル(catこの場合)はすべての1と0を読み取り、それらを関連するアルファベットの文字に変換するか、または言語。" catそれはしません。すべてcatがバイトを標準出力に書き込むだけです(「有害な」オプションを使用している場合を除く)。端末プログラム(および/または該当する場合は端末のハードウェア、つまりファームウェア)は、おそらくTTYドライバーの支援を受けて、バイトを文字としてレンダリングする方法を決定します。
G-Manは「Reinstate Monica」と

私は同意しませんが、ある時点で、すべての簡単な説明が崩れます。問題は、物事を簡単に説明するのをやめる前に、ウサギの穴をどれだけ下に行くかです。
EightBitTony

14

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

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

最初に(そしてこの0と1の物語よりも重要)、コンピューターが操作するものはすべて数字でエンコードされていることを理解する必要があります

  • 文字は、文字セットテーブルを使用して数字でコード化されます。たとえば、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,%al176,97参照:二つの数字で符号化されhttp://www.sparksandflames.com/files/x86InstructionChart.html、(16進表記を使用しているので、各命令は、00からFFに対応する番号を有しています下記参照)

第二に:各番号は複数の表現または表記法を持つことができます。

23個のリンゴがあるとしましょう。

  • 10個のリンゴのグループを作成すると、10個のリンゴが2個のグループと3個の孤立したリンゴが得られます。23を書くとき、まさにそれが意味します:2(10)、3(単位)。
  • しかし、16個のリンゴのグループを作成することもできます。したがって、16個のGroup-of-Groupと7個の孤立したリンゴを取得します。で表記(のは、どのように16基数と呼ばれていること)、私は書きます:17(16 + 7)。10進表記と区別するために、一般に16進表記には17h、#17、または$ 17のプレフィックスまたはサフィックスが付いています。しかし、16以上のGroup-of-16、または9つ以上の単独リンゴを表すにはどうすればよいでしょうか?単純に、A(10)からF(15)までの文字を使用します。数値31(リンゴ31個分)は、16進数の#1Fとして記述されます。

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

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

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

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

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

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



4

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

何を達成しようとしていますか?


しかし、コンピューターは1と0しか読み取れないと思った。それらを見ることができますか?私はコンピュータがどのように機能するかを理解しようとしている
マーティンZeltin

2
それだけではあまり役に立ちません。どのように機能するかを知りたい場合は、LinuxボックスでELFファイル形式とen.wikipedia.org/wiki/X86_instruction_listingsをご覧ください。コンパイラによって生成されるコードを確認したいだけの場合は、gdbで実行するコードをご覧ください。もっと「低レベル」にしたいので、nand2tetris.orgもチェックしてください。アセンブリ言語のために私は6502とMIPSアセンブリより多くのよりよいがあることを聞いx86_64版/ x86のアセンブリ
theblazehen

@theblazehen最新のx86ファミリーアセンブラーは獣です。8086は管理可能であり、その時代(1970年代後半から1980年代前半)のCPUについては、アセンブラに関する限り許容できるはずです。
CVn

4

bvivimキーバインドを備えたバイナリVIsualエディターです。ほとんどのLinuxシステムで利用可能です。

ここに画像の説明を入力してください


3

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

$ 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

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


OPは、そこにある1と0を確認するために、どうやって開くのかと尋ねました。しかし、stringsコマンドは見たいバイトの大部分を取り除きます。
jlliagre

@jlliagre-あなたが正しい間、stringsコマンド-特に長さが長いstrings -n 6-は、文字列定数などが含まれている場合にバイナリファイルが何を持っているかを理解するのに役立ちます。この答えはコメントでなければなりません。大丈夫です。
ジョー

@Joeはい、stringsコマンドの有用性については質問していません。ここでのOPの質問に答えていないという事実だけです。
jlliagre

3

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

例えば:

バイナリ:

xxd -b README.md                                                                
00000000: 00100011 00100000

10進数で35と32

xxd README.md                                                                   
00000000: 2320

また、10進数で35および32


他の人これについて言及しています。ただし、これは良い要約です。最初の段落を変更する場合は、回答を編集できます。
wizzwizz4

非常によく、誰もそれを言及するのを見たことがありません、私はそれを見逃したかもしれません。
木曜日、

vimを使用するにはインストールする必要があることに注意してくださいxxd
starbeamrainbowlabs

2

次の方法で、ファイルをバイナリで表示できますvim

  • ファイルを開く vim
  • 入る :% !xxd -b

xxdコマンドは、例えば、さらに微調整することができます。

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

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


1

たとえば、このルビーのワンライナーでそれを行うことができます:

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

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


ありがとう!直後にスペースを追加すると%08b、出力がバイトにグループ化されます。
starbeamrainbowlabs

0

GHexはあなたの友達です:)
コマンドライン

Ubuntu を使用してインストールできます。

sudo apt-get install ghex

Fedora:

sudo yum install ghex

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.