给TWRP增加Data解密功能(MTK)
是的,你没有看错,给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