您的位置:首页 > 移动开发 > Android开发

关于Android系统ROM的debug-root模式说明

2015-03-31 20:52 337 查看
前言:

做为一名测试,可以不用去考虑过程的实现,只关心结果。然而,有人说了,你这连原理都不知道,如何把握结果的准确性。那么,换个角度来想,底层向上层提供服务和接口,上层只管调用,出问了问题,报问题给底层就行了,这就是团队协作。如果有人说我不能把握结果的准确性,那么,我只能呵呵了。每次写博文,总是有少许的感言,就当工作之余的一点点牢骚。

其实android的系统,在启动的时候,都是root权限,因为init.rc进行的时候都是root权限,其子进程也是root权限,只是为了安全,adbd将root权限重新定义为shell权限。

以下是RageAgainstTheCage漏洞的一个说明(该说明载至jb51):

1、出厂设置的ro.secure属性为1,则adbd也将运行在shell用户权限下;

2、adb工具创建的进程ratc也运行在shell用户权限下;

3、ratc一直创建子进程(ratc创建的子程序也 将会运行在shell用户权限下),紧接着子程序退出,形成僵尸进程,占用shell用户的进程资源,直到到达shell用户的进程数为 RLIMIT_NPROC的时候(包括adbd、ratc及其子程序),这是ratc将会创建子进程失败。这时候杀掉adbd,adbd进程因为是 Android系统服务,将会被Android系统自动重启,这时候ratc也在竞争产生子程序。在adbd程序执行上面setgid和setuid之 前,ratc已经创建了一个新的子进程,那么shell用户的进程限额已经达到,则adbd进程执行setgid和setuid将会失败。根据代码我们发
现失败之后adbd将会继续执行。这样adbd进程将会运行在root权限下面了。

3、这是重新用adb连接设备,则adb将会运行在root权限下面了。

那么,知道了这个ro.secure系统属性后,我们就知道了,如何打开root权限了。当然,android的系统属性中还有一个debuggale的属性,这个属性控制着版本是否是可以调试的,也就是我们可以做更多的事情,当然,测试工具也可以用得更多。

那么这些属性都在哪里呢?答案是:default.prop中,这个文件在boot.img的ramdisk当中,boot.img文件中有kernel文件,为了保护内核的安全性,这个分区是不运行去写的,当然是系统启动后是不能写的,如果在系统启动前那就可以写了,也就是用fastboot去烧写boot.img的原理了。

如何修改default.prop文件呢?

过程虽然有点复杂,但是对测试工作来说,还是挺有帮助的,不过,同样的道理,在发烧友拥有fastboot的烧写工具或者方法的情况下,再次去烧写boot.img文件,以获得真正的root权限还是很有用的。

修改点:

ro.secure = 1 (root权限,1为打开,0为关闭)

ro.adb.secure = 1 (adb-root权限,1为打开,0为关闭)

ro.debuggable = 0(调试模式,也就是debug模式,1为打开,0为关闭)

同样的道理,1为true,0为false,我们把属性修改为以下

ro.secure = 0 (关闭安全模式,也就是把root权限打开)

ro.adb.secure = 0 (关闭adb安全模式)

ro.debuggable = 1(打开debug模式)

boot.img文件:

原理:

知道了修改点和具体属性所代表的意思之后,那么我们就来修改这个default.prop文件吧。default.prop文件所在的位置是boot.img的ramdisk中,插一句,boot.img也就是kernel启动后,会将ramdisk这个文件映射到系统当中,也就是根目录下,当然,我们一般在文件管理器中是可以看到的,但是修改却是无法修改,这是因为这是映射文件,我们改的只是android启动时候,系统放在内存当中的缓存,不是真正的文件,就好像在镜子中饼,我们可以去镜子中吃它,破坏它,但在真实当中,它还是存在的。

获取:

如何获取boot.img文件,这就要看每个Rom的不同了,一般的,我们在Rom的zip包中,会自带这个分区文件。直接解压缩出来就可以了,当然,各家的Rom的压缩方式可以能不同,要取得,只有根据各家Rom的打包特性去解包了。

解包工具:

好了,获取到boot.img文件后,我们还必须需要三个工具,这三个工具是在linux下使用的,所以。。。(搭环境吧)

1、split_bootimg.pl

2、mkbootfs

3、mkbootimg

以下方法来自互联网,具体是哪里的,真的忘了,一直记在笔记上,所以就摘抄下来记录下,望原作者见谅

################################################################################################################

如何解包和打包:

解包boot.img命令:

% ./split_bootimg.pl boot.img  (解包boot.img到当前文件夹中)

解包ramdisk的命令如下: 

% mkdir ramdisk (新建一个ramdisk文件夹)

% cd ramdisk (进入这个刚刚建好的ramdisk文件夹)

% gzip -dc ../recovery.img-ramdisk.gz | cpio -i (使用gzip命令对gz包进行解压)

% cd .. 

解码完毕后,就可以修改了,主要的工作在这里,这里是自制的地方。(例如,在default.prop

设置ro.secure=0等等) 

使用mkbootfs工具来重新创建ramdisk,可以使用如下命令来操作: 

% mkbootfs ./ramdisk | gzip > ramdisk-new.gz 

使用mkbootimg来重新创建boot-new.img: 

%  mkbootimg --cmdline  'no_console_suspend=1  console=null'  --kernel  boot.img-kernel 

--ramdisk ramdisk-new.gz -o boot-new.img 

################################################################################################################

到此我们就得到了一个新的boot-new.img,接着,我们可以使用fastboot工具进行boot.img的烧写,root权限在升级版本的情况下,会永远存在的。

当然,上面的过程,同样适用于recovery的解包和打包,这只是原理的一个解释,对一种现象的描述,可以帮助我们理解原理和去针对问题做验证,不过玩机也是一样,如果别人怎么做,你就怎么做,那么下个rom来的时候,有很多好玩的东西,不是都要重新来过吗?知道了原理,那就不一样了,同样是android的东西,真是手到擒来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: