Android 破解vivo手机权限管理

Android 破解vivo手机权限管理

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

获取权限管理系统APKgit

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

破解权限管理APKbash

经过上述步骤能够获得权限管理APK文件和dex文件,使用JADX分别将APK文件和dex文件打开,下面介绍常规分析步骤:app

  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为对外暴露且能够读的组件。ide

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

    image

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

  2. 权限状态读取ui

  • 读取已安装应用权限判断
  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. 获取权限状态spa

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…

相关文章
相关标签/搜索