binwalk 提取bootimg_boot.img格式文件结构解析

本文详细介绍了Android boot.img的结构,包括boot header、kernel、ramdisk等部分,并通过binwalk工具进行解析。内容涉及boot_img_hdr结构、页大小设置以及kernel_addr、ramdisk_addr等关键地址的计算。示例以msm8226平台为例,展示了如何验证boot.img的实际内容。
摘要由CSDN通过智能技术生成

298d09ef42d9a6f2c9b79e94c950625e.png本帖最后由 ironMan.K 于 2018-3-22 13:50 编辑

以msm8226为例,讲解android源码编译生成boot.img的结构。boot.img包括boot.img header、kernel以及ramdisk文件系统。下面是对boot.img的结构进行解读。

boot.img 文件头信息的具体结构可以在system/core/mkbootimg/bootimg.h中看到:

typedef struct boot_img_hdr boot_img_hdr;

#define BOOT_MAGIC "ANDROID!"

#define BOOT_MAGIC_SIZE 8

#define BOOT_NAME_SIZE 16

#define BOOT_ARGS_SIZE 512

struct boot_img_hdr{unsigned char magic[BOOT_MAGIC_SIZE];

unsigned kernel_size;  /* size in bytes */unsigned kernel_addr;  /* physical load addr */

unsigned ramdisk_size; /* size in bytes */unsigned ramdisk_addr; /* physical load addr */

unsigned second_size;  /* size in bytes */unsigned second_addr;  /* physical load addr */

unsigned tags_addr;    /* physical addr for kernel tags */unsigned page_size;    /* flash page size we assume */unsigned dt_size;      /* device tree in bytes */unsigned unused;       /* future expansion: should be 0 */unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */

unsigned char cmdline[BOOT_ARGS_SIZE];

unsigned id[8]; /* timestamp / checksum / sha1 / etc */};

boot,img文件跳过2k的文件头之后,包括两个 gz包,一个是boot.img-kernel.gz:Linux内核,一个是boot.img-ramdisk.cpio.gz

大概的组成结构如下:

** +-----------------+

** | boot header     | 1 page

** +-----------------+

** | kernel          | n pages

** +-----------------+

** | ramdisk         | m pages

** +-----------------+

** | second stage    | o pages

** +-----------------+

** | device tree     | p pages

** +-----------------+

** n = (kernel_size + page_size - 1) / page_size

** m = (ramdisk_size + page_size - 1) / page_size

** o = (second_size + page_size - 1) / page_size

** p = (dt_size + page_size - 1) / page_size

图一是boot.img头文件结构解析:

boot.img头文件结构解析

圈一:安卓的boot.img标准的文件头格式:ANDROID!(8字节)

圈二:kernel_size(4字节)

圈三:kernel_addr(4字节)

圈四:ramdisk_size(4字节)

圈五:ramdisk_addr(4字节)

圈六:second_stage_size(4字节)

圈七:second_stage_addr(4字节)

图八:tags_addr(4字节)

圈九:page_size(4字节)

boot.img头文件信息,kernel_addr,ramdisk_addr,second_stage_addr在bootable\bootloader\lk\target\msm8226\Rules.mk中设置:

PLATFORM := msm8226

MEMBASE:= 0x0FF00000 # SDRAM

MEMSIZE:= 0x00500000 # 5MB

BASE_ADDR := 0x00000

TAGS_ADDR:= BASE_ADDR+0x00000100

KERNEL_ADDR:= BASE_ADDR+0x00008000

RAMDISK_ADDR:= BASE_ADDR+0x01000000

SCRATCH_ADDR:= 0x10400000

page是页长,为1k(1024)的整数倍。此处为0x00000800,十进制为2048。

结合实际的boot.img文件,进行验证。如图二,是msm8226 boot.img

e2be500f58a6132bf711cab31f4ee80d.png

图二 msm8226 boot.img内容

解析msm8226 boot.img内容,可以得到:

base=0x00000000

kernel_size=0x005ff6f0

kernel_addr=0x00008000+base=0x00008000

ramdisk_size=0x00195de2

ramdisk_addr=0x01000000+base=0x01000000

sencond_stage_size=0x00000000

sencond_stage_addr=0x00f00000+base=0x00f00000tag_size=0x00000100

page_size=0x00000800(2KB)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值