首页
社区
课程
招聘
[原创]boot.img逆向分析
发表于: 2015-8-30 13:40 23579

[原创]boot.img逆向分析

2015-8-30 13:40
23579

目的:
需要能够对boot.img文件中的zImage内核逻辑修改,比如adb reboot edl中将edl关键字修改为其他字符。
zImage中的内核是经过压缩的,所以需要找到提取内核压缩文件的方法以及重新生成zImage的方法。

研究前提:
以高通平台的手机作为研究基础;

zImage生成过程研究:
 
我们用此图说明一下zImage的产生过程。首先顶层vmlinux是ELF格式的可执行文件,必须将其二进制化生成Image后才可以被bootloader引导。为了实现压缩的内核映像,arch/arm/boot/compressed/Makefile又将这个非压缩映像Image做gzip压缩,生成了piggy.gzip。但要实现在启动时自解压,必须将这个piggy.gzip转化为.o文件,并同初始化程序head.o和自解压程序misc.o一同链接,生成arch/arm/boot/compressed/vmlinux。最后arch/arm/boot/Makefile将这个ELF格式的arch/arm/boot/compressed/vmlinux二进制化得到可被bootloader引导的映像文件zImage。
逆向分析方案的研究过程:
从zImage生成过程可知,piggy.gz生成了piggy.o,查看编译脚本$(obj)/piggy.$(suffix_y).o:arch/arm/boot/compressed/ piggy.gzip.o,其实是arch/arm/boot/Image经过gzip压缩后(piggy.gzip),再借助piggy.gzip.S一起编译出的ELF可链接文件。其中的原理可以看看piggy.gzip.S源码。
.section .piggydata,#alloc
.globl input_data
input_data:
.incbin "arch/arm/boot/compressed/piggy.gzip"
.globl input_data_end
input_data_end:
可以看到piggy.gzip是被作为input_data生成在了piggy.o,保持原样没有改动。
piggy.o再经过lds生成了vmlinux,再经过objcopy由elf格式转换到了bin格式,这一过程中piggy.gzip这部分数据也没有被改写。
所以从zImage中是可以提取出piggy.gzip文件的,那么怎么提取呢?
我们通过一套项目代码环境,编译获得piggy.gzip,piggy.gzip.o,vmlinux,然后比较这几个文件确定出生成piggy.gzip的头和尾,头是“1f 8b 08 00 00 00 00 00 02 03”,尾部是“a0 53 d6 f1 b0 4a fe 00”,那么头和尾有通用性么?
 
我们多次修改代码,得到多次的结果,再比较piggy.gzip的头和尾,发现头部是一样的,但尾部差异很大,唯一可以确认的是尾部出现在倒数第四行。
对于头部的规律也通过源码进行了确认, \kernel\lib\decompress_inflate.c
 
在解压缩的代码中有一段代码注释,gzip header是一个10字节的头。
所以我们搜索一下“1f 8b 08 00 00 00 00 00 02 03”,可以找到piggy.gzip的头。
对于尾部的规律有一个重要的特性,gzip格式最后的四个字节,是文件压缩前的大小,存放格式是小端模式。所以我们查找尾部的规律是在zImage文件的倒数第四行,查找怀疑是文件大小的四个字节,然后将头尾间数据保存下来,windows下用7z工具解压并查看解压后文件的大小,换算成16进制验证截取的尾部是否正确。

正确的解压缩内核后我们就可以通过IDA等工具进行逆向分析和修改了,这里不是本文重点不再深入说明。

方案步骤如下:
1.  从boot.img得到zImage。可以通过如linux下 unpackbooting等工具获得zImage,命令是./unpackbootimg  -i boot.img 。
2.  从zImage提取出压缩的内核文件。内核提取的方法见上面的描述。命令可以使用
dd if=输入文件名 of=输出文件名 bs=1 skip=1000 count=2000,指令含义是将输入文件的前1000个字节跳过,截取之后的2000个字节并输出到文件。
3.  对压缩文件进行解压。可以在windows下使用7z工具直接解压。
4.  将解压后的文件中的edl修改为其他字符。
5.  压缩文件。根据编译脚本,命令是“cat 文件名 | gzip –n –f -9 > 压缩后文件名”。
6.  将压缩后的文件插入到提取出来的位置,生成zImage。
7.  重新打包生成boot.img。可以通过如linux下mkbooting等工具。命令是
./mkbootimg  --kernel ./boot.img-zImage --ramdisk ./boot.img-ramdisk.gz --cmdline "XXXXXXXXX" --base 0x00000000 --pagesize 2048 --dt ./boot.img-dt.gz --tags_offset 1E00000 --output ./boot.img,其中—cmdline,--base,--pagesize,-- tags_offset参数需要替换成第1步解包时的参数。

 

验证:
在高通平台红米2手机上测试通过。

Mtk平台说明
逆向分析方案与高通平台一致,可以按照高通平台的方法操作,但有一点要注意,最后需要将原boot.img的前64个字节复制到制作的boot.img中。

在mt6735平台android 5.0项目上验证通过。

遗留问题
修改再压缩后的文件一定要与未修改前的压缩文件大小一致,目前没有找到可以自由修改的方法。

新浪博客:33cK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2K6K9h3&6S2i4K6u0W2j5$3!0E0i4K6u0W2j5$3&6Q4x3V1k6#2i4K6u0r3x3K6p5I4z5e0p5%4y4o6x3J5y4H3`.`.


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (10)
雪    币: 231
活跃值: (2666)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
有UBI镜像解压的教程没?
2015-8-31 03:12
0
雪    币: 5305
活跃值: (5345)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼主,你那个是ms vc 的 ide么?   那个流程线咋设置出来的哦 分享一下
2015-8-31 08:52
0
雪    币: 76
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
Mtk平台也有 edl?
2015-8-31 09:00
0
雪    币: 47
活跃值: (29)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
没有UBI镜像解压的教程
2015-8-31 15:42
0
雪    币: 47
活跃值: (29)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
edl是高通平台的独有紧急下载模式。mtk平台可以参考本文方法修改。
2015-8-31 15:43
0
雪    币: 47
活跃值: (29)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
流程是指“方案步骤如下:”这部分么? 哪里还有没有说明白的地方?我再细化一下。
2015-8-31 15:49
0
雪    币: 959
活跃值: (66)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
上传的附件:
2015-8-31 20:25
0
雪    币: 1149
活跃值: (1033)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
9
1f 8b  其实只是提取模糊固件的一个模式,源码下面无秘密..... 看看binwalk 的magic 源码就通透了
2015-9-1 11:26
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我正在分析内核,这篇文章应该有帮助。谢谢楼主!
2015-9-24 10:42
0
雪    币: 215
活跃值: (51)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
最后打包img可以使用一个工具 427K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6^5K9h3q4G2L8s2g2Q4x3V1k6E0K9$3u0G2L8%4c8A6L8h3N6Q4y4h3k6@1L8$3!0D9M7#2)9J5y4X3&6T1M7%4m8Q4x3@1u0Q4x3U0k6F1j5Y4y4H3i4K6y4n7i4@1f1$3i4@1q4r3i4K6V1@1i4@1f1^5i4@1u0q4i4K6R3K6i4@1f1$3i4K6V1$3i4@1t1&6i4@1f1@1i4@1u0q4i4@1u0r3
2015-9-29 03:53
0
游客
登录 | 注册 方可回帖
返回