时时勤拂拭,勿使惹尘埃

TOC

Categories

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目录生成程序。
$ 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
该指令显示镜像文件指向的具体文件

但由于不同手机,其中msm_sdcc.1可能有不同,可以使用find -name 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了)。
/*
** +-----------------+ 
** | 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(可以用于设置很多系统的参数)等文件。
./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
这样boot.img-ramdisk中的内容全部解压到了ramdisk目录下。

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-kernelrecovery.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
  1. default.prop,最关键的:
    ro.secure=0 关闭保护
    ro.allow.mock.location=1
    ro.debuggable=1 调试模式开
    persist.service.adb.enable=1 adb远程开
  2. /sbin 里面有个recovery文件,所有的第三方功能都在这个recovery中实现。
  3. /etc 里的recovery.fstab,是挂载表,可以提供sd卡ext分区支持。
  4. /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 评论:

发表评论