小米10 adbd 以root权限启动提供服务

您所在的位置:网站首页 小米10sroot权限怎么关闭 小米10 adbd 以root权限启动提供服务

小米10 adbd 以root权限启动提供服务

2024-07-15 23:05| 来源: 网络整理| 查看: 265

之前写了类似的文章,但是这个文章办法不适用于小米10, 原文参考:

https://blog.csdn.net/aerror/article/details/103270830

主要有几个问题:

1. supolicy这个在小米10 中root之后运行不起来,直接segment fault.

2. 小米的文件系统remont 成rw失败,提示

1|vangogh:/data/local # mount -o remount,rw /                                                                                                                                                           

'/dev/block/dm-4' is read-only

root

3. 即使修改了ro.secure 和 ro.adb.secure, 原版小米10的adbd启动后权限还是shell ...

 

解决办法如下, 大前提,你得先要把小米10 root了,可以使用su权限获到root的权限。

1.  下载android 10 的 aosp_arm64-img  https://ci.android.com/builds/submitted/7064523/aosp_arm64-userdebug/latest, 

https://ci.android.com/builds/submitted/7064523/aosp_arm64-userdebug/latest/aosp_arm64-img-7064523.zip

2.   解压aosp_arm64-img-7064523.zip得到system.img文件, 用以下命令得到debug版的adbd

mkdir /mnt/system mount -o ro system.img /mnt/system #一定要-o ro 要不然默认是rw, mount不成功. #复制得到debug版本adbd cp /mnt/system/system/bin/adbd adbd

因为是ext2文件系统,使用linux比较方便,macos也可以使用fuse。可以用file命令来判断这个image是raw的img还是sparse的img, 要是sparse img, 还需要使用simg2img命令来转一下, 需要的话,使用brew , yum  , apt之类的工具安装。

$ file system.img system.img: Linux rev 1.0 ext2 filesystem data, UUID=4729639d-b5f2-5cc1-a120-9ac5f788683c (extents) (large files) (huge files)

3. 上传adbd到 手机

adb push adbd /mnt/sdcard adb shell su -c mv /mnt/sdcard/adbd /data/local/ adb shell su -c chmod +x /data/local/adbd

4. 编写脚本adbdroot, system_properties_arm64是专门用于修改ro.开头的只读系统变量的,ro开头是只读,使用setprop是无法修改的,具体原理看https://bbs.pediy.com/thread-222293.htm

 

Upload system_properties_arm64 and adb to /data/local/ stop adbd /data/local/system_properties_arm64 ro.secure 0 /data/local/system_properties_arm64 ro.adb.secure 0 cd /data/local/ nohup ./adbd >/dev/null &

 

 

5.上传adbdroot到手机,并执行

adb push adbdroot /mnt/sdcard/ adb shell su -c mv /mnt/sdcard/adbdroot /data/local adb shell su -c chmod +x /data/local/adbdroot adb shell su -c /data/local/adbdroot

6. 使用whoami测试,  得到adb shell权限默认就是root,不需要再su一下了,使用原来的脚本工具,调试就很方便了。

$ adb shell whoami root

本文用到的资源我上传了一份在这里,adbd和system_properties_arm64 , https://download.csdn.net/download/aerror/14429391, 方便大家直接使用。

 

 

附,关于root环境下直接修改ro属性, 上面有提到,是pediy的liwugang 发布的,此处,我觉得这个办法应该是众多办法中最好的一个,故转载内容在下面,以示敬意:

----------以下是转载内容---------------------

Android root环境下直接修改ro属性(只读properties)

属性是由init进程读取到内存中,然后通过mmap只读方式共享到其他进程中。读的时候每个进程都可以直接读取,而修改或者添加只能由init进程来进行,这样方便selinux权限管理。

有root权限后,我们可以将属性内存通过mmap读写的方式共享到我们的内存中,这样可以任意修改,绕过init的限制。

属性内存结构 * +-----+ children +----+ children +--------+ * | |-------------->| ro |-------------->| secure | * +-----+ +----+ +--------+ * / \ / | * left / \ right left / | prop +===========+ * v v v +-------->| ro.secure | * +-----+ +-----+ +-----+ +-----------+ * | n | | sys | | com | | 1 | * +-----+ +-----+ +-----+ +===========+ *

 

上图其实很形象,是字典树和二叉树的混合。结点信息数据结构如下:

typedef struct prop_bt { uint8_t namelen; // 该结点名字长度 uint8_t reserved[3]; // 对齐的作用 uint32_t prop; // 指向prop_info,里面保存key和value信息 uint32_t left; // 左兄弟,长度小于或者长度相同而名字小于当前结点 uint32_t right; // 右兄弟,长度大于或者长度相同而名字大于当前结点 uint32_t children; // 子结点 char name[0]; } prop_bt; typedef struct prop_info { uint32_t serial; char value[PROP_VALUE_MAX]; // PROP_VALUE_MAX = 92,所以说属性值最大长度为91,'\0'结尾 char name[0]; // 属性名字 } prop_info;

思路:

1. Android N上,首先读取读取/property_contexts文件,获取属性前缀和security context (selinux定义的)的关系,由于每个security context对应一个文件,所以需要通过前缀来找到对应的文 件,6.0及以下所以属性都保存在/dev/__properties__文件中,可以不读取/property_contexts文件 2. 打开对应的文件,将属性以'.'分隔,将第一部分和头结点对比,若相同则第二部分和children对比,不同, 若小于则继续使用第一部分比较left结点,若大于则比较right结点。依次类推,若最后部分和结点N相等,则N的prop就是所要找到prop_info.

 

源码:https://github.com/W-WTerDan/android_properties



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3