【相关技术讨论群】760816094

在app调用系统服务的dump方法,我们可以参考dumpsys命令的实现,可以通过以下2中方式,

1,获取服务的Ibinder对象,但是一般是获取不到的,因为在app端可以使用的类似PackageManager这样的对象是把Ibinder对象封装在里面的,没有暴露出来,一般需要修改代码来提供Ibinder对象。或者进行NDk调用,仿照dumpsys里的方式,通过servicemanager对象获取到Ibinder对象,再调用其dump方法,可能会有SELinux权限等相关问题。

2,在app里通过运行命令如dumpsys activity 来实现,

通过调用Process的exec方法来执行命令,

这里有个封装好的类ShellUtils,可以很方便的进行调用

Android工具类之ShellUtils_WangShuo的专栏-CSDN博客

传人命令即可。

但是,进行dump调用需要有DUMP权限,系统服务的dump方法里进行了权限检查,

只有系统级应用可以注册android.permission.DUMP  (Permission is only granted to system apps)。

需要有系统签名,作为系统应用才可以调用起来。

我们可以发现,dumpsys -l命令是可以调用的,可以获取到服务名列表,

又可以发现,普通的app里调用dumpsys –l打印出来的结果里没有battery, meminfo等服务,这里查看log,可以发现

执行后会有权限异常

01-01 07:06:50.863 408-408/? E/SELinux: avc:  denied  { find } for service=battery pid=6609 uid=10099 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:battery_service:s0 tclass=service_manager permissive=0

因为untrusted_app没有相应的SELinux权限,

解决方法详细可参见add service的分析处理。

在system/sepolicy/service.te中,把

type battery_service, system_server_service, service_manager_type;

修改为

type battery_service, app_api_service, system_server_service, service_manager_type;

这是个规范的修改方案,因为其他地方对untrusted_app赋予了访问app_api_service的权限,

这里再扩展一下,

手机root后, dumpsys –l 才可以看到installd服务,因为installd服务没有提供find权限给shell域

01-04 00:28:45.946   400   400 E SELinux : avc:  denied  { find } for service=in

stalld pid=10460 uid=0 scontext=u:r:shell:s0 tcontext=u:object_r:installd_servic

e:s0 tclass=service_manager permissive=1

dumpsys.cpp中的处理

        for (size_t i=0; i<N; i++) {

            sp<IBinder> service = sm_->checkService(services[i]);

            if (service != nullptr) {

                bool skipped = IsSkipped(skippedServices, services[i]);

                aout << "  " << services[i] << (skipped ? " (skipped)" : "") << endl;

            }

        }

需要有访问权限才可以正确的进行checkService操作

为什么shell其他的服务有权限,而installd没有呢?

因为在/system/sepolicy/public/shell.te里把shell的installd_service几个访问权限给去掉了

/system/sepolicy/public/shell.te

98# allow shell access to services
99allow shell servicemanager:service_manager list;
100# don't allow shell to access GateKeeper service
101# TODO: why is this so broad? Tightening candidate? It needs at list:
102# - dumpstate_service (so it can receive dumpstate progress updates)
103allow shell {
104  service_manager_type
105  -gatekeeper_service
106  -incident_service
107  -installd_service
108  -netd_service
109  -virtual_touchpad_service
110  -vold_service
111  -vr_hwc_service
112}:service_manager find;
113allow shell dumpstate:binder call;

Logo

更多推荐