国产厂商基本都对权限管理作了深度的定制,会自定义不少权限,如获取应用列表和后台启动Activity(AndroidQ以前vivo和小米就自定义了),可是却没有提供API来判断这些权限的状态,这里破解一下vivo机器,获取权限状态。android
获取权限管理系统APKgit
获取系统APK前面已经说过,不了解的能够看这篇文章Android反编译系统应用。github
破解权限管理APKbash
经过上述步骤能够获得权限管理APK文件和dex文件,使用JADX分别将APK文件和dex文件打开,下面介绍常规分析步骤:app
<provider android:name=".provider.PermissionProvider"
android:writePermission="com.vivo.permissionmanager.provider.write"
android:exported="true"
android:authorities="com.vivo.permissionmanager.provider.permission"
/>
复制代码
该Provider为对外暴露且能够读的组件。ide
根据Provider方法分析
使用jadx反编译PermissionManager.apk的dex文件,而且打开类com.vivo.permissionmanager.provider.PermissionProvider
post
权限状态读取ui
content://com.vivo.permissionmanager.provider.permission/read_installed_apps
复制代码
肯定访问返回列名
找到Provider的query方法对应URI的判断处:
加密
获取权限状态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”,确定有插入的逻辑:
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手机权限管理的步骤,通常破解系统应用主要有以下个步骤:
这里给出反编译后的dex文件和demo地址:github.com/LiweiGogoin…