
给TWRP增加Data解密功能-MTK)2025 Updated

是的,你没有看错,给TWRP添加解密功能.
Data加密分为FDE(全盘加密) 和 FBE(文件级加密)
全盘加密是在 Android 4.4 版中引入的。
Android 7.0 及更高版本支持文件级加密 (FBE),所有发布时搭载 Android 10 及更高版本的设备都必须使用文件级加密。
Android 9 引入了对元数据加密的支持。对于搭载 Android 11 或更高版本的设备,必须在内部存储设备上启用元数据加密。
元数据加密也就是设备有可挂载的metadata分区,在挂载参数中有keydirectory=/metadata/vold/metadata_encryption字样,如果没有就算有可挂载的metadata分区也没有启用元数据加密
当你看到forceencrypt=/dev/block/platform/bootdevice/by-name/metadata为FDE强制加密
当你看到forcefdeorfbe=/dev/block/platform/bootdevice/by-name/metadata默认为FDE强制加密,可以在开发者选项里转换为文件级加密(FBE),大概是不能转为FBE加密。(OPPO机型)
当你看到fileencryption=aes-256-xts为FBE加密。
先说一下解密流程:
- TWRP加载
- 加载Servicemanager Hwservicemanager Vndservicemanager
- TrustonicTEE(mcDriverDaemon)
- 加载Keystore
- 加载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)
momo54181/twrp_device_realme_RMX2173: Realme Q2 Pro TWRP Device Tree
加密类型
查看加密类型:
如需检查设备是否使用了文件级加密,请运行以下 shell 命令:
1 | adb shell getprop ro.crypto.type |
如果输出为 file,则表示设备启用了文件级加密。FBE
如果输出为 block,则表示设备启用了全盘加密。FDE
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+inlinecrypt_optimized密钥位置keydirectory=/metadata/vold/metadata_encryption
fileencryption为FBE加密,有keydirectory为启用元加密,也就是使用metadata分区
设备树配置-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 #元加密分区参与解密支持
TW_USE_FSCRYPT_POLICY := 1 #启用特定策略版本的文件系统加密技术 Fscrypt【TWRP3.7.2更新Fscrypt将自动识别,无需设置】
BOARD_VNDK_VERSION := current #VNDK版本,保持current不变就OK,不必更改。
OPPO/Realme/Oplus设备解密可能需要用到
TW_PREPARE_DATA_MEDIA_EARLY := true #启用 /data/media 的早期准备【OPPO/Realme/Oplus设备解密可能需要用到】
Test
TWRP_INCLUDE_LOGCAT := true #开启Logcat,方便看log
TARGET_USES_LOGD := true #开启logd,方便看log
版本
这里主要说keymaster版本,在高安卓设备不再使用keymaster而是keymint
这条没啥用,TWRP自动识别
如何确定我使用的是那个版本
推荐在手机上安装密钥认证APP,非常直接。
该图为真我 Q2 Pro的版本(Android-12)

由图可见Keymaster版本为4.1
方法二:解包原厂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:官方的REC基本都是一套东西,ta总会给其他型号的手机用。
on property:recovery.service=1
start vendor.keymaster-3-0-trustonic
start gatekeeper-1-0
start guardianangle
这里他只出现了keymaster3.0没有出现4.0,所以4.0实际不加载。
如何修改
对照设备树进行添加
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
过时了,给你们上新的。示例机型 OPPO R15
首先解包原厂Rec,找到根目录。

复制以下文件和文件夹
根目录的任何结尾为rc的文件(ueventd.rc字样的可以不用复制),system,vendor文件夹到新的文件夹

推荐使用VS Code打开文件夹

看文件内容,没啥用,但删与不删没啥影响
在其他.rc里面找keymaster mobicore这些字样


像我这个在init.rc文件里,生成TWRP设备树的时候不会复制过去,所以需要手动复制
打开init.recovery.mt****.rc把那俩复制过去

但这样还不行,ta没有设置权限,改成像下面这样

复制文件夹的部分
vendor\app
vendor\etc\vintf
文件部分
搜索mcDriverDaemon 后缀.trustonic的文件对于路径复制过去
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 keymaster-3-0
on property:ro.crypto.state=unsupported
stop mobicore
stop keymaster-3-0
on property:ro.crypto.state=unencrypted
stop mobicore
stop keymaster-3-0
on property:twrp.decrypt.done=true && property:twrp.all.users.decrypted=true
stop mobicore
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
- 感谢您的赞赏




























