Python

EXT4 CRC32C 校驗和算法記錄不充分

  • March 17, 2019

所以我正在對 EXT4 校驗和進行某種研究。

我找到了這個頁面並嘗試自己計算校驗和。我從 Superblock 開始,因為它聽起來很簡單:“整個超級塊直到校驗和欄位”。

但它不起作用:我無法得到與超級塊相同的結果。

對於這個任務,我在 Python 上編寫了超級塊校驗和計算器。你可以看看我在 GitHub 上的程序。我嘗試了很多東西。

首先,我嘗試將整個超級塊讀取到校驗和(1020 字節)並將其放入 CRC32C(算法是來自 pip 的獨立庫)。儘管這是在 wiki 中編寫的,但這不起作用。

然後我簡單地反轉了整個超級塊。我認為這沒有多大意義。而我又失敗了。

在此之後,我嘗試了更複雜的方法。我試圖分別反轉超級塊的所有欄位。如您所見,它給出了另一個結果:

Raw data: 1F DC 5E 4A

2-byte fields reversed: DC 1F 4A 5E

Full data reverse: 4A 5E DC 1F

再一次,我失敗了。至此,對片語“直到校驗和欄位的整個超級塊”的所有解釋都結束了。

我嘗試在所有算法中添加零填充校驗和欄位,並嘗試僅反轉 little-endian 欄位(實際上似乎是個好主意),而不反轉 char 和 u8 欄位。

但是沒有機會獲得與原始超級塊相同的校驗和。

我的腳本為超級塊生成這樣的輸出:

00c0390000cae600198a0b00c6aca40039a835000000000002000000020000000080000000800000002000001ee68c5c17e68c5c2000ffff53ef01000100000055936d5c000000000000000001000000000000000b000000000100003c000000c60200006b040000d6eb1a5613a44a8a91b66dbfe7cbbca9000000000000000000000000000000002f0061726765740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000800000000000000f00c3000ca7d5363a49944fd9db16c0f95cfab15010140000c0000000000000055936d5c0af3020004000000000000000000000000800000008070000080000000800000000071000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000200020000100000000000000000000000000000000000000040100000d63df0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe3731ed

原始校驗和(未計算!):0xfe3731ed

計算的整個超級塊:0xffffffffL - 這總是發生,可能是一些溢出錯誤。

計算的沒有校驗和的超級塊:0x12cec801L

沒有校驗和的計算完全反轉的超級塊:0x7fe225e5L

計算的欄位反轉超級塊:0x8cce5045L

我找不到任何文件,而且 ext4 原始碼文件的註釋很差(而且非常複雜),我無法理解它們。

好的。我從 Reddit (nightbladeofmalice) 得到了答案。這個人注意到,如果你從 0xFFFFFFFF 中減去它,那麼沒有校驗和欄位 (0x12cec801) 的原始超級塊的校驗和將給出反轉的(大端)原始校驗和:

原始超級塊:00c0390000cae600198a0b008f99a400e8a53500000000000200000002000000008000000080000000200000082d8e5c012d8e5c2100ffff53ef01000100000055936d5c000000000000000001000000000000000b000000000100003c000000c60200006b040000d6eb1a5613a44a8a91b66dbfe7cbbca9000000000000000000000000000000002f00617267657400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000008000000000000008e013000ca7d5363a49944fd9db16c0f95cfab15010140000c0000000000000055936d5c0af302000400000000000000000000000080000000807000008000000080000000007100000000000000000000000000000000000000000000000000000000000000001000000000000000000000000020002000010000000000000000000000000000000000000004010000df1b5b1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015de7cf3

原始校驗和(未計算,大端!):0xf37cde15

CRC32C 中沒有校驗和欄位的原始超級塊(1020 字節):0xc8321eaL

反轉校驗和(0xFFFFFFFF-前一個欄位):0xf37cde15L

引用自:https://unix.stackexchange.com/questions/506714