私が理解していることから、コンパイラはCPUが読み取れる1と0で構成されるバイナリファイルを作成します。バイナリファイルがありますが、そこにある1と0を確認するにはどうすればよいですか?テキストエディターが開くことができないと言います...
PSアセンブリコンパイルバイナリは、1と0のプレーンバイナリコードですか?
私が理解していることから、コンパイラはCPUが読み取れる1と0で構成されるバイナリファイルを作成します。バイナリファイルがありますが、そこにある1と0を確認するにはどうすればよいですか?テキストエディターが開くことができないと言います...
PSアセンブリコンパイルバイナリは、1と0のプレーンバイナリコードですか?
回答:
さまざまな人々がクエリのいくつかの側面に答えましたが、すべてではありません。
コンピューター上のすべてのファイルは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エントリでこれについて詳しく説明しています。
cat
と、実行可能ファイル(cat
この場合)はすべての1と0を読み取り、それらを関連するアルファベットの文字に変換するか、または言語。" cat
それはしません。すべてcat
がバイトを標準出力に書き込むだけです(「有害な」オプションを使用している場合を除く)。端末プログラム(および/または該当する場合は端末のハードウェア、つまりファームウェア)は、おそらくTTYドライバーの支援を受けて、バイトを文字としてレンダリングする方法を決定します。
低レベルでは、ファイルは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,%al
176,97参照:二つの数字で符号化されhttp://www.sparksandflames.com/files/x86InstructionChart.html、(16進表記を使用しているので、各命令は、00からFFに対応する番号を有しています下記参照)
第二に:各番号は複数の表現または表記法を持つことができます。
23個のリンゴがあるとしましょう。
しかし、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進数形式でコード化する番号をリストします。その後、計算機を使用して、対応するバイナリ形式を取得できます。
一連の16進値として表示する16進エディターで開くことができます。 xxd file
何を達成しようとしていますか?
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
など...それはバイナリよりもかなり読みやすいです。
strings
コマンドは見たいバイトの大部分を取り除きます。
strings
コマンド-特に長さが長いstrings -n 6
-は、文字列定数などが含まれている場合にバイナリファイルが何を持っているかを理解するのに役立ちます。この答えはコメントでなければなりません。大丈夫です。
strings
コマンドの有用性については質問していません。ここでのOPの質問に答えていないという事実だけです。
まだ混乱していると思われる重要な部分:16進値は、バイナリ値の異なる表現にすぎません。ほとんどの16進エディターまたは16進ダンプは、バイナリベースよりも読みやすいため、16進ベースで値を表示します。
例えば:
バイナリ:
xxd -b README.md
00000000: 00100011 00100000
10進数で35と32
xxd README.md
00000000: 2320
また、10進数で35および32
vim
を使用するにはインストールする必要があることに注意してくださいxxd
。
たとえば、このルビーのワンライナーでそれを行うことができます:
$ ruby -e 'while c=STDIN.read(1); printf "%08b" % c.bytes.first; end'
従来のCベースのシステムには、バイナリでの出力を行うための粗末なサポートがあります。16進ダンプとは異なり、読み取りが非常に難しいため、通常はあまり役に立ちません。
%08b
、出力がバイトにグループ化されます。