如何为采用动态分区的高通设备禁用 data 分区强制加密

如何为采用动态分区的高通设备禁用 data 分区强制加密

Android系统的data分区强制加密实属一大败笔,强制加密且不经用户确认实属败笔中的败笔,强制加密过程中设备没有任何提示实属败笔中的败笔中的败笔。

作为一名刷机佬,我实在无法忍受每次换rom都要格式化data分区的痛苦。比这更痛苦的是,设备正在强制加密时你并不知情,你以为设备卡死了于是强制重启,结果,哦吼,完蛋!

从Android 11开始,Google各种阴间操作不断,这眼看Android 13都快出来了,TWRP才刚刚搞定Android 12的data分区解密。

data分区在recovery模式下无法解密,意味着如果你瞎搞你的data分区导致设备无法开机,那么你只能格式化data分区并损失你的所有数据。

如果你跟我一样恨极了data分区强制加密,不妨也跟我一样把data分区加密给禁用掉。

刷完rom后,不要开机,留在recovery模式。依次是product分区、vendor分区、system分区,如果你找到了那该死的etc/fstab.qcom文件,那么,挂载读写,编辑它,找到/data分区对应的那一行:

...

# Add fs_mgr flag - sysfs_path=/sys/devices/platform/soc/xxxx.[ufshc|sdhci] to userdata entry, based on UFS|eMMC device.
/dev/block/bootdevice/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier,inlinecrypt latemount,wait,check,formattable,fileencryption=ice,keydirectory=/metadata/vold/metadata_encryption,wrappedkey,quota,reservedsize=128M,sysfs_path=/sys/devices/platform/soc/1d84000.ufshc,checkpoint=fs
...

找到fileencryption字样:

...,fileencryption=ice,...

fileencryption改成encryptable就可以了:

...,encryptable=ice,...

淦!这我早就知道了,快来点干货!

但是,对于动态分区设备,可能会因为对应分区没有剩余空间而导致编辑失败。

例:使用vi或nano,编辑完fstab.qcom之后保存,会收到提示No space left,回头再看,fstab.qcom已经变成了一个0字节的空文件,此时只能重刷rom来恢复原状。什么?你想用sed?你可以亲自试试看。

注:TWRP早已支持挂载动态分区,同时也支持挂载为读写。

对于这种情况,有两种方法:

第一种方法是删除该分区的其他一些不必要的文件,腾出来足够的空间。

但是,如果fstab.qcom文件位于vendor分区的话,vendor分区的文件一般情况下是不能乱删的。有没有其他办法可以在没有剩余空间的分区编辑fstab.qcom文件呢?

这就是我要讲的第二种方法:使用十六进制编辑fstab.qcom文件。

你需要先整一个magiskboot可执行文件,你可以从Magisk的apk文件中找到它。在新版本的Magisk apk中,它位于lib/<设备架构>/libmagiskboot.so,把它拷出来,重命名为magiskboot,然后授予可执行权限就可以了。

我知道我知道,magiskboot是解包打包boot镜像用的,我要这玩意干嘛?

magiskboot有一个极其好用的hexpatch命令,它可以很方便地对文件进行十六进制patch操作。

让我们先用十六进制的方式读取fstab.qcom文件:

/images/e35_p1.jpg

在ANSI或UTF-8编码下,字符串fileencryption对应的十六进制是66696C65656E6372797074696F6E

那么,encryptable对应的十六进制是656E637279707461626C65

两个字符串长度不同,对应的十六进制长度也不同。但magiskboothexpatch要求替换前和替换后的长度是相同的,那该怎么办?

很简单,补逗号。(可千万不要想着补空格)

/images/e35_p2.jpg

那么,写出一行命令:

# ',fileencryption=' -> ',,,,encryptable='
magiskboot hexpatch /vendor/etc/fstab.qcom '2C66696C65656E6372797074696F6E3D' '2C2C2C2C656E637279707461626C653D'

如果你乐意的话,你也可以直接对分区镜像甚至块设备进行hexpatch。滑稽

最后,别忘了禁用Android AVB校验。

这样,即使因为设备采用动态分区而导致分区空间不足,你也可以修改fstab.qcom文件来绕过该死的data分区强制加密了。

什么?你的rom的系统分区都是erofs?那放弃希望吧同志。

最后再补充一句,别想着用Magisk模块替换fstab.qcom文件的方式来绕过data分区强制加密。强制加密的优先级要高于Magisk模块挂载。别问我怎么知道的,血的教训。

最后再再补充一句,卡刷更新rom后一定一定一定要再修改一次fstab.qcom文件,谨防data分区再次被加密。如果你不幸忘记了修改fstab.qcom直接重启了,切记不要因为长时间没有进系统而强制重启!此时设备正在加密你的data分区,加密完成后你仍然可以在开机后读(qiang)取(jiu)你的数据,但是一旦加密过程被迫中断,那么你就可以跟你的数据说白白了。