从Android boot.img与recovery.img的解包中了解其数据组成

来源:互联网 发布:中国的顶级域名是 编辑:程序博客网 时间:2024/06/04 18:54
从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要去掉,可能对第二次打包产生影响。