如何解釋二進製文件的八進製或十六進制轉儲?
二進製文件有字元串和一些數字,如果我這樣做
od -c filename
或strings filename
,我可以正確地看到字元串。但是,數字呢?它們採用某種奇怪的格式。做完之後的文字
od -c filename
是這樣的:0000000 036 \0 032 004 SD \0 \0 \0 \0 seq 1 0000020 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ t \ 0 h 002 3 001 0000040 & \0 032 \f O 2 006 \0 \0 \0 osfus 1 0000060 ó 002 3 001 ÿ \ r \ 0 \ 0 \ t \ 0 \ 0 @ 3 × 0000100 233 º 004 \0 é 003 \0 \0 & \0 032 \f O 2 7 \0 0000120 \0 \0 ospheus 1 o 002 3 001 是 235 0000140\0\0 035 003\0@3×233º004\0Ñ\a\0\0 0000160 ä \0 032 \f 或 E \0 \0 \0 osfap 1
如何破譯這個?
我什至試過
hexdump -C filename
輸出是這樣的:
00000000 1e 00 1a 04 53 44 00 00 00 00 73 65 71 31 20 20 |....SD..seq1 | 00000010 20 20 00 00 00 00 00 00 00 00 09 00 f3 02 33 01 | ..........ó.3 00000020 26 00 1a 0c 4f 32 06 00 00 00 6f 73 66 75 73 31 |&...O2...osfus1| 00000030 20 20 f3 02 33 01 ff 0d 00 00 09 00 00 40 33 d7 | ó.3.ÿ ...... @ 3 × | 00000040 9b ba 04 00 e9 03 00 00 26 00 1a 0c 4f 32 37 00 |.º..é...&...O27.| 00000050 00 00 6f 73 66 65 75 31 20 20 f3 02 33 01 e9 9d | ..osfeu1 ó.3.es. | 00000060 00 00 1d 03 00 40 33 d7 9b ba 04 00 d1 07 00 00 | ..... @ 3 × .º..Ñ ... | 00000070 e4 00 1a 0c 4f 72 45 00 00 00 6f 73 66 61 70 31 ä ... OrE ... osfap1 |
為了澄清,作為正常文件的主文件有一個顯示的屬性是一些奇怪的格式,所以我們正在查看原始/二進製文件。
對正常文件進行八進制轉儲,解決了查看問題。
有了
grep 'id=123' regular_file | head -1 | od -c
,我可以看到裡面有什麼數字。我期待 1,它向我們顯示為 001。
有很多儲存數字的方法 - ASCII(可以具有特定於語言環境的變體,例如使用“,”來分隔小數部分或作為千位分組),二進制整數(可變位數)/浮點數/雙精度數(所有這可能取決於字節序架構以及生成文件的軟體是否將表示形式化),BCD(未壓縮,打包,定點和其他變體),雙五進制編碼十進制……
沒有標準。
對於電腦科學,我必須記住的第一件事是數據 + 解釋 = 有用資訊。一個推論是,如果您缺少數據或解釋,那麼您將一無所有。數據本身不能告訴你如何解釋它。(您可以擁有告訴您這一點的元數據,但是您也需要知道如何解釋元數據)
在這種情況下,我建議嘗試這樣做:
file filename
如果它想出類似的東西:
filename: data
而且你完全不知道格式是什麼,它來自什麼程序,它的用途是什麼,或者任何關於 的內容
filename
,那麼你可能應該放棄。八進制轉儲輸出
od
(八進制轉儲)產生一個混合的文本和八進制轉儲。非數字要麼是可列印字元,例如o
,s
,f
等,要麼是不可列印字元,例如\0
(ASCII 0,NUL
) 或\a
(ASCII 7,BEL
),或者是以 8 為基數的數字,帶有標準 C 前綴0
(例如032
= 26 in十進制)。您的文件被解釋為8 位字節流。十六進制轉儲輸出
hexdump
生成傳統的十六進制轉儲,其中一列以十六進制列出 8 位字節,另一列顯示這些字節對應的 ASCII 字元(如果有)(如果字節值是不可列印的 ASCII 字元,或者根本不是 ASCII 字元,.
顯示在該位置)。同樣,您的文件被解釋為8 位字節流。整數
如果您的文件包含 100% 的二進制整數(即某種整數表示的無標題、統一、一維數組),那麼您必須自己回答所有這些問題:
- 它們是“正確的”二進制還是二進制編碼的十進制 (BCD)?(可能是二進制)
- 它們有多寬?
- 如果它們的寬度不是 8 的倍數,它們是像 SMS 消息或 Base64 那樣按位打包,還是按字節對齊?
- 如果它們的寬度是 8 位或更多,那麼字節順序是什麼?它是 Big Endian、Little Endian 還是其他更稀有的一種?
- 整數是有符號的還是無符號的?
- 如果它們已簽名,它們是否以二進制補碼(更有可能)或一個補碼或稀有和奇怪的東西表示?
我現在可能忘記了更多。
這僅適用於來自通用的現代電腦體系結構的一維統一整數數組。如果您的數據有任何復雜性,事情就會變得如此多毛,贏得彩票很快就會變得比僅僅猜測格式更容易。除非您知道格式,否則您必須猜測(有根據的猜測,但只是猜測)。