有神祕檔案嗎?Linux file命令將快速告訴您它是什麼型別的檔案。如果它是一個二進位制檔案,你可以找到更多關於它。檔案裡有一大堆馬廄,可以幫你分析。我們將向您展示如何使用這些工具。
檔案通常具有一些特性,允許軟體包識別它是哪種型別的檔案,以及其中的資料表示什麼。嘗試在MP3音樂播放器中開啟PNG檔案是沒有意義的,因此檔案攜帶某種形式的ID既有用又實用。
這可能是檔案開頭的幾個簽名位元組。這允許檔案明確其格式和內容。有時,檔案型別是從資料本身內部組織的一個獨特方面推斷出來的,稱為檔案體系結構。
有些作業系統,如Windows,完全由副檔名引導。您可以稱之為輕信或信任,但Windows假定任何具有DOCX副檔名的檔案實際上都是DOCX字處理檔案。Linux不是那樣的,你很快就會看到。它需要證據並在檔案中查詢。
這裡描述的工具已經安裝在我們用來研究本文的manjaro20、fedora21和ubuntu20.04發行版上。我們用檔案命令開始調查吧。
我們在當前目錄中有一個不同檔案型別的集合。它們是文件、原始碼、可執行檔案和文字檔案的混合體。
ls命令將顯示目錄中的內容,-hl(人類可讀大小,長列表)選項將顯示每個檔案的大小:
ls -hl讓我們試試這些檔案,看看我們得到了什麼:
file build_instructi***.odt file build_instructi***.pdf file COBOL_Report_Apr60.djvu正確識別了這三種檔案格式。在可能的情況下,檔案給了我們更多的資訊。據報道,PDF檔案為1.5版格式。
即使我們將ODT檔案重新命名為具有任意值XYZ的副檔名,在檔案瀏覽器和使用file的命令列中,仍然可以正確識別該檔案。
在檔案瀏覽器中,它被賦予了正確的圖示。在命令列上,file忽略副檔名並檢視檔案內部以確定其型別:
file build_instructi***.xyz使用媒體上的檔案(如影象和音樂檔案)通常會產生有關其格式、編碼、解析度等的資訊:
file screenshot.png file screenshot.jpg file Pachelbel_Canon_In_D.mp3有趣的是,即使是純文字檔案,file也不會根據副檔名來判斷檔案。例如,如果您有一個副檔名為“.c”的檔案,其中包含標準純文字,但不包含原始碼,則該檔案不會將其誤認為是真正的c原始碼檔案:
file function+headers.h file makefile file hello.c檔案將標頭檔案(“.h”)正確地標識為檔案的C原始碼集合的一部分,並且它知道makefile是一個指令碼。
二進位制檔案比其他檔案更像一個“黑匣子”。可以透過適當的軟體包檢視影象檔案、播放聲音檔案和開啟文件檔案。不過,二進位制檔案更具挑戰性。
例如,檔案“hello”和“wd”是二進位制可執行檔案。它們是程式。名為“wd.o”的檔案是一個物件檔案。當編譯器編譯原始碼時,會建立一個或多個目標檔案。這些包含計算機在完成的程式執行時最終將執行的機器程式碼,以及連結器的資訊。連結器檢查每個物件檔案中對庫的函式呼叫。它將它們連結到程式使用的任何庫。這個過程的結果是一個可執行檔案。
“檔案”監視.exe“是已交叉編譯以在Windows上執行的二進位制可執行檔案:
file wd file wd.o file hello file watch.exe先拿最後一個,檔案告訴我們監視.exe“檔案是一個PE32+可執行控制檯程式,用於Microsoft Windows上的x86系列處理器。PE代表可移植可執行格式,它有32位和64位版本。PE32是32位版本,PE32+是64位版本。
其他三個檔案都被標識為可執行和可連結格式(ELF)檔案。這是可執行檔案和共享物件檔案(如庫)的標準。我們將很快了解ELF頭格式。
您可能會注意到,這兩個可執行檔案(“wd”和“hello”)被標識為Linux標準基(LSB)共享物件,而物件檔案“wd.o”被標識為LSB可重定位檔案。“可執行檔案”這個詞顯然不存在。
物件檔案是可重定位的,這意味著其中的程式碼可以在任何位置載入到記憶體中。可執行檔案被列為共享物件,因為它們是由連結器從物件檔案建立的,這樣它們就繼承了這個功能。
這允許地址空間佈局隨機化(ASMR)系統將可執行檔案載入到其選擇的地址的記憶體中。標準可執行檔案的標頭檔案中有一個載入地址編碼,該地址指示將它們載入到記憶體中的位置。
ASMR是一種安全技術。將可執行檔案以可預測的地址載入到記憶體中,使它們容易受到攻擊。這是因為攻擊者總是知道它們的入口點和函式的位置。定位在隨機地址的獨立可執行檔案(PIE)克服了這種敏感性。
如果我們用gcc編譯器編譯程式並提供-no-pie選項,我們將生成一個常規的可執行檔案。
-o(輸出檔案)選項允許我們為可執行檔案提供名稱:
gcc -o hello -no-pie hello.c我們將在新的可執行檔案上使用檔案,並檢視發生了什麼變化:
file hello可執行檔案的大小與以前相同(17 KB):
ls -hl hello二進位制檔案現在被標識為標準可執行檔案。我們這樣做只是為了演示。如果這樣編譯應用程式,您將失去ASMR的所有優點。
我們的示例hello程式是17kb,所以它很難被稱為big,但是,一切都是相對的。原始碼為120位元組:
cat hello.c如果它只需要在終端視窗中列印一個字串,那麼二進位制檔案的擴充套件是什麼呢?我們知道有一個ELF頭,但是對於一個64位二進位制檔案來說只有64位元組長。很明顯,這肯定是另外一回事:
ls -hl hello讓我們用strings命令掃描二進位制檔案,作為發現其中內容的簡單第一步。我們將把它輸送到更少的地方:
strings hello | less二進位制檔案中除了“你好,極客世界!“從我們的原始碼。其中大部分是二進位制檔案中區域的標籤,以及共享物件的名稱和連結資訊。這些庫包括二進位制檔案所依賴的庫和這些庫中的函式。
ldd命令顯示二進位制檔案的共享物件依賴關係:
ldd hello輸出中有三個條目,其中兩個包含目錄路徑(第一個不包含):
我們可以使用readelf實用程式和-h(檔案頭)選項檢查並解碼ELF頭:
readelf -h hello標題為我們解釋。
所有ELF二進位制檔案的第一個位元組被設定為十六進位制值0x7F。接下來的三個位元組被設定為0x45、0x4C和0x46。第一個位元組是將檔案標識為ELF二進位制檔案的標誌。為了清楚地說明這一點,接下來的三個位元組用ASCII碼拼寫出“ELF”:
其他條目是二進位制檔案中區域和部分的大小和數量,因此可以計算它們的位置。
使用hexdump快速檢視二進位制檔案的前8個位元組,將顯示檔案前4個位元組中的簽名位元組和“ELF”字串。-C(canonical)選項為我們提供位元組的ASCII表示及其十六進位制值,-n(number)選項讓我們指定要檢視的位元組數:
hexdump -C -n 8 hello如果您想檢視細節,可以使用objdump命令和-d(反彙編)選項:
objdump -d hello | less這將反彙編可執行的機器程式碼,並以十六進位制位元組與組合語言等價物一起顯示。每行中第一個bye的地址位置顯示在最左邊。
只有當你能讀懂組合語言,或者你好奇幕後發生了什麼時,這才有用。有很多輸出,所以我們把它輸送到更少的地方。
有許多方法可以編譯二進位制檔案。例如,開發人員選擇是否包含除錯資訊。二進位制檔案的連結方式也影響其內容和大小。如果二進位制引用將物件作為外部依賴項共享,那麼它將小於依賴項靜態連結到的物件。
大多數開發人員已經知道我們在這裡介紹的命令。不過,對於其他人來說,它們提供了一些簡單的方法來翻查二進位制黑盒中的內容。
...您可以嘗試用文字編輯器開啟這些檔案,但它可能不知道如何解釋它們。下面顯示了嘗試使用文字編輯器開啟Microsoft Excel檔案的結果。 ...
... 讓我們看看軟體是如何安裝在三大桌面平臺上的:Windows、macOS和Linux。 ...
...給某人的敏感資訊,如密碼或伺服器登入資訊,但不知道如何安全地傳送這些資訊以避免資訊落入壞人手中? ...
...獲和資料包分析,Brim將徹底改變你的工作流程。 相關:如何在Linux上使用Wireshark過濾器 安裝邊緣 Brim非常新,所以它還沒有進入Linux發行版的軟體庫。不過,在Brim下載頁面上,您會找到DEB和RPM包檔案,因此在Ubuntu或Fedora上安裝...
...看到PID為1的過程是系統化的。在Manjaro-Linux上執行相同的命令會產生不同的結果。PID為1的程序被標識為/**in/init。快速檢視該檔案會發現它是指向systemd的符號連結: ps -fp 1 ls -hl /**in/init 透過對ps使用ppid(父程序ID)選項,我們可...
...但這並沒有什麼不好的地方。我們將解釋它的作用,以及如何調整它。 什麼是$path,它是如何工作的($path on linux, and how does it work)? 當您在終端視窗中鍵入一個命令並按Enter鍵時,您甚至在執行命令之前就開始了大量的活動。 B...
...料。它甚至可以實時顯示新增到檔案中的更新。我們教你如何使用它。 他殺了尾巴嗎? tail命令顯示檔案末尾的資料。通常,新資料會新增到檔案的末尾,因此tail命令是檢視檔案中最新新增內容的一種快速簡便的方法。它還可...
...在shell中的,因此Bash不必費勁地查詢這些命令。 但是Bash如何定位其他命令、程式和外部獨立二進位制檔案呢?Bash使用路徑,實際上是一組路徑,每個路徑指向一個目錄。然後,它在每個目錄中搜索與您試圖執行的命令或程式匹...