关机状态下开启adb_root

说明

应该是2016年之前的记录,之前没有写文档记录的习惯,都是随手记录的txt文件,所以没有图片、格式等。甚至现在看来有些地方逻辑不通(可能还因为年少轻狂,有些偏颇的话语),但是这些与现在的我不重要了,所以也不打算再复现、推理,重新编辑等,仅仅是在旧硬盘中发现,删除之前觉得可能还有点价值,记录下来吧。

1:小米2原系统只要在default.prop中配置如下即可关机状态下开启adb_root:
ro.adb.secure=0
ro.secure=0
ro.allow.mock.location=0
ro.debuggable=1

2:但是貌似4.3起的系统关机状态下都不能以root启动,即使adb shell登录后用特定的su取得root,但是依然无法执行某些root权限,比如挂载分区等。ps -Z查看adbd是shell用户组不是root
做过如下尝试:
使用自己米2下可以关机adb_root的boot中的adbd替换,貌似可以执行分区挂载了。但是adb root启动还是不可以。

替换init后确实可以adb_root启动了,挂载分区也可以,但是ps -Z没有发现u:r:adbd:s0这样的lable,说明selinux没有用,也确实,这个init是4.1的,这个版本没有selinux。另外adb reboot貌似不能执行,说明有些地方不通用的。

对selinux不是很了解,想可能是这方面的问题,网上看到:
service adbd /sbin/adbd --root_seclabel=u:r:su:s0
class core
socket adbd stream 660 system system
disabled
seclabel u:r:adbd:s0
比编译版本自带的init.rc多了–root_seclabel=u:r:su:s0参数,加上测试依然不行,把u:r:adbd:s0改为u:r:su:s0不行

3:思考发现adb root打印adbd cannot run as root in production builds,所以在system/core下面搜索找到system/core/adb/services.c中:
void restart_root_service(int fd, void *cookie)
{
char buf[100];
char value[PROPERTY_VALUE_MAX];
char build_type[PROPERTY_VALUE_MAX];
char cm_version[PROPERTY_VALUE_MAX];

if (getuid() == 0) {
    snprintf(buf, sizeof(buf), "adbd is already running as root\n");
    writex(fd, buf, strlen(buf));
    adb_close(fd);
} else {
    property_get("ro.debuggable", value, "");
    if (strcmp(value, "1") != 0) {
        snprintf(buf, sizeof(buf), "adbd cannot run as root in production builds\n");
        writex(fd, buf, strlen(buf));
        adb_close(fd);
        return;
    }

    property_get("persist.sys.root_access", value, "1");
    property_get("ro.build.type", build_type, "");
    property_get("ro.cm.version", cm_version, "");

    if (strlen(cm_version) > 0 && strcmp(build_type, "eng") != 0 && (atoi(value) & 2) != 2) {
        snprintf(buf, sizeof(buf), "root access is disabled by system setting - enable in settings -> development options\n");
        writex(fd, buf, strlen(buf));
        adb_close(fd);
        return;
    }

    property_set("service.adb.root", "1");
    snprintf(buf, sizeof(buf), "restarting adbd as root\n");
    writex(fd, buf, strlen(buf));
    adb_close(fd);
}

}

推论出只有ro.debuggable不为1时才打印这个提示,但是default.prop中配置了,猜测是不是没起作用。使用getprop无法获取任何属性,使用的是4.1米2系统的getprop,尝试用4.3的系统的getprop提示需要libselinux.so,此时system是4.1的,4.3挂载到system1,指定export LD_LIBRARY_PATH=/vendor/lib:/system/lib:/system1/lib没效果,必须把system1放到最前面,但是出现段错误并且其他system下可执行程序需要库文件时就去system1找了,不匹配也是错。懒得搞这个了。cat /dev/__properties__查看属性,不过很多乱码,而且记得源码中好像把这个文件打开之后删除了,所以虽然这个文件实际内容还在,但是已经找不到和不能打开了,但是这里是存在的,可能系统关机状态下和开机流程不一样。如果不存在这个文件,可以使用lsof命令查看:
? /dev/properties
charger_a 196 root 9 ??? ??? ??? ??
类似这样,那么说明196还持有该文件,然后cat /proc/196/fd/9这样也可以查看内容。原理就是文件虽然删除,但是其内容还被引用。其中并没有发现ro.debuggable属性和其他在default.prop中定义的属性,推测很可能根本就没加载这个属性配置文件,接下来测试直接在on charger选项开头添加
这个on charger是在init.aries.rc中,要启动adb shell需要sh,那么还是要挂载个system分区。
mount ext4 /dev/block/platform/msm_sdcc.1/by-name/system1 /system wait ro barrier=1
setprop ro.debuggable 1
原文件也没有关机状态下启动adbd守护的配置,默认是不设置usb的。需要自己添加:
setprop sys.usb.config adb
这个属性值改变会启动adbd服务,如下init.usb.rc:
on property:sys.usb.config=adb
write /sys/class/android_usb/android0/enable 0
write /sys/class/android_usb/android0/idVendor 18d1
write /sys/class/android_usb/android0/idProduct D002
write /sys/class/android_usb/android0/functions ${sys.usb.config}
write /sys/class/android_usb/android0/enable 1
start adbd
setprop sys.usb.state ${sys.usb.config}
setprop ro.debuggable 1
为了保险这里再添加一次debuggable。这样之后虽然adb shell启动不会像米2原boot一样直接就是#,但是可以执行adb root了,之后adb shell就直接#了

4:米2原boot,即自己的4.1中有如下:

Restart adbd so it can run as root

on property:service.adb.root=1
write /sys/class/android_usb/android0/enable 0
restart adbd
write /sys/class/android_usb/android0/enable 1

加到4.4的rc中也没用,貌似版本变化吧,好像测试时用4.1的adbd时执行adb root,手机画面重启了,说明service.adb.root=1触发了,那么也就是adb root就是传递了这个值。
但是4.4的adbd却没反映,说明没有传递该值,呵,看上面的adb的services.c也确实没有。

5:根据adb的services.c看到adb root其实主要就是一条命令:setprop service.adb.root 1
剩下的就是测试和有时间再看init源码看是否跳过了属性文件的加载解析。
把on property:sys.usb.config=adb对debug的设置去掉,保留一个即可,测试把启动adb放在on charger中靠前位置,想尽早的启动adb好调试,不过测试好像没什么差别,为了稳定还是放在cpu设置后面吧。

6:测试发现直接在rc中设置service.adb.root是没有用的。即使在adb shell中设置也没用。不过在adb shell中设置setprop ro.debuggable 1之后adb root是可以的。说明重要的值还是ro.debuggable

7:正确的配置如下:
setprop sys.usb.config adb
setprop ro.debuggable 1
setprop service.adb.root 1

这样启动adb shell默认就是root了。和米2boot一样了。至于三个设置的顺序有没有要求不确定,因为不确定service.adb.root 1的时候触发了那些操作,原来的4.1是直接重启一下adbd和usb口。4.4的是在property_contexts:32:service.adb.root u:object_r:shell_prop:s0定义了,所以把从4.1boot拷贝的触发事件注释或删掉,避免多重置一次usb口。
我想终究还是selinux的原因,因为通过自己的su文件取得root有些操作做不了应该就是selinux的限制,有时间再研究。

貌似以下是临时关闭selinux,默认是Enforcing,setenforce设置,1是Enforcing,0是Permissive。
root@android:/#getenforce
Enforcing
root@android:/ # setenforce 0
root@android:/ # getenforce
Permissive

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值