以芯片直讀方式得到的全盤鏡像解析及ext4日志區域解析——GPT分區


       之前在centos中分析了/dev/sda1下的結構,但當對象是一塊以芯片直讀方式作出來的全盤鏡像呢?

        這次以安卓手機的全盤鏡像為對象,嘗試按照ext4文件系統結構手動解析,加強對ext4文件系統、EFI系統分區、GPT磁盤的理解,補充ext4文件系統的日志結構的描述。

  我得到的全盤鏡像有兩種格式,一種.img,一種是.bin,兩種鏡像的組織方式是比較類似的,但可能因為是不同的直讀機做出的原因,.img格式的鏡像在“真正的數據”前附加了機器的標志信息。

  .bin格式鏡像分析

  .bin格式全盤鏡像是以GPT分區的方式進行管理的,GPT磁盤的總體布局如下:

  

  .bin格式的全盤鏡像頭512個字節也就是0號扇區的內容是一個DOS分區,分區表的內容如下:  

  

  該分區表只有一個表項被使用,記錄的分區起始扇區號是0x01,分區扇區數是:0xDA BF FF,0號扇區最后兩個字節就是MBR扇區的有效標志0x55 AA。當然在dos分區表前面還有446個字節的引導代碼區域,這里的引導代碼沒有寫,就沒有截圖了。

  接下來我們看1號扇區的內容,按照GPT磁盤的總體布局,1號扇區是EFI信息區也就是GPT頭,他對解析GPT分區是很關鍵的存在,因為其中記錄了GPT分區表、GPT分區區域的位置以及大小,分區表中每個表項的大小(字節數),下面是1號扇區部分內容:

  

  可以看到前7個字節是EFI分區的簽名“EFI PART”,0x28-0x2F處是GTP分區區域的起始塊號,接下來8個字節是終止塊號,0x47-0x4F處的8個字節是GPT分區表的起始塊號,接下來的4個字節是GPT分區表表的項數,然后四個字節是GPT分區表每一項的字節數。

  從2號扇區到33號扇區存儲的就是GPT分區表,包括我們表熟悉的/system,/boot,/userdata分區等等,以/userdata分區為例,查看他的GPT分區表項:

  

  前16個字節是分區類型GUID,接下來16個字節是分區的唯一GUID,然后8個字節是分區起始扇區號,接下來是分區終止扇區號,再8個字節是分區屬性,后面一直到這個表項結束都是分區名的Unicode碼。

  我們查看0x564000號扇區的內容(偏移0x564000*0x200=0xac800000)發現內容是全0,然后在偏移量增加0x400后發現了ext4的超級塊結構,這和對單個分區的解析結果是一致的,說明我們解析全盤鏡像的時候,與解析單個分區相比,只是增加了解析EFI分區和GPT分區的部分。

  /userdata分區日志分析

  接下來通過解析一下/userdata分區的日志部分,來記錄ext4的日志結構。

  查看/userdata分區的超級塊,得到該分區中塊的0號塊組的起始塊號是0,每個塊組有0x8000個塊、0x2000個i節點,每個塊大小是0x1000個字節,i節點表的每個表項長度是0x100個字節。

  接下來我們需要通過查看塊組描述符表來得知每個塊組的i節點表起始塊號。塊組描述符表的起始塊號分三種情況:

    1、當塊的大小為0x400時,塊組描述符表在2號塊(偏移0x800處)

    2、當塊的大小為0x800時,塊組描述符表在1號塊(偏移0x800處)

    3、當塊的大小為0x1000時,塊組描述符表在1號塊(偏移0x1000處)

  這里計算塊組描述符表的時候需要加上分區的起始偏移0xac800000,也就是0xac801000

  

  可以看到0號塊組的i節點表起始塊號是0x0303,我們知道ext4文件系統的8號i節點是日志節點,我們來查看8號i節點的內容以找到日志所在塊號。

  8號i節點所在的偏移為:0xac800000+0x0303*0x1000+(8-1)*0x100=oxacb03700:

  

  可以看到該i節點的extent結構中,有兩個有效的entry,extent_header的深度為0,第一個extent結構記錄的塊號是0x0503,第二個extent記錄的塊號是0x0504。

  我們查看0x0503塊號的內容,計算該塊的偏移位置:0xac800000+0x0503*0x1000=0xacd03000

  在查看日志內容前我們需要清楚一點,ext4文件系統整個是小端模式,但ext4的日志區域確實大端模式

  

  上面是一個日志的超級塊部分內容,前12個字節是ext4日志的標准頭,通過他我們可以區分某個塊是否是日志塊,是日志塊的哪個部分。前4個字節ext4的日志簽名“c0 3B 39 98”,然后四個字節是日志塊類型,0x04是超級塊(版本2),0x01是描述符塊,0x02是提交塊,0x03是超級塊(版本1),0x05是廢除塊,然后四個字節是序號。接下來就進入了超級塊的內容,前4個自己是日志塊的大小,一般和普通文件的塊大小是相同的,接下來4個字節是日志塊的數量,然后4個字節是日志的實際起始塊號,然后4個字節是第一個事務序號,接下來4個字節是第一個事務序號的日志塊號,這里所提到的日志塊號都是相對於日志區域的,因此在使用的時候需要進行轉換。

  接下來我們查看1號日志塊的內容,

   

  1號塊開始4個字節是日志標准頭的簽名,接下來的4個字節的屬性值為0x01,說明這是一個描述符塊,標准頭結束后就是真正的描述符塊的內容,0x2E 00 02是這組記錄的文件系統塊號,接下來4個字節是項標志。項標志有四種,分別為:0x01(日志塊避開),0x02(與前面具有相同的UUID,此時沒有后面的UUID區域),0x04(本塊已經被事務刪除),0x08(本描述項為描述塊中的最后一個描述項)。紅框框出本描述符塊記錄的部分塊號。接下來的塊將按照描述符塊中記錄的塊號順序“抄寫”文件系統塊。

   

  上面是下一個塊的部分內容,可以看到這是對i節點表所在塊的“抄寫”,當然讀這塊內容的時候需要依照小端模式讀取。

  在描述符塊中記錄的塊號被“抄寫”完成后,會有一個日志提交塊緊隨其后,表明一個日志記錄的完成

  

  觀察可發現,該日志提交塊的事務序號和日志描述符塊的事務序號是相同的。

  以上就是簡單解析一個ext4日志區域的過程。

  另外.img格式的鏡像,我目前看到的除了在EFI分區信息前面添加了制作鏡像的機器信息外,其他結構和.bin是一樣的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM