Android(二)boot.img&recovery.img重打包
Android 系统的rom最主要的就是3个文件:boot.img、system.img、userdata.img。其中boot.img 存放着内核以及Android系统的配置信息,比如android系统各文件夹的读写权限,adb 的权限。所以如果要修改文件夹的写权限,adb的root权限,修改boot.img对应的地方就ok了。system.img中存放的是系统的各种库,系统预装的app等,userdata.img是用户的配置信息。
0x1 工具:
0x11 split_bootimg.pl
split_bootimg.pl是perl脚本,该脚本可以将boot.img&recovery.img的kernel和ramdisk读取出来。
0x12 mkboot-tools
这些是Android源码工具,需要自己编译。主要用到两个工具,mkbootimg、mkbootfs,用于重打包img文件。
git:https://github.com/kykdev/mkboot-tools
编译后在home目录生成程序。
编译后在home目录生成程序。
$ git clone https://github.com/CyanogenMod/android_system_core -b cm-12.0
$ cd android_system_core
$ gcc -o ~/mkbootimg libmincrypt/*.c mkbootimg/mkbootimg.c -Iinclude
$ gcc -o ~/mkbootfs libmincrypt/*.c cpio/mkbootfs.c -Iinclude
0x2 获取手机boot.img&recovery.img等镜像
需要root的手机
0x21 获取需备份文件具体位置
ls -al /dev/block/platform/msm_sdcc.1/by-name
该指令显示镜像文件指向的具体文件
0x22 备份img到sdcard
备份文件使用dd指令,if为输入为镜像具体位置,of为输出建议为sdcard,如:
dd if=/dev/block/mmcblk0p7 of=/sdcard/boot.img
0x23 adb dump
adb pull /sdcard/boot.img ./boot.img
0x3 boot和recovery映像的文件结构
boot和recovery映像并不是一个完整的文件系统,它们是一种android自定义的文件格式,该格式包括了2K的文件头,后面紧跟着是用gzip压缩过的内核,再后面是一个ramdisk内存盘,然后紧跟着第二阶段的载入器程序(这个载入器程序是可选的,在某些映像中或许没有这部分)。此类文件的定义可以从源代码android-src/system/core/mkbootimg找到一个叫做bootimg.h的文件。
(原文是一个叫做mkbootimg.h的文件,但从Android 2.1的代码来看,该文件名应该是改为bootimg.h了)。
(原文是一个叫做mkbootimg.h的文件,但从Android 2.1的代码来看,该文件名应该是改为bootimg.h了)。
/*
** +-----------------+
** | boot header | 1 page
** +-----------------+
** | kernel | n pages
** +-----------------+
** | ramdisk | m pages
** +-----------------+
** | second stage | o 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
**
** 0. all entities are page_size aligned in flash
** 1. kernel and ramdisk are required (size != 0)
** 2. second is optional (second_size == 0 -> no second)
** 3. load each element (kernel, ramdisk, second) at
** the specified physical address (kernel_addr, etc)
** 4. prepare tags at tag_addr. kernel_args[] is
** appended to the kernel commandline in the tags.
** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
** 6. if second_size != 0: jump to second_addr
** else: jump to kernel_addr
*/
ramdisk映像是一个最基础的小型文件系统,它包括了初始化系统所需要的全部核心文件,例如:初始化init进程以及init.rc(可以用于设置很多系统的参数)等文件。
参考:http://git.source.android.com/?p=kernel/common.git;a=blob;f=Documentation/filesystems/ramfs-rootfs-initramfs.txt
以下是一个典型的ramdisk中包含的文件列表:
以下是一个典型的ramdisk中包含的文件列表:
./init.trout.rc
./default.prop
./proc
./dev
./init.rc
./init
./sys
./init.goldfish.rc
./sbin
./sbin/adbd
./system
./data
0x4 boot.img修改
这里介绍怎么解开boot.img文件,修改对应的文件,使system文件夹有写权限,adb 登录后为root用户。下面所使用的方法需要一定的linux系统基础,如果对linux系统一点都不了解,请慎重进行下面的操作。
0x41 拆包boot.img
需要用到perl脚本split_bootimg.pl。在终端里输入以下命令:
./split_bootimg.pl boot.img
执行上述操作后, boot.img分成了两部分:boot.img-kernel和boot.img-ramdisk.gz,boot.img-kernel 是内核部分,这部分不能修改。boot.img-ramdisk.gz解压后得到的boot.img-ramdisk文件才是要修改的部分。
0x42 解压ramdisk
用file boot.img-ramdisk 命令查看boot.img-ramdisk文件格式,它是ASCII cpio archive格式,要用gzip命令即可打开。
解压及打开该文件的命令如下:
gzip -dc ../boot.img-ramdisk.gz | cpio -i
0x43 编辑default.prop
找到ramdisk目录下的 default.prop 文件,主要需要修改内容如下:
ro.secure=0 关闭保护
ro.allow.mock.location=1
ro.debuggable=1 调试模式开
persist.service.adb.enable=1 adb远程开
0x44 文件夹可写
找到ramdisk目录下的init.rc 文件,找到
mount yaffs2 mtd@system /system ro remount 这一行(不同的机子可能不一样,但是”mount”、”/system ro remount”都是一样的),其中的ro代表readonly,将其改成rw,就可读写了,这个改的是/system文件夹。
在取得了adb root权限后,这一步完全不需要修改,在adb 登录后通过执行:mount -o remount,rw /system可以达到一样的效果,只是前面的修改是永久有效的,后面这种是临时的,重启后就无效了。
0x45 重打包img
在ramdisk父目录下执行:
# mkbootfs ./ramdisk | gzip > ramdisk_new.gz
# mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel boot.img-kernel --ramdisk ramdisk_new.gz -o boot_new.img
(注意:console=null的命令行选项是从TC4-RC30的boot.img引入的,用以去掉root shell)
0x46 刷boot.img
最后在fastboot模式下使用
fastboot flash boot newboot.img
(或者刷机工具)将新的boot.img刷进系统。因为只修改了boot.img部分,所以先前装好的apk,下载的东西会完好无损的保存着,系统和原先一模一样,所以只有备份了一个可用的boot.img,就可以随便boot.img了,万一修改的boot.img启动不了,可以把备份的boot.img刷回去,系统一点改变都没有。
进入fastboot方式,大部分手机在关机下 “音量减+开机”,或者
adb reboot bootloader
0x5 recovery.img修改
recovery映像包含了一些额外的文件,例如一个叫做recovery的二进制程序(卡刷机等功能),以及一些对该程序支持性的资源图片文件。
典型的文件列表如下:
典型的文件列表如下:
./res
./res/images
./res/images/progress_bar_empty_left_round.bmp
./res/images/icon_firmware_install.bmp
./res/images/indeterminate3.bmp
./res/images/progress_bar_fill.bmp
./res/images/progress_bar_left_round.bmp
./res/images/icon_error.bmp
./res/images/indeterminate1.bmp
./res/images/progress_bar_empty_right_round.bmp
./res/images/icon_firmware_error.bmp
./res/images/progress_bar_right_round.bmp
./res/images/indeterminate4.bmp
./res/images/indeterminate5.bmp
./res/images/indeterminate6.bmp
./res/images/progress_bar_empty.bmp
./res/images/indeterminate2.bmp
./res/images/icon_unpacking.bmp
./res/images/icon_installing.bmp
./sbin/recovery
0x51 解包img
解recovery.img同样需要使用perl脚本split_bootimg.pl
./split_bootimg.pl recovery.img
生成
recovery.img-kernel
、recovery.img-ramdisk.gz
两个文件,kernel为内核0x52 解压ramdisk
recovery.img-ramdisk.gz
为压缩包文件,使用gzip解压
解包ramdisk的命令如下:
% mkdir ramdisk
% cd ramdisk
% gzip -dc ../recovery.img-ramdisk.gz | cpio -i
% cd ..
解码完毕后,就可以修改了,主要的工作在这里,这里是自制的地方。(例如,在
设置
default.prop
设置
ro.secure=0
等等)0x53 修改ramdisk
修改ramdisk内存盘,其内文件列表大致如下:
./init.trout.rc
./default.prop
./proc
./dev
./init.rc
./init
./sys
./etc
./init.goldfish.rc
./sbin
./system
./data
default.prop
,最关键的:
ro.secure=0 关闭保护
ro.allow.mock.location=1
ro.debuggable=1 调试模式开
persist.service.adb.enable=1 adb远程开- /sbin 里面有个recovery文件,所有的第三方功能都在这个recovery中实现。
- /etc 里的recovery.fstab,是挂载表,可以提供sd卡ext分区支持。
- /init可以用原生的,第三方的也行。
0x54 重打包img
ramdisk父目录:
mkbootfs ./ramdisk | gzip > ramdisk-new.gz
mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel recovery.img-kernel --ramdisk ramdisk-new.gz -o recovery-new.img
0x55 刷recovery
在fastboot模式下,使用
fastboot flash recovery recovery.img
(或者刷机工具)将新的recovery.img刷进系统即可
进入fastboot模式,大部分手机在关机下 “音量减+开机”,或者
adb reboot bootloader
进入recovery,大部分手机在关机下“音量加+开机”,或者
adb reboot recovery
0 评论:
发表评论