國產廠商基本都對權限管理作了深度的定製,會自定義不少權限,如獲取應用列表和後臺啓動Activity(AndroidQ以前vivo和小米就自定義了),可是卻沒有提供API來判斷這些權限的狀態,這裏破解一下vivo機器,獲取權限狀態。android
獲取權限管理系統APKgit
獲取系統APK前面已經說過,不瞭解的能夠看這篇文章Android反編譯系統應用。github
破解權限管理APKbash
經過上述步驟能夠獲得權限管理APK文件和dex文件,使用JADX分別將APK文件和dex文件打開,下面介紹常規分析步驟:markdown
<provider android:name=".provider.PermissionProvider" android:writePermission="com.vivo.permissionmanager.provider.write" android:exported="true" android:authorities="com.vivo.permissionmanager.provider.permission" /> 複製代碼
該Provider爲對外暴露且能夠讀的組件。app
根據Provider方法分析
使用jadx反編譯PermissionManager.apk的dex文件,而且打開類com.vivo.permissionmanager.provider.PermissionProvider
ide
權限狀態讀取oop
content://com.vivo.permissionmanager.provider.permission/read_installed_apps
複製代碼
肯定訪問返回列名
找到Provider的query方法對應URI的判斷處:
post
獲取權限狀態加密
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…