转自:http://hi.baidu.com/tomken_zhang/blog/item/bd170aa9cbd0a2e61f17a207.html
ADB 是 Android 手机中的一个调试服务
他是由 ROOT 程序派生的,
看 adb.c 中有一样一段代码
property_get("ro.kernel.qemu", value, "");
if (strcmp(value, "1") != 0) {
property_get("ro.secure", value, "");
if (strcmp(value, "1") == 0) {
// don't run as root if ro.secure is set...
secure = 1;
// ... except we allow running as root in userdebug builds if the
// service.adb.root property has been set by the "adb root" command
property_get("ro.debuggable", value, "");
if (strcmp(value, "1") == 0) {
property_get("service.adb.root", value, "");
if (strcmp(value, "1") == 0) {
secure = 0;
}
}
}
}
只要让 secure 不等于1,就是以 root 运行,否则就是以 shell 运行
secure 默认值是为 0 的,看上面代码,
property_get 是 Android 中属性服务,用的是共享内存,因为在这里没有加上合适的判断,可以让这片内存设定不不可读,按上面的代码逻辑,ADB 也就成 ROOT 用户了。
如何设定,参见 psneuter.c 中,是这样做的,
查找环境变量 ANDROID_PROPERTY_WORKSPACE,这里记录的是共享内存的句柄,及内存大小
调用了一个 ioctl 命令 ioctl(fd, ASHMEM_SET_PROT_MASK, 0),会导致这个共享内存不可读,具体未研究!
看来用 ADB 来获取 ROOT 还是有不少办法的!