背景自行编译生成vendor.img创建一个厂商进行开发基于pixel自定义生成vendor.img修改vbmeta.img进行校验绕过,该img主要作用就是进行校验编译Kerneladb disable-verity & adb remount
背景
需要在一个user版本的Android 11上,对vendor目录新增一些文件。
在userdebug版本下,Android是允许使用adb remount对system、vendor目录重新挂载的,但是user版本的不行。
然后为了vendor可写,踩了比较多坑。
自行编译生成vendor.img
利用Android 自带的build_image.py 进行编译
python build/tools/releasetools/build_image.py ./mytmp/ vendor_version.txt vendor.img ./result
my_tmp目录下存放了vendor.img中所需的文件,一些Google原生的文件,是从原版vendor.img下copy出来的。
vendor_version.txt
BOARD_FLASH_BLOCK_SIZE=131072 TARGET_OUT_VENDOR_SYSTEM_IMG_ARGS="--sparse" TARGET_USERIMAGES_SPARSE_EXT_DISABLED=true mount_point=vendor fs_type=ext4 ext_mkuserimg=/home/moon/april/pix5/out/host/linux-x86/bin/mkuserimg_mke2fs partition_size=838860800
一些文件需要复制到/usr/bin
sudo cp ./out/host/linux-x86/bin/e2fsdroid /usr/bin/e2fsdroid
将镜像格式转换为Android设备的模式
img2simg vendor.img vendor_new.img
将自己编译的vendor.img刷入手机后,系统无法正常启动,排查发现Google对各个分区及镜像存在校验,自己编译的img无法通过校验
创建一个厂商进行开发
在设置完相关的配置文件编译完成后,发现编写的配置为
generic_x86_64
的,也就是在模拟器运行的系统。这和****BoardConfig.mk
****的配置有关。随后更换为pixel 5也就是redfin的配置,但是还是缺少配置,比如system-ui,还是没有编译成功。随后意识到每一个厂商定义的产品都是基于自己的机型的,与手机设备的物理属性强相关,不同设备的驱动也都大不相同,基于pixel构建一个新的系统从理论上来讲是可行的,但是需要对Android配置以及pixel 5 设备都有很深刻的了解。
基于pixel自定义生成vendor.img
跟着文章操作,但是编译时发现缺少文件,由于机型和版本都不太对应,Android11新增了verity boot。没有继续尝试
修改vbmeta.img进行校验绕过,该img主要作用就是进行校验
获取设备校验状态
adb shell getprop ro.boot.veritymode adb shell getprop ro.vendor.veritymode
主要是ro.boot.veritymode和avb。****
但是修改完,手机设备还是陷入无限开机重启。随后细看文章发现这样一段话
在部分机型中,可能由于vbmeta.img的验证导致设备无法启动,验证启动(Verified Boot)是Android一个重要的安全功能,主要是为了访问启动镜像被篡改,提高系统的抗攻击能力, 简单描述做法就是在启动过程中增加一条校验链,即 ROM code 校验 BootLoader,确保 BootLoader 的合法性和完整性,BootLoader 则需要校验 boot image, 确保 Kernel 启动所需 image 的合法性和完整性,而 Kernel 则负责校验 System 分区和 vendor 分区。
也就是说 校验vendor分区的代码位于Kernel中。
编译Kernel
官方文档编译一把梭
文档上的分支写的是Android 13的,查阅资料讲,不影响,可直接使用。
编译刷入之后,发现设备无法启动。https://hqw700.github.io/2021/01/02/aosp-kernel-build/#3-1-【重要】-先push生成的ko文件到-vendor-lib-modules下
查阅发现是要先预置一些文件,但是这些文件是要push到vendor目录下的,但是vendor是只读,绕回去了又。
adb disable-verity
& adb remount
在android 原生的系统下,选择的编译选项是userdebug的话,是允许通过
adb disable-verity
来关闭Verity
然后再 adb remount
将vendor和system分区重新挂载为可读可写的。但是我在一开始就尝试过
adb disable-verity
显示是失败的。这次的执行还是显示失败aob root adbd is already running as root ~/oct/pix5 》 adb disable-verity verity cannot be disabled/enabled-user build
总结下来就是userdebug版本允许重新挂载,但是user不允许。然后在使用
adb remount
时,系统判断当前系统时认为当前系统为user,然后不允许remount
,提示verity cannot be disabled/enabled-user build
根据提示信息去源码中找,找到
/pix5/system/core/set-verity-state/set-verity-state.cpp
的这段代码// Should never be possible to disable dm-verity on a USER build // regardless of using AVB or VB1.0. if (!__android_log_is_debuggable()) { printf("verity cannot be disabled/enabled - USER build\\n"); return 0; }
也就是这里没有通过校验,然后return了。
直接注释该代码然后重新编译。
或者直接找到编译的
disable-verity
进行一个patch,得到一个返回True的程序下载地址:disable-verity
运行完重启设备,然后重新挂载即可。