二進位檔案之謎

二進位檔案之謎

這是關於直接來自編譯器的文件,例如 g++ 和-o(outfile) 標誌。

如果它們是二進位的,它們不應該只是一堆 0 和 1 嗎?

當你捕捉它們時,你會得到難以理解的輸出,但也會得到完整的單字。

如果你把它們歸檔,你會立即得到答案——似乎沒有計算。二進位檔案實際上是否具有包含此類資訊的標頭?

我認為二進位可執行檔只是剛剛編譯的程序,只是以機器指令的形式,CPU 可以立即、明確地理解。如果是這樣,那指令集不就是位元模式嗎?但是,二進位檔案中的其他內容是什麼?如何顯示這些位元?

另外,如果您以某種方式掌握了處理器的手冊,您可以手動編寫二進位文件,一次一個機器指令嗎?這將是非常無效的,但是非常如果你讓它甚至可以用於“Hello World!”,那就太有趣了。演示。

答案1

這個超級用戶問題:當您使用文字編輯器開啟二進位時,為什麼看不到二進位代碼?很好地解決了你的第一點。

二進制和文字資料沒有分開:它們只是資料。這取決於使它們成為其中之一的解釋。如果您在文字編輯器中開啟二進位資料(例如圖像檔案),其中大部分資料將沒有意義,因為它不符合您選擇的解釋(作為文字)。

檔案以零和一的形式儲存(例如,記憶體上有電壓/無電壓、硬碟上有磁化/無磁化)。讀取檔案時看不到零和一,cat因為 0/1 序列對人類來說沒有太大用處;字元更有意義,並且十六進制轉儲更適合大多數用途(嘗試hexdump使用檔案)。

執行檔有標題它描述了參數,例如建構程式的體系結構以及檔案的哪些部分是程式碼和資料。這是file用來識別二進位檔案的特徵的。

最後:是的,您可以直接使用 CPU 操作碼以組合語言編寫程式。看一眼UNIX 組譯程式簡介英特爾 x86 文檔為起點。

答案2

所有檔案都儲存為 1 和 0,cat 只是嘗試將每個 BYTE(8 位元)解釋為一個字符,這就是為什麼您會看到無法理解的字符。

答案3

所有檔案在底層都是二進位的:它們儲存為一系列位元

文件的位元實際上分組在位元組。每個文件都由整數個位元組組成。所有 UNIX 系統,實際上幾乎所有計算機,都有由 8 位元組成的位元組(稱為八位組在網路術語中)。有一種自然的方式將位元組解釋為 8 位數字,即 0 到 2 8 -1 = 255 之間的數字。

要將它們視為二進制,您需要一個以二進位表示法寫出它們的工具。人類不太適合二進位表示法:寫任何東西都需要很長時間。比較常用的是十六進位符號,有 16 個不同的數字。例如,41(十六進位的 65)比01000001(二進位的 65)讀起來更舒服。您可以使用諸如od(“八進位轉儲”)或或hexdump列出hd每個位元組具有八進位或十六進位表示法的檔案(od -t x1切換到十六進位)。

位元組可以代表字元。有幾個字元編碼在 UNIX 世界中使用。它們都是基於ASCII碼,它定義了 0 到 127 之間位元組的解釋。例如,65代表大寫字母A,97代表小寫字母a,30代表數字0,依此類推。有些字元編碼用一個位元組來表示每個字元;例如,在拉丁文1編碼,163代表£,241代表ñ等等。這種方式最多可以表示 256 個字符,這個數字並不多;因此,還有其他編碼每個字元使用多個位元組。當今unix世界事實上的標準編碼是UTF-8,這是一種變長編碼(不同的字元佔用不同的位元組數)統一字元集

文字檔案是恰好包含可理解文字的二進位。事實上,對於 UNIX 程式來說,只要滿足兩個條件,文件就是文字檔:

  • 文字檔案不能包含任何空位元組(數值為 0 的位元組)。該位元組不代表任何字符,在許多文字操作程序內部用作特殊標記。
  • 文字檔案由一系列行組成,每行以新隊字元(其數值為 10)。

機器可執行檔是一種特殊類型的二進位。如果您cat對它們運行命令,您會看到一些垃圾,其中偶爾會有一些文字。這些文件也可能巧合地包含適用於您的終端的命令。您可以使用程式strings查看二進位檔案中的所有文字片段,忽略不可列印的字元。

機器可執行檔並不完全是機器指令序列:它們還包含一些額外信息,告訴作業系統如何將檔案載入到記憶體中,通常還包含程式使用的一些數據,以及可選的偵錯資訊。大多數 UNIX 系統使用極低頻機器可執行檔的格式。此格式指定如何將包含機器碼的檔案分為多個部分,並且該部分獨立於機器體系結構;有些部分包含程式碼,且該程式碼的含義特定於特定的機器體系結構。

您可以使用該命令objdump -D /path/to/machine-executable以人類可讀的形式顯示可執行檔的清單:組合語言。好吧,無論如何,受過訓練的人都可以閱讀。彙編語言特定於處理器體系結構並直接對應到機器指令。

用彙編語言編寫完整的程式是可能的,但對於重要的程式很少這樣做,因為這需要很長時間。如果你真的很瘋狂,你可能會直接用二進位編寫程式。有些人試圖提出列印的最短可能程序Hello world; Ryan Henszey 解釋如何寫作適用於 PC 處理器的 142 位元組 ELF 可執行文件;布萊恩·雷特分析了ELF格式並提出了一個45位元組的程序Linux 願意執行(程式不列印任何內容)。

還有一些可執行檔不是二進位;他們被稱為腳本。相反,有許多二進位檔案是不可執行的:映像、影片、壓縮檔案、文字處理文件、沒有可執行檔案的程式碼庫入口點,其他處理器架構的可執行文件,...

相關內容