一、前言
最近一周比较忙,没时间写东西了,今天继续开始我们今天的话题:run-as命令,在上周的开发中,遇到一个问题,就是在使用run-as命令的时候出现了一个错误,不过当时因为工作进度的问题,这问题就搁浅没有解决,用了其他一个曲线救国的方式去解决的。那么咋们今天闲来说说Android中的run-as命令吧。
二、遇到的问题&解决问题
Android中我们知道如果设备没有root,我们想看一个应用的沙盒数据(/data/data/目录内容),在以前的方式很难办到,一般人都是选择root之后,去查看对应的数据库,xml等数据。但是如果如果我们没有root了,照样也想看这些数据,怎么办呐?其实Android中提供了一个命令,那就是:run-as,不过这个命令有一个缺陷,就是只有Debug应用才能查看,这个到后面在分析run-as源码的时候再说。这个命令的用法很简单:run-as [packagename]
其中packagename就是我们想查看的应用的包名,运行命令之后,就直接进入到指定应用的目录下:/data/data/packagename/
那么我现在稍微了解了Android中有这个命令,可以查看Debug应用的沙盒数据,那么我遇到一个什么问题呢?下面来看我运行的结果:
呵呵,点够北的,为毛这个命令会报错呢?遇到这个问题我们只有两种方式去解决:一种是网上查资料,一种是自己去看那操蛋的源码,好吧,现在我们有时间了,那就去看源码吧,关于Android中的这些命令,一般都在/system/bin和/system/xbin目录下,这些命令的源码一般都是放在源码的:Android源码目录\system\core\ 下:
那么我们就来看看run-as的源码:run-as.c:
看到这里,我们知道了,原来run-as命令运行有很多限制的:
第一个限制:运行的uid限制,运行命令的用户id只能是shell和root用户
下面我们可以验证一下,我们使用system的uid运行命令:
这里我们用于测试的设备已经root了,因为我要讲解问题,所以需要root之后操作方便。这里看到使用su可以随意设定uid,这个后面分析su源码在说他是如何做到的。这里我们将uid变成了system了,在运行run-as,发现报错了,符合预期吧。
第二限制:这个应用的安装必须合法
这里我们在仔细看看get_package_info这个函数的源码了,它位于run-as.c同目录下的package.c:
这里通过map_file函数来获取PACKAGES_LIST_FILE文件的buffer内容,我们再来看一下PACKAGES_LIST_FILE的定义:
是这个文件,我们导出这个文件,查看内容:
这个文件记录所有安装应用的信息:
包名,用户id(uid),是否为debug模式,对应的数据目录,是否是release版,组id(gid)
这里我们看到,demo.systemapi应用是debug模式的。一般正式app都是非debug模式。
这里通过读取这些信息就可以构造出一个PackageInfo了:
注意:
这里我们看到了packages.list文件是存储安装包的简略信息的,其实和他同一目录下还有一个重要文件:packages.xml,我们可以导出来看看:
看到了,这里就记录了安装应用的详细信息,还有一个重要信息就是还能够知道应用的安装来源,有些app可以做到这点,就是通过这个信息来获取到的,还有签名信息,权限等。
当然我们可以使用Android中的dumpsys packageinfo命令来查看指定应用的详细信息:
第三个限制:应用的uid必须合法
我们看到这里AID_APP的定义,在 Android源码目录\system\core\include\private\android_filesystem_config.h
这里定义了一些uid信息,看到:
AID_ROOT对应的是root用户,uid=0
AID_SYSTEM对应的是system用户,uid=100
AID_SHELL对应的是shell用户,uid=2000
从这里我们可以看到,root用户的权限》system用户的权限》shell用户的权限》第三方应用的权限
不过这里所说的权限只是对于一些情况,不是全部哦,比如一个简单的例子,Android中有些api是会做uid限制的,即时我们用反射机制也是访问失败的,那么比如有一个api他限制只能uid=1000的用户就是system用户才能调用,那么这时候,即时你是root用户也是没办法的,不过可以使用su进行降权,这个后面会通过一个例子来看。
这三个用户的id最好记住啦,算是常识了。
在往下看:
看到了,这里的AID_APP是10000,我们也知道,我们安装的应用的uid都是从10000开始的,所以uid都是大于10000的,这里所以做了一层uid的合法性判断限制