Magisk 刷入
绝不要重新签名 vbmeta!
绝不要重新签名 vbmeta!
绝不要重新签名 vbmeta!
除非满足以下情况之一:
- 你的设备使用展锐密钥(尤其是公开 bsp 密钥)
- 你想在你的设备上使用 CVE-2022-38691_38692
Android 9
现有 3 种方法:
- system 模式(最高版本为 Delta 26301,Kitsune 不支持 Android 9)
- 重分区(修补 recovery,将 system 重命名为 vroot,然后把修补后的 ramdisk 放到伪 system 分区)
- 大签名(big resign,尤其适用于 fused ums312/ums512/ud710)—— 参见 action_big_resign_with_magisk
Android 10
现有 3 种方法:
- system 模式(最高版本为 Kitsune)
- 正常修补并签名
- 大签名(big resign,尤其适用于 fused ums312/ums512/ud710)
Android 11
现有 2 种方法:
- 正常修补并签名
- 大签名(big resign,尤其适用于 fused ums312/ums512/ud710)
Android 12 及以上
boot 不再需要签名,直接用 Magisk 或 Apatch 修补后写回即可。
Magisk system 模式(Android 9-10)
目前这需要另一台已用 Magisk(官方/Delta 等均可)获取 root 的设备。
第 1 部分
找出你的系统使用哪个文件:
- /vendor/etc/selinux/precompiled_sepolicy
- /system_root/odm/etc/selinux/precompiled_sepolicy
- /system/etc/selinux/precompiled_sepolicy
- /system_root/sepolicy
- /system_root/sepolicy_debug
- /system_root/sepolicy.unlocked
修补你的 sepolicy:
magiskinit --patch-sepol sepol.in sepol.out
将原始 sepolicy 压缩为 sepolicy.gz:
- /vendor/etc/selinux/precompiled_sepolicy.gz
- /system_root/odm/etc/selinux/precompiled_sepolicy.gz
- /system/etc/selinux/precompiled_sepolicy.gz
- /system_root/sepolicy.gz
- /system_root/sepolicy_debug.gz
- /system_root/sepolicy.unlocked.gz
第 2 部分(使用解包工具或在 Linux 上挂载镜像)
将 sepol.out 和 sepolicy.gz 覆盖回设备分区。
将已 root 设备上的 /system/etc/init/bootanim.rc 和 /system/etc/init/magisk 复制到未 root 设备的分区。
将原始 bootanim.rc 压缩为 bootanim.rc.gz。
记得为它们添加/修改属性(所有者、权限、selinux 上下文),用 spd_dump 或 fastboot(d) 写回分区。
所有者与权限:
system/system/etc/init/magisk/magisk32 0 0 0700
system/system/etc/init/magisk/magisk64 0 0 0700
system/system/etc/init/magisk/magiskpolicy 0 0 0700
system/system/etc/init/magisk/magiskinit 0 0 0700
system/system/etc/init/magisk/stub.apk 0 0 0700
system/system/etc/init/magisk/config 0 0 0700
system/system/etc/init/magisk 0 0 0700
selinux 上下文:
/system/system/etc/init/magisk u:object_r:system_file:s0
/system/system/etc/init/magisk/config u:object_r:system_file:s0
/system/system/etc/init/magisk/magisk32 u:object_r:system_file:s0
/system/system/etc/init/magisk/magisk64 u:object_r:system_file:s0
/system/system/etc/init/magisk/magiskinit u:object_r:system_file:s0
/system/system/etc/init/magisk/magiskpolicy u:object_r:system_file:s0
/system/system/etc/init/magisk/stub\.apk u:object_r:system_file:s0
config 的内容:
SYSTEMMODE=true
RECOVERYMODE=false
追加到原始 bootanim.rc 的内容:
on post-fs-data
start logd
exec u:r:su:s0 root root -- /system/etc/init/magisk/magiskpolicy --live --magisk
exec u:r:magisk:s0 root root -- /system/etc/init/magisk/magiskpolicy --live --magisk
exec u:r:update_engine:s0 root root -- /system/etc/init/magisk/magiskpolicy --live --magisk
exec u:r:su:s0 root root -- /system/etc/init/magisk/magisk64 --auto-selinux --setup-sbin /system/etc/init/magisk /sbin
exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --post-fs-data
on nonencrypted
exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --service
on property:vold.decrypt=trigger_restart_framework
exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --service
on property:sys.boot_completed=1
mkdir /data/adb/magisk 755
exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --boot-complete
on property:init.svc.zygote=restarting
exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --zygote-restart
on property:init.svc.zygote=stopped
exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --zygote-restart
重分区(Android 9)
如果这个方法不行,请改用 system 模式或大签名方法。
这里有一份用于修补 recovery.img 的 GitHub Action。
从零开始
你不能修改 boot,root 可以通过重分区完成。
在 spd_dump 中(发送 uboot 并执行 exec 命令后),输入 partition_list partition.xml。
编辑 partition.xml:创建一个 32MB 的分区,缩小一个不重要的分区或缩小 userdata,将这个 32MB 分区命名为 system,将原始 system 重命名为 vroot。
创建 32MB 镜像,格式化为 ext4,在 Magisk 中选择 recovery.img 进行修补,从 patched_recovery.img 中得到 ramdisk.cpio:
mkdir ramdisk
sudo mount -t ext4 -o rw ramdisk.img ramdisk
cd ramdisk
sudo cpio -idv < ../ramdisk.cpio
cd ..
umount ramdisk
使用 spd_dump 写入修改后的分区表和 ramdisk.img:
repartition new-table.xml
write_part system ramdisk.img
更新 Magisk
在 Magisk 中选择 recovery.img 进行修补,制作新的 ramdisk.img,在 spd_dump 中执行 write_part system ramdisk.img,或 dd if=new.img of=/dev/block/by-name/system。
Magisk 正常修补并签名(Android 10-11)
用 avbtool 对修补后的 boot 签名,否则会卡在开机 logo。
不能直接安装,必须选择文件修补,然后用 avbtool 签名,签名后的 boot 才不会卡开机。
avbtool(Windows)
不要更改安装位置。
- python2:x86 | x64
- avbtool
- OpenSSL(x64) 可在上面的 avbtool 仓库中找到,如需 x86 请自行寻找
- Android Image Kitchen
第 0 步
获取原始 boot.img,用 Magisk 修补。
sc9863a:
spd_dump exec_addr $exec_addr_fallback fdl fdl1-dl.bin 0x5000 fdl fdl2-dl.bin 0x9efffe00 exec r boot reset
ums312/ums512/ud710:
spd_dump exec_addr $exec_addr_fallback fdl fdl1-dl.bin 0x5500 fdl fdl2-dl.bin 0x9efffe00 exec r boot reset
或:
spd_dump exec_addr $exec_addr_fallback fdl fdl1-dl.bin 0x5500 fdl uboot-mod.bin 0x9efffe00 exec r boot reset
ums9230:
spd_dump exec_addr $exec_addr_fallback fdl fdl1-dl.bin 0x65000800 fdl fdl2-dl.bin 0x9efffe00 exec r boot reset
ums9620:
spd_dump exec_addr $exec_addr_fallback fdl fdl1-dl.bin 0x65000800 fdl fdl2-dl.bin 0xb4fffe00 exec r boot reset
exec_addr 因设备而异。
ums312/ums512/ud710 的镜像在用 38691 处理过后不需要 exec_addr 参数。
此处注意更改 exec 地址(用你自己的 cpu 的 fallback 模式地址,现在两种模式使用同一个跳过文件了;sc9832e 的两种模式没有合并,需要区分地址)。ums312/ums512/ud710 的镜像在用 38691 处理过后不需要 exec_addr 参数。
第 1 步
在 cmd 中运行:
mklink /H C:\Python27\python2.exe C:\Python27\python.exe
把 C:\Python27、C:\Python27\Scripts 和 C:\Program Files\OpenSSL-Win64\bin 加到 Windows 的 PATH 环境变量。
运行:
python2 -m pip install pycryptodome
第 2 步
用 AIK 解包并重新打包 magisk_patched-*.img,得到 image-new.img。
第 3 步
下载 rsa4096_boot.pem,保存在 avbtool 文件夹里。
Android 10:
python2 avbtool add_hash_footer --image AIK/image-new.img --partition_name boot --partition_size 36700160 --key rsa4096_boot.pem --algorithm SHA256_RSA4096 --salt 5F55215FD2302D021F850B55912ED48D176784678692DC012E054B1ECD0BE025
Android 11:
python2 avbtool add_hash_footer --image AIK/image-new.img --partition_name boot --partition_size 67108864 --key rsa4096_boot.pem --algorithm SHA256_RSA4096 --prop com.android.build.boot.fingerprint:$FINGERPRINT --prop com.android.build.boot.os_version:$OS_VERSION --salt 7A91E47F8D2CFB95DCCFF13305EE3F07EDCF83A42660A811F3724E1E8B463284
部分设备可能需要用 --rollback_index $num 添加 “rollback_index”。
第 4 步
adb reboot fastboot
fastboot flash boot AIK/image-new.img
fastboot reboot
或:
spd_dump exec_addr $exec_addr_fallback fdl FDL1 $FDL1_ADDR fdl FDL2 $FDL2_ADDR exec w boot boot_signed.img reset