问题描述:
在日常使用中framework的一些接口是不想给第三方非system app使用的。这样做不但安全,也防止第三方会做一些流氓的事情。以android 5.1.1为例,无论是在调用ams中forceStopPackage还是pms中的addPreferredActivity在调用前都会check调用方的 permission,这就导致的不该调用的人调用后被抛出异常。但是如何能绕过这个check去做一些事情呢?
解决步骤:
just read the fucking souce code!!!
查看源码的过程中我们发现在AcitivtyManagerNative中有一个checkPermission的接口这个接口就是用来检测调用者权限的,但是这个是java层的代码我们无能为力,继续看!我们知道每个apk在安装后都有自己的uid,启动后进程都有自己的pid,而这个pid和uid是受apk签名和androidmanifest中的配置影响的。比如setting.apk这个android系统中都有的apk就是在androidmanifest 中写了
coreApp="true"
android:sharedUserId="android.uid.system"
又有和系统一样的签名才使得他能够调用forceStopPackage这种接口。我们看见系统在检测权限的时候就是用了这个性质进而来检测调用方的pid和system service的pid进行相互对比,如果一致那就授权调用方可以使用接口!ok那么就依照这个来欺骗系统吧。根据源码我们可以知道最后获取pid的代码是在android_util_Binder.cpp这个类中,这个类是在android_runtime.so这个文件中的类。我们知道这个so文件是java运行环境不可缺少的so文件,而一些system service恰巧也是需要这个so文件的ok那我们就通过注入指定的system service进程找到指定的模块,然后根据函数在模块中的相对地址去找这个函数,然后hook他就搞定了。