是的,你没有看错,给TWRP添加解密功能.

Data加密分为FDE(全盘加密)FBE(文件级加密)

FDE出现在出厂Android9之前的设备,FBE出现在Android9之后。

当你看到forceencrypt=/dev/block/platform/bootdevice/by-name/metadata为FDE强制加密

当你看到forcefdeorfbe=/dev/block/platform/bootdevice/by-name/metadata默认为FDE强制加密,可以在开发者选项里转换为文件级加密(FBE),大概是不能转为FBE加密。

当你看到fileencryption=aes-256-xts为FBE加密。

不知道为啥Y97和R15还在用FDE加密,出厂都是安卓8的设备了。

先说一下解密思路:twrp启动——加载servicemanager hwservicemanager vndservicemanager——加载TrustonicTEE(Start mcDriverDaemon)——加载keymaster——TEE解密——完成解密

解密思路为个人总结

下面演示机型Vivo Y97(Vivo V11i)以及OPPO R15

参考设备树:momo54181/android_device_vivo_k71v1_64_bsp (github.com)

momo54181/android_device_oppo_PACM00: Device Tree For OPPO R15 (github.com)

加密类型

FDE

这种加密方式比较老旧常在2018年之前的机子上出现,比如 金立M6 魅族Note5 Vivo Y97 OPPO R15

flag通常为

/dev/block/platform/bootdevice/by-name/userdata /data ext4 noatime,nosuid,nodev,noauto_da_alloc,discard,errors=panic wait,check,formattable,quota,resize,reservedsize=128m,forceencrypt=/dev/block/platform/bootdevice/by-name/metadata,

对于OPPO设备

/dev/block/platform/bootdevice/by-name/userdata /data ext4 noatime,nosuid,nodev,noauto_da_alloc,errors=panic,async_discard wait,check,formattable,quota,resize,reservedsize=128m,forcefdeorfbe=/dev/block/platform/bootdevice/by-name/metadata

FBE

通常在较新的机器上使用

/dev/block/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,noflush_merge,fsync_mode=nobarrier,reserve_root=134217,resgid=1065,inlinecrypt wait,check,formattable,quota,reservedsize=128m,latemount,resize,checkpoint=fs,fileencryption=aes-256-xts:aes-256-cts:v2+inlinecrypt_optimized,keydirectory=/metadata/vold/metadata_encryption,fsverity

你可以看到加密类型fileencryption=aes-256-xts:aes-256-cts:v2密钥位置keydirectory=/metadata/vold/metadata_encryption

fileencryption为FBE加密

设备树配置-BoardConfig.mk

Crypto

TW_INCLUDE_CRYPTO := true # 添加加密支持

对于FBE加密以及Matadata存储密钥的需要额外添加下面两条

TW_INCLUDE_CRYPTO_FBE := true # 添加 FBE加密支持

BOARD_USES_METADATA_PARTITION := true #元加密分区

TW_INCLUDE_FBE_METADATA_DECRYPT := true #Metadata解密分区

Test

TWRP_INCLUDE_LOGCAT := true #开启Logcat,方便看log
TARGET_USES_LOGD := true #开启logd,方便看log

版本

这里主要说keymaster版本,在高安卓设备不再使用keymaster而是keymint

这条没啥用,忽略。

如何确定我使用的是那个版本

方法一:解包原厂rec镜像,打开init.recovery.mt6771.rc init.recovery.platform.rc init.recovery.svc.rc之类的文件

以vivo y97为例init.recovery.platform.rc 存放解密信息

init.recovery.platform.rc(部分):

on init
mkdir /mnt/vendor/persist 0771 system system

symlink /mnt/vendor/persist /vendor/persist
symlink /vendor/lib64/hw/libMcGatekeeper.so /vendor/lib64/hw/gatekeeper.${ro.product.board}.so
symlink /vendor/lib64/hw/libMcTeeKeymaster.so /vendor/lib64/hw/keystore.${ro.hardware}.so
on property:recovery.service=1
start vendor.keymaster-3-0-trustonic
start gatekeeper-1-0
start guardianangle

service keymaster-3-0 /vendor/bin/android.hardware.keymaster@3.0-service
disabled
user root
group root drmrpc
seclabel u:r:recovery:s0

service keymaster-4-0 /vendor/bin/android.hardware.keymaster@4.0-service
disabled
user root
group root drmrpc
seclabel u:r:recovery:s0

service vendor.keymaster-4-0-trustonic /vendor/bin/hw/android.hardware.keymaster@4.0-service.trustonic
disabled
user root
group root drmrpc
seclabel u:r:recovery:s0

service vendor.keymaster-3-0-trustonic /vendor/bin/hw/android.hardware.keymaster@3.0-service.trustonic
disabled
user root
group root drmrpc
seclabel u:r:recovery:s0

service gatekeeper-1-0 /vendor/bin/android.hardware.gatekeeper@1.0-service
disabled
user root
group root
seclabel u:r:recovery:s0

粗体的为你对应的版本

Q:为啥keymaster版本有两个

A:有不一定代表他都用,

on property:recovery.service=1
start vendor.keymaster-3-0-trustonic
start gatekeeper-1-0
start guardianangle

这里他只出现了keymaster3.0没有出现4.0,所以4.0可以不用。

方法二:手机下载密钥认证打开会显示你的keymaster版本(对TEE损坏设备不可用)

如何修改

对照设备树进行添加

Add FBE · momo54181/android_device_oppo_PACM00@69d6e0d (github.com)

Fix Crypto · momo54181/android_device_oppo_PACM00@d315327 (github.com)

Add for OPPO FBE By Momo5418 · momo54181/android_device_oppo_PACM00@90484cd (github.com)

Update · momo54181/android_device_vivo_k6853v1_64_6360@8601837

init.recovery.mt****.rc

#Add By Momo5418 FBE Fixed

on property:crypto.ready=1
start keymaster-3-0

on property:crypto.ready=0
stop mobicore
stop servicemanager
stop hwservicemanager
stop keymaster-3-0

on property:ro.crypto.state=unsupported
stop mobicore
stop servicemanager
stop hwservicemanager
stop keymaster-3-0

on property:ro.crypto.state=unencrypted
stop mobicore
stop servicemanager
stop hwservicemanager
stop keymaster-3-0

on property:twrp.decrypt.done=true && property:twrp.all.users.decrypted=true
stop mobicore
stop servicemanager
stop hwservicemanager
stop keymaster-3-0

对于FDE加密

对于vivo设备

需使用下面的挂载flag

/data ext4 /dummydevice flags=altdevice=/dev/block/platform/bootdevice/by-name/userdata;encryptable=/dev/block/platform/bootdevice/by-name/metadata

可能遇到的问题

Keymaster不加载

解决办法:

1./system/etc/vintf/manifest.xml和/vendor/etc/vintf/manifest.xml短缺,从原厂rec复制

2.可能是init.recovery.cpu代号.rc 未配置keymaster服务 例如:

TEE加载错误

正常报错,不影响解密。(Vivo Y97测试通过)

如何修复:

例如图中的10为目标安卓版本,2021-04-05是vendor补丁日期

修好后

Cannot open key SO (No such file or directory)

Load decryption key

Cannot open key SO (No such file or directory)

key decryption missing, ignore

这些日志信息表明在尝试加载解密密钥的过程中遇到了问题。具体来说:

1.Load decryption key: 这表明系统正在尝试加载一个解密密钥。

*2.Cannot open key SO (No such file or directory): 这是一个错误信息,表明系统无法找到指定的密钥文件。*key SO 可能指的是一个特定的密钥文件,而 No such file or directory 表示该文件不存在于预期的路径中。

3.key decryption missing, ignore: 这是一个警告信息,表明由于缺少解密密钥,系统将忽略解密操作。这可能是因为密钥文件丢失、损坏或路径错误。

原因不明,不会导致无法解密Data