Android 破解vivo手机权限管理

8,527 阅读3分钟

Android 破解vivo手机权限管理

国产厂商基本都对权限管理做了深度的定制,会自定义很多权限,如获取应用列表和后台启动Activity(AndroidQ之前vivo和小米就自定义了),但是却没有提供API来判断这些权限的状态,这里破解一下vivo机器,获取权限状态。

获取权限管理系统APK

获取系统APK前面已经说过,不了解的可以看这篇文章Android反编译系统应用

破解权限管理APK

通过上述步骤可以得到权限管理APK文件和dex文件,使用JADX分别将APK文件和dex文件打开,下面介绍常规分析步骤:

  1. 查看AndroidManifest
    反编译获取的PermissionManager.apk,反编译后查看AndroidManifest.xml文件中的Provider,找到export=true的Provider并且有读的权限,这里找到PermissionProvider,具体定义如下所示:
<provider android:name=".provider.PermissionProvider" 
android:writePermission="com.vivo.permissionmanager.provider.write" 
android:exported="true" 
android:authorities="com.vivo.permissionmanager.provider.permission"
/>

该Provider为对外暴露且可以读的组件。

  1. 根据Provider方法分析
    使用jadx反编译PermissionManager.apk的dex文件,并且打开类com.vivo.permissionmanager.provider.PermissionProvider

    image

    上图为所有该Provider访问的URI地址,看到这些URI是不是很激动,通过名字就能知道该Provider对这些自定义权限提供了增删改查功能,通过上面Provider配置我们只能读取这些自定义权限的状态,下面介绍怎么判断当前是否有获取安装应用的权限和后台启动Activity权限。

  2. 权限状态读取

  • 读取已安装应用权限判断
  1. 确定访问URI
    获取已安装应用权限从上图URI集合中可以知道为read_installed_apps,所以最后拼装的URI为
content://com.vivo.permissionmanager.provider.permission/read_installed_apps
  1. 确定访问返回列名
    找到Provider的query方法对应URI的判断处:

    image
    看到这里有一个aoo,再找下这个aoo的定义:
    image
    好了,所有的列名称也找到了

  2. 获取权限状态

public static int getVivoApplistPermissionStatus(Context context) {
    Uri uri2 = Uri.parse("content://com.vivo.permissionmanager.provider.permission/read_installed_apps");
    try {
        Cursor cursor = context.getContentResolver().query(uri2, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
            while (cursor.moveToNext()) {
                String name = cursor.getString(cursor.getColumnIndex("pkgname"));
                int currentmode = cursor.getString(cursor.getColumnIndex("status"));
                		Log.d("liwei8", "name------>" + name + "------status---->" + currentmode);
            }
        }
    } catch (Throwable throwable) {
        throwable.printStackTrace();
    }
    return -1;
}

上面将所有的应用和获取已安装应用权限状态全部输出,这里截取一条:

name------>eK98u5S/S9VCK2ojfw6nenojEIDY3VBwS2FZQw/RBXE=------status---->2

从输出可以知道能获取当前权限的状态,但是应用的包名是处理过的,需要分析包名的处理,这里一个技巧就是全局搜URI的关键字“read_installed_apps”,肯定有插入的逻辑:

image

果然在上面的类中找到一个全局常量,下面看下哪里引用了,重点看下插入数据的方法:
image

找到了上面这个地方,再找下str的生成逻辑:
image
找到了,哈哈哈,看来是固定明文加密,直接反编译处理就好了,这里就不细介绍了,处理后的代码如下:

public static int getVivoApplistPermissionStatus(Context context) {
    Uri uri2 = Uri.parse("content://com.vivo.permissionmanager.provider.permission/read_installed_apps");
    try {
        Cursor cursor = context.getContentResolver().query(uri2, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
            while (cursor.moveToNext()) {
                String name = cursor.getString(cursor.getColumnIndex("pkgname"));
                String newName = CryUtils.akt(name,"iqoo11-14");
                		int currentmode = cursor.getString(cursor.getColumnIndex("status"));
                Log.d("liwei8", "name------>" + newName + "------status---->" + currentmode);
            }
        }
    } catch (Throwable throwable) {
        throwable.printStackTrace();
    }
    return -1;
}

最后输出如下:

name------>com.sankuai.meituan------status---->2
name------>com.youku.phone------status---->2
name------>com.jm.android.jumei------status---->2
name------>com.tencent.mm------status---->2

上面已经可以获取权限的状态和应用包名了

总结

上面主要讲解破解vivo手机权限管理的步骤,一般破解系统应用主要有如下个步骤:

  1. 反编译应用APK并且获取dex文件
  2. 查看AndroidManifest.xml查找Provider
  3. 找到Provider后看下是否export=true,并且能读写,如果读写都没有权限,基本就结束了
  4. 找到Provider的代码,确认访问的URI和参数

这里给出反编译后的dex文件和demo地址:github.com/LiweiGogoin…