從Android boot.img與recovery.img的解包中瞭解其數據組成

從Android boot.img與recovery.img的解包中瞭解其數據


又到了忙碌的季節,一次要處理N多事情。最近需要從boot.img中取出ramdisk。不同的項目中kernel是一樣的,ramdisk中的資源不一樣,直接取ramdisk與新編譯的kernel打包在一起,方便又快捷。下面就看看boot.img的結構。

在網上搜索了一遍,找到幾個文章,說得都挺明白的了。boot.img由四部分組成:1 page的header,n page的kernel,m page的ramdisk,o page的second stage。幾個部分是緊密接合在一起的,大小不夠一個page的填充0補齊。還有完整的perl腳本來解包,真的是一應俱全。知其然還要知其所以然,下來就看看其數據究竟是怎麼分佈的,也當是留給自己的備註信息。

先是 1 page的頭部信息:
    page的單位是多少?一般文章都只說了是2K的文件頭。這個是標準如此定死了還是有跡可尋呢?先別管這塊,取2K的數據看一下吧。分析腳本所得,具體數據偏移如下:(這部分的信息是定義在android-src/system/core/mkbootimg/bootimg.h中,也可以從此文件獲得。)
    1)偏移0x00,8 byte,總是"ANDROID!",相當於magic number吧。
    2)偏移0x08,8 byte,前4byte是kernel的大小,後4byte是kernel載入內存的地址。
    3)偏移0x10,8 byte,結構同kernel,前4byte是ramdisk的大小,後4byte是載入地址。
    4)偏移0x18,8 byte,結構同上,前4byte是second stage的大小,後4byte是載入地址。這部分一般都沒有,大小是0。
    5)偏移0x24,4 byte,頁(page)大小,一般是0x800,也就是2K。
    6)偏移0x30,16 byte,boot name,貌似沒怎麼用上。
    7)偏移0x40,512 byte,cmdline內核參數,這個不多說了,懂什麼是內核的都明白吧。

後續的kernel和ramdisk,都可以根據文件頭中的信息算出地址和大小,直接分解出來即可。注意填充的0要去掉,可能對第二次打包產生影響。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章