市场上几乎大部分的安卓设备都是默认Lock上锁的,尤其是品牌手机类,针对没有开启secureboot的设备,lock设备的需求该如何实现,下文针对Qualcomm平台来提供一个方式实现.
整个secureboot的实现,此文暂不涉及,主要来呈现non-secureboot的机器如何默认上锁.
通过定位bootloader abl部分的代码,我们定位到Devinfo会存放lock和unlock的标志位. 对应的数据会保存在实际的devinfo这个分区,那我们可以尝试在此处设置DevInfo.is_unlocked = FALSE岂不是就万事大吉了,实际设置之后,这个流程存在的一个问题就是永远Lock,当在fastboot模式下执行了unlock之后,正常的擦除userdata流程,让设备重新走入devinfoinit,标志位依然是false. 这样一来,是没有办法unlock.
EFI_STATUS DeviceInfoInit (VOID)
{
EFI_STATUS Status = EFI_SUCCESS;
if (FirstReadDevInfo) {
Status =
ReadWriteDeviceInfo (READ_CONFIG, (VOID *)&DevInfo, sizeof (DevInfo));//读写devinfo的操作函数
if (Status != EFI_SUCCESS) {
DEBUG ((EFI_D_ERROR, "Unable to Read Device Info: %r\n", Status));
return Status;
}
FirstReadDevInfo = FALSE;
}
if (CompareMem (DevInfo.magic, DEVICE_MAGIC, DEVICE_MAGIC_SIZE)) {
DEBUG ((EFI_D_ERROR, "Device Magic does not match\n"));
...
...
if (IsSecureBootEnabled ()) {//当开启Secureboot之后,设备默认上锁,将unlock标志和critical_unlock标志置FALSE
DevInfo.is_unlocked = FALSE;
DevInfo.is_unlock_critical = FALSE;
} else {
DevInfo.is_unlocked = TRUE;
DevInfo.is_unlock_critical = TRUE;
}
...
...
Status =
ReadWriteDeviceInfo (WRITE_CONFIG, (VOID *)&DevInfo, sizeof (DevInfo));//然后将设置的标志写入devinfo分区
if (Status != EFI_SUCCESS) {
DEBUG ((EFI_D_ERROR, "Unable to Write Device Info: %r\n", Status));
return Status;
}
}
return Status;
}
而DevinfoInit会在Linux引导启动的入口函数被调用
EFI_STATUS EFIAPI __attribute__ ( (no_sanitize ("safe-stack")))
LinuxLoaderEntry (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
{
EFI_STATUS Status;
...
// Initialize verified boot & Read Device Info
Status = DeviceInfoInit ();//读取devinfo分区的标志位
if (Status != EFI_SUCCESS) {
DEBUG ((EFI_D_ERROR, "Initialize the device info failed: %r\n", Status));
goto stack_guard_update_default;
}
...
}
以上是代码的流程,接下来说说non-secureboot怎么实现
我们先将andriod设备在fastboot模式下,手动执行
fastboot flashing lock
整个流程完成后,标志位就已写入devinfo该分区.
最后启用QFIL的Partition Manager读取分区, 思路很简单, devinfo这个分区,是非文件系统的分区,单纯存放数据,
下一步选择"Manager Partition Data".
读取devinfo, “Read Data”.
最后生成的红框的bin,即是最终的上锁的devinfo.bin,直接改名即可.以后直接可以通过QFIL把最终的flat build版本中加入该devinfo.bin下载,就可以实现设备默认lock.