• miuiv13-redmi-note11TPro-root


    miuiv13-redmi-note11TPro-root

    好多年不关注这些了,搜索发现多了ab分区、卡刷/OTA包payload.bin等变化。现在再看源码、搜资料自己解包payload.bin等是来不及了。所以还是先看看网上的一些教程吧。

    payload.bin解包

    • 更新MIUIV13.0.13的OTA包时保存了一份,结构如下:
      在这里插入图片描述

    payload_dumper

    • 根据:https://zhuanlan.zhihu.com/p/424625779、https://blog.csdn.net/weixin_43890033/article/details/119457211,使用https://github.com/vm03/payload_dumper,git clone下来。
    • 把payload.bin放在payload_dumper目录,使用Win10子系统Ubuntu18.04LTS执行:
    python3 payload_dumper.py payload.bin
    Traceback (most recent call last):
      File "payload_dumper.py", line 7, in 
        import bsdiff4
    ModuleNotFoundError: No module named 'bsdiff4'
    

    缺少库,根据requirements.txt安装

    pip3 install bsdiff4>=1.1.5
    

    安装protobuf报错。

    python3 payload_dumper.py payload.bin
    Traceback (most recent call last):
      File "payload_dumper.py", line 15, in 
        import update_metadata_pb2 as um
      File "/mnt/d/payload_dumper/update_metadata_pb2.py", line 6, in 
        from google.protobuf import descriptor as _descriptor
    ModuleNotFoundError: No module named 'google'
    
    pip3 install protobuf>=3.19.3
    protobuf requires Python '>=3.7' but the running Python is 3.6.9
    

    直接读取requirements.txt安装也是报错:protobuf requires Python ‘>=3.7’ but the running Python is 3.6.9。不想升级python。

    pip3 install -r requirements.txt
    Collecting protobuf>=3.19.3 (from -r requirements.txt (line 1))
      Using cached https://files.pythonhosted.org/packages/6c/be/4e32d02bf08b8f76bf6e59f2a531690c1e4264530404501f3489ca975d9a/protobuf-4.21.0-py2.py3-none-any.whl
    protobuf requires Python '>=3.7' but the running Python is 3.6.9
    

    因为不了解python,仔细看是大于等于的关系,安装的是protobuf-4.21.0版本,尝试安装protobuf-3.19.3版本成功:(six>=1.16.0通过requirements.txt安装了)

    pip3 install protobuf==3.19.3
    Collecting protobuf==3.19.3
    Installing collected packages: protobuf
    Successfully installed protobuf-3.19.3
    
    • 执行解包报错:
    python3 payload_dumper.py payload.bin
    Processing apusys partitionSOURCE_COPY supported only for differential OTA
    

    看其python代码没有使用其他文件,但是为了测试还是把OTA包整个解压到这里,再次测试还是报同样错误。在output目录生成空文件apusys.img。

    payload_dumper-win64

    • 怀疑是不是工具的问题或者是需要完整包,OTA包不行。
    • 根据https://cloud.tencent.com/developer/article/1937712,下载https://ali.kenvie.com/Downloads/payload_dumper-win64.zip。
    • payload.bin放入payload_dumper-win64\payload_input,cmd下执行payload_dumper.exe。
    payload_dumper.exe
    Traceback (most recent call last):
      File "payload_dumper.py", line 89, in 
    AssertionError: unsupported op
    [15820] Failed to execute script payload_dumper
    
    • 额,我没有逆向分析,但是怀疑就是把上面的payload_dumper打包python成exe。

    unota

    • 搜到https://www.hu60.cn/q.php/bbs.topic.99456.html,下载https://aite.xyz/product/unota/页面中的:https://xiaoqidun-1253140229.file.myqcloud.com/product/unota/unota_windows_amd64.exe?sign=248f446dc2ea809cbf7440a11043e955&time=1664520857。
    • 提供了Linux、Windows、mac、Android,差不多全平台的可执行文件。
    • 执行报错:
    unota_windows_amd64.exe -i payload_input\payload.bin
    2022/09/30 14:57:42 extract apusys to payload_extract\apusys.img ....
    panic: runtime error: invalid memory address or nil pointer dereference
    [signal 0xc0000005 code=0x0 addr=0x0 pc=0xbe59dc]
    
    goroutine 1 [running]:
    main.extractPartition(0xc000025450, {0xc00080f7e0?, 0xc00006fd30?}, {0xd0b500, 0xc00000a168}, 0x6165d)
            ./unota.go:154 +0x15c
    main.extractPartitions({0xc0001cae00, 0x1d, 0x6153a?}, {0xd0b500, 0xc00000a168}, 0xc00000e488?)
            ./unota.go:216 +0x352
    main.payload({0xd0b500, 0xc00000a168})
            ./unota.go:143 +0x2b1
    main.main()
            ./unota.go:91 +0x4a5
    
    
    unota_windows_amd64.exe -i payload_input\payload.bin -s boot
    2022/09/30 15:04:04 extract boot to payload_extract\boot.img ....
    panic: runtime error: invalid memory address or nil pointer dereference
    [signal 0xc0000005 code=0x0 addr=0x0 pc=0xbe59dc]
    
    goroutine 1 [running]:
    main.extractPartition(0xc000025860, {0xc0000120f0?, 0xc00006dd30?}, {0xd0b500, 0xc00000a168}, 0x6165d)
            ./unota.go:154 +0x15c
    main.extractPartitions({0xc0001c8e00, 0x1d, 0x6153a?}, {0xd0b500, 0xc00000a168}, 0xc00000e4a8?)
            ./unota.go:216 +0x352
    main.payload({0xd0b500, 0xc00000a168})
            ./unota.go:143 +0x2b1
    main.main()
            ./unota.go:91 +0x4a5
    
    
    • 看来是go写的,全平台编译,给出错误定位,不过我还没看payload.bin的数据结构,现在只能猜测是不支持OTA解包或者这个OTA包中不包含boot.img等镜像。之后根据care_map.pb测试其他镜像,虽然还是解出空文件,但是应该很大概率是这个OTA包中不包含boot.img等镜像,甚至不包含一个完整的分区镜像。
      在这里插入图片描述
    • 因为网速限制,只能下载一个线刷包,里面应该有boot.img。完整的卡刷包等有时间再测试。这部分知识也等有时间看源码或者查资料补上。

    线刷包提取boot.img,magisk修补

    • 解压后多了好多我不知道的文件,看来自己真的落后太多了。
      在这里插入图片描述
    • 确实如猜测的线刷包还是有单独的boot.img的:放到手机中
      在这里插入图片描述
    • 因为是联发科的cpu,加上这么多年没搞过了,不敢向以前一样随便刷机、修改测试了,毕竟以前的机型没有bl锁,还有短接法等进高通9008模式救砖,现在要是砖了只能去售后了,所以只能多搜一些教程,仔细对比、分析细节,排除错误。
    • 没有magisk的跨平台文件,所以需要手机上安装magisk:下载https://github.com/topjohnwu/Magisk/releases/download/v25.2/Magisk-v25.2.apk。
    • 安装后打开选择安装,选择“选择并修补一个文件”,选择boot.img,进开始执行修补了,额,并没有关闭ab校验之类的选项。修补完成会在Download文件夹生成一个magisk_patched**.img的文件。这个文件放到电脑上。

    解bl锁及刷boot.img

    • 绑定账号过了7天了,忘了是否必须开启oem解锁,为了保险是开启的:但是好像小米的官方以及一些推荐帖子并没有提开启oem解锁这个选项。
      在这里插入图片描述

    • 备份好数据后,执行reboot bootloader,进入fastboot界面。额,我记得上次好像还是经典的兔子界面,这次是只有一行橘红色的fastboot大写的黑色背景界面,是不是OTA更新改了?fastboot devices还是能识别设备的。我也不是很确定之前到底是不是兔子界面,如果不是很可能这个bootloader不是使用的高通的lk,如果是uboot可能还好,如果是个我完全不知道的,那么后面还想做双、多系统共存就麻烦了。

    • 使用当时最新的miflash_unlock-6.5.406.31,登录手机绑定的小米账号。
      在这里插入图片描述
      在这里插入图片描述

    • 解锁成功后自动重启了。卡了很久银色大MIUI界面,还以为出问题了,过了4、5分钟终于进入了MIUI13引导界面,说明是删除所有数据后启动在做dex2oat之类的优化。并没有验证小米账号的步骤,选择不联网、不登录账号进入了系统,也可能是因为我之前没有开启查找设备的功能。

    • 进入开发者选项看到oem解锁选项是勾选灰色状态,无法设置了。设备解锁状态是已解锁。糟糕,忘了记录属性了,还说对比下解锁后改变了那些属性值。

    • 我记得最开始应该是使用的a分区,OTA更新后使用的应该是b分区,执行:

    xaga:/ $ mount|grep /dev/block/sd
    /dev/block/sdc20 on /metadata type ext4 (rw,seclabel,nosuid,nodev,noatime,discard)
    /dev/block/sdc3 on /mnt/vendor/protect_f type ext4 (rw,seclabel,nosuid,nodev,noatime,nodelalloc,noauto_da_alloc,commit=1)
    /dev/block/sdc4 on /mnt/vendor/protect_s type ext4 (rw,seclabel,nosuid,nodev,noatime,nodelalloc,noauto_da_alloc,commit=1)
    /dev/block/sdc13 on /mnt/vendor/nvdata type ext4 (rw,seclabel,nosuid,nodev,noatime,nodelalloc,noauto_da_alloc,commit=1)
    /dev/block/sdc7 on /mnt/vendor/nvcfg type ext4 (rw,seclabel,nosuid,nodev,noatime,nodelalloc,noauto_da_alloc,commit=1)
    /dev/block/sdc8 on /mnt/vendor/persist type ext4 (rw,seclabel,nosuid,nodev,noatime,nodelalloc,noauto_da_alloc,commit=1)
    /dev/block/sdc84 on /mnt/rescue type ext4 (rw,seclabel,noatime)
    /dev/block/sdc83 on /cust type ext4 (ro,seclabel,nosuid,nodev,noatime)
    /dev/block/sdc55 on /mnt/vendor/mdota type ext4 (ro,seclabel,noatime)
    xaga:/ $ ls -la /dev/block/by-name/|grep sdc55
    lrwxrwxrwx 1 root root   16 2022-09-30 16:26 mcf_ota_b -> /dev/block/sdc55
    

    应该还是b分区,所以boot.img输入b分区应该是没错的,不过为了更安全,我决定还是不刷入分区,而是使用临时启动模式。因为我不确定修补的boot.img是否没有问题。中间想安装个apk,但是暂时不想登录小米账号开启usb安装,所以把启用miui优化选项关闭,这样就可以adb install安装apk了。

    • 执行fastboot boot magisk_patched-25200_IgsWh.img
    Sending 'boot.img' (65536 KB)                      OKAY [  1.413s]
    Booting                                            FAILED (remote: 'unknown command')
    fastboot: error: Command failed
    

    难道现在不支持这样启动了?

    • 所以最后使用:fastboot flash boot_b boot.img,还是直接刷入分区了。
    fastboot flash boot_b boot.img
    Sending 'boot_b' (65536 KB)                        OKAY [  1.476s]
    Writing 'boot_b'                                   OKAY [  0.177s]
    Finished. Total time: 1.715s
    
    • 启动后打开magisk,已经正常运行了,确实是b分区。至于看到有的刷两个分区,猜测应该是不正确的,除非2个分区的系统一致或者两个版本的boot.img一致,不然刷入两个分区,当当前分区不能启动时启动另一个分区,因为写入的magisk的boot.img和原来的不一致,应该启动不了吧?
    • 至于有人提到的联发科cpu需要关闭ab校验之类并没有遇到,正常启动了,也可能是magisk修复了?暂时先到这里吧

    magisk隐藏root

    • 开启Zygisk,打开遵循排除列表选项,再点击配置排除列表,选择需要隐藏root的app,重启。这样应该可以隐藏root了,因为我暂时也没有使用模块需求,所以开启隐藏同时不能使用模块的问题与我无影响,不过记得之前测试(应该不是这个v25.2版本)和支持Zygisk之前的版本都存在开启隐藏对隔离进程不生效的问题,虽然可以自己解决,但是比较麻烦。而之前测试Shamiko模块是解决了这个问题的。
    • 下载Shamiko模块:https://github.com/LSPosed/LSPosed.github.io/releases/download/shamiko-120/Shamiko-v0.5.2-120-release.zip,本地安装。关闭遵守排除列表,Shamiko模块可以根据列表隐藏。
    • 测试没有了/sbin目录,变为/dev/随机目录,su是通过chroot或者单独挂载到/system/bin/su实现的,没有加环境变量。
    • 测试根目录没有/init.rc,所以看不到加入的随机服务,不过属性中还是存在的,说明还是启动了随机名称的服务,但是不确定是不挂载init.rc了还是删除了,还是其他情况。
    • /data/misc/wifi/wpa_supplicant/下面没有任何文件了?待确定是不是Android12变更导致的,存储到哪里了?
    • 测试之前Zygisk的特征没有了,待确定是Shamiko模块隐藏的,还是v25.2版本修复了。
    • 测试即使配置排除列表时先点击app图标展开所有进程后再勾选,但是好像隔离进程不存在,需要运行app后再查看勾选多出来的隔离进程?但是我不确定,因为没有删除再测试,是记忆中好像是这样的,如果是这样,其实存在问题。
    • 支付宝等支付应用支付时会弹窗提示危险,以及状态栏左上角提示红色背景的危险。猜测可能关闭这几个系统设置和手机管家的选项即可:
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
    • 但是想想这刚好是检测magisk隐藏root的功能的时候,测试排除列表添加手机管家,可能需要启动几次才能获取所有进程,勾选,杀死手机管家。测试支付宝支付界面没有危险提示了,状态栏左上角提示绿色的安全,但是写到这里的时候又测试,现在支付没有危险、安全的提示了?不确定是不是策略这么设计的:前几次提示,后面检测不到root及使用时间较久就不进行安全的提示?
    • 定时开启飞行模式的功能经常失灵,待分析是miui的bug,还是因为手机管家(因为好像这个功能是手机管家提供的)没有后台运行,因为应该是系统应用,即使杀死了也会自启的且也没有自启开关(因为自启动管理也是手机管家提供的功能),所以明天测试看看手机管家是否后台运行以及测试处于前台时是否开启飞行模式。暂时记录到这里。
  • 相关阅读:
    第3章 并发编程
    周赛368(模拟、前后缀分解、枚举+数学、预处理+划分型DP)
    SAP ABAP CO02/COHV工单下达自动生成客制化批次
    Transformer的应用
    跟着DW学习大语言模型-什么是知识库,如何构建知识库
    java计算机毕业设计心理学网站源程序+mysql+系统+lw文档+远程调试
    Mathorcup数学建模竞赛第四届-【妈妈杯】B题:书籍推荐(附解题思路和MATLAB代码)
    ubuntu下的GDB的基本使用及CMake设置调试
    MySQL InnoDB缓存
    tomcat部署web项目报错:Could not initialize class sun.awt.X11GraphicsEnvironment
  • 原文地址:https://blog.csdn.net/DaoDivDiFang/article/details/127124188