Magisk 刷入

绝不要重新签名 vbmeta!

绝不要重新签名 vbmeta!

绝不要重新签名 vbmeta!

除非满足以下情况之一:

  1. 你的设备使用展锐密钥(尤其是公开 bsp 密钥)
  2. 你想在你的设备上使用 CVE-2022-38691_38692
Android 9

现有 3 种方法:

  1. system 模式(最高版本为 Delta 26301,Kitsune 不支持 Android 9)
  2. 重分区(修补 recovery,将 system 重命名为 vroot,然后把修补后的 ramdisk 放到伪 system 分区)
  3. 大签名(big resign,尤其适用于 fused ums312/ums512/ud710)—— 参见 action_big_resign_with_magisk
Android 10

现有 3 种方法:

  1. system 模式(最高版本为 Kitsune)
  2. 正常修补并签名
  3. 大签名(big resign,尤其适用于 fused ums312/ums512/ud710)
Android 11

现有 2 种方法:

  1. 正常修补并签名
  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)

不要更改安装位置。

  1. python2:x86 | x64
  2. avbtool
  3. OpenSSL(x64) 可在上面的 avbtool 仓库中找到,如需 x86 请自行寻找
  4. 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
友链