标题: Android 系统引导文件boot.img的修改 [打印本页]

作者: 51黑专家    时间: 2016-5-8 01:23
标题: Android 系统引导文件boot.img的修改
在Nexus 7的使用中,发现使用常规的root方法,经常会被超级用户管理程序(如superuser,360root等)的更新给破坏掉。这样导致的结果是需要再次对系统进行root操作。为了长期的获取root权限,准备通过直接修改Android的安全属性的方式,获取较高的安全管理权限。但是这个与目前的root做法是否相同,就不得而知,但是唯一的好处是获取这些安全管理权限以后,再次通过现有的root工具,可以很容易的完成root工作。

系统正常开机后,可以在文件系统的根目录下看到default.prop文件,以及在system目录下看到build.prop文件。在这两个文件中,涉及了大量的系统属性的设置。其中与安全管理相关的项目,主要存放在default.prop下。现以Nexus 7 Android 5.1.1的default.prop内容实例说明。

#
# ADDITIONAL_DEFAULT_PROPERTIES
#
ro.secure=1(说明使用安全的操作,修改为0)
ro.allow.mock.location=0
ro.debuggable=0(不允许调试的操作,修改为1)
persist.sys.usb.config=mtp(,adb --- 开机后默认的USB连接方式为MTP模式,增加usb连接方式)
ro.adb.secure=1(即使使用adb调试,也有安全限制,修改为0)
ro.zygote=zygote32
dalvik.vm.dex2oat-Xms=64m
dalvik.vm.dex2oat-Xmx=512m
dalvik.vm.image-dex2oat-Xms=64m
dalvik.vm.image-dex2oat-Xmx=64m
ro.dalvik.vm.native.bridge=0

default文件存放在boot.img中,需要使用一个bootimg的工具进行拆包和重新打包工作。这个工具可以通过安装完美刷机软件得到(在完美刷机软件的安装目录中,可以把这个完美刷机工具包整体复制到其它目录下,以方便使用)。


在其tools目录下,还有更多的工具可用。包括常用的adb连接工具,压缩工具,设备安装程序等。其中fastboot.exe 就是一种常用的刷机工具,用于在支持fastboot的设备上,把系统映像文件(boot.img,system.img等)写入到设备中。



将Nexus 7 Android 5.1.1安装包全部展开,可以得到以下的文件:


其中几个flash-all的文件,分别对应Windows和Linux下的刷机脚本。 而几个映像文件(.img)就是要写入Nexus 7的系统文件,烧写的顺序和方法在flash-all脚本中描述如下:

@ECHO OFF
:: Copyright 2012 The Android Open Source Project
::
:: Licensed under the Apache License, Version 2.0 (the "License");
:: you may not use this file except in compliance with the License.
:: You may obtain a copy of the License at
::
::      http://www.apache.org/licenses/LICENSE-2.0
::
:: Unless required by applicable law or agreed to in writing, software
:: distributed under the License is distributed on an "AS IS" BASIS,
:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
:: See the License for the specific language governing permissions and
:: limitations under the License.

rem 下面是添加 fastboot 以及ping 命令的路径。
PATH=%PATH%;"%SYSTEMROOT%\System32"
rem 设备解锁,才可以进行后续烧写操作。
fastboot oem unlock
rem 后续擦除原有系统 === 也可以不擦除,如果不怕出错的话。 分别是引导区,高速缓冲,恢复,系统,用户数据区等。

fastboot erase boot
fastboot erase cache
fastboot erase recovery
fastboot erase system
fastboot erase userdata
rem 烧写设备冷启动引导程序并重启系统
fastboot flash bootloader bootloader-grouper-4.23.img

fastboot reboot-bootloader
rem 检查本地连接是否正常 - 这是在设备重启之后的动作。

ping -n 10 127.0.0.1 >nul
rem 把固件写入到设备中。这里使用的是update命令,把系统压缩包直接更新。

fastboot -w update image-nakasi-lmy47v.zip
rem 完成后重启设备,完成刷机工作。
echo Press any key to exit...
pause >nul
exit

如果不需要擦除全部数据,而只是更新个别分区,则使用单独的命令行进行。如仅更新system分区,命令如下:
D:\APKide\tools>fastboot flash system system.img
这样就可以完成单个分区的写入。这样写入的速度虽然快速,但是存在系统不稳定的风险,因此一般情况下把所有分区按顺序写入到设备中,然后在执行重启动作,完成刷机过程。

下面是使用bootimg工具对boot.img进行修改的过程。这个过程参考别人的操作经验(http://www.cnblogs.com/weisenz/archive/2012/03/30/2425452.html)进行的。但是可能是工具版本的不同,有部分地方需要做修订才能进行下去。

1. boot.img解包过程。命令为: bootimg --unpack-bootimg。该命令默认寻找当前目录下boot.img文件进行分解。操作后会出现以下关于boot.img的结构信息,如base,ramdisk_addr,second_addr,tags_addr,page_size,...,这些信息必须记录,在修改完成后再次打包时,需要继续使用。如果需要了解这些信息的具体意义,可以在网上搜索关于Android boot.img文件结构的详细介绍资料,这里不再详细叙述。

(这里有一点需要说明,这里给出的page_size和padding_size的值都是错的,实际值应该是4096,而不是2048。按照2048制作的boot.img在写入后会导致可用Flash空间少了整整一半,13.2GB可用空间变成了6.2GB了。这个问题查了两天才搞清楚。至于这个数据为啥出错,原因还没搞清楚。)

操作完成后,会在当前目录下生成一个initrd的目录,以及cpiolist.txt,以及kernel,ramdisk.gz等文件。这些文件是否存在取决于在原始文件打包时是否包括了这些不同的部分。当前目录的内容列表如下:

其中,c[iolist.txt是ramdisk映像与拆解后的单独文件和目录的结构描述文档,内容如下:

compress_level:6slink charger /sbin/healthd 0644
dir data 0771
file default.prop initrd/default.prop 0644
dir dev 0755
file file_contexts initrd/file_contexts 0644
file fstab.grouper initrd/fstab.grouper 0640
file init initrd/init 0750
file init.environ.rc initrd/init.environ.rc 0750
file init.grouper.rc initrd/init.grouper.rc 0750
file init.grouper.usb.rc initrd/init.grouper.usb.rc 0750
file init.rc initrd/init.rc 0750
file init.trace.rc initrd/init.trace.rc 0750
file init.usb.rc initrd/init.usb.rc 0750
file init.zygote32.rc initrd/init.zygote32.rc 0750
dir proc 0755
file property_contexts initrd/property_contexts 0644
dir sbin 0750
file sbin/adbd initrd/sbin\adbd 0750
file sbin/healthd initrd/sbin\healthd 0750
slink sbin/ueventd ../init 0750
slink sbin/watchdogd ../init 0750
file seapp_contexts initrd/seapp_contexts 0644
file selinux_version initrd/selinux_version 0644
file sepolicy initrd/sepolicy 0644
file service_contexts initrd/service_contexts 0644
dir sys 0755
dir system 0755
file ueventd.grouper.rc initrd/ueventd.grouper.rc 0644
file ueventd.rc initrd/ueventd.rc 0644
这里面把主要压缩级别,链接关系,目录结构,文件权限等都做了详细说明。这是boot.img的磁盘结构。

把ramdisk.gz 展开到initrd的目录内容如下,其中准备修改的default.prop就在其中。


按照前面的说明,对default.prop的内容进行修改并保存,就可以开始重新打包的工作了。

2. 重新打包。 先删除现有的ramdisk.gz,然后使用命令
    bootimg --repack-bootimg 0x10000000 "" 2048 (正确值应该是4096) 2048(正确值应该是4096) cpiolist.txt
    上述命令中,bootimg --repack-bootimg 是重新打包boot.img的命令。0x10000000是在拆包是输出的基地址(base),后续的“”是一个空白的执行命令行,拆包时如果CMD位置有内容,需要照样搬来放在这个地方。第一个2048 是page_size,第二个2048是pendding_size。最后是cpiolist文件的名称。


该命令执行后得到一个boot-new.img的文件。而原有的boot.img 被修改为boot-old.img保存起来。


以上过程完成后,就可以把新生成的文件boot-new.img作为修改后的引导区写入到设备中,修改工作完成。


为了验证是否有效,需要重新烧写system分区(使用修改过的跳过开机网络需求的system.img)以及userdata分区。烧写完成后开机,可以看到ADB 功能已经打开,可以直接与PC相连。进入adb shell后,可以通过getprop 命令检查各种信息。可以看到前面对boot.img中的default.prop的修改成功。


系统的存储使用情况如下:


这个与原始固件的存储空间大小一致。

至此,这个boot.img修改工作基本完成。






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1