發(fā)現(xiàn)小米 6 安全管家,即使我關閉了某些權限,但我一打開應用后,應用自己開啟了權限,遂,反編譯之,得以下反射強行設置權限代碼。。
理論上手動開啟權限也是使用以下的代碼進行,因此只有系統(tǒng)應用可以使用。(但不排除某些廠商定制rom的過程中,漏掉了關鍵的驗證,調(diào)用只有有可能是可行的)
AppOpsManager appOpsManager = mContext.getSystemService(AppOpsManager.class);
HashMap<String, Integer> map = (HashMap<String, Integer>) ClazzUtils.getObjectFieldObject(appOpsManager,"sOpStrToOp");
Method method = appOpsManager.getClass().getMethod("setMode",int.class,int.class,String.class,int.class);
int code = map.get(AppOpsManager.OPSTR_GET_USAGE_STATS);
int uid = Binder.getCallingUid();
String pkn = mContext.getPackageName();
int mode = AppOpsManager.MODE_ALLOWED;
method.invoke(appOpsManager,code,uid,pkn,mode);
再附上一個反編譯小米安全管家設置權限的代碼:
Object mAppOpsManager = context.getSystemService("appops");
ClazzUtils.invokeObjectMethod(mAppOpsManager, "setUserRestriction", new Class[]{Integer.TYPE, Boolean.TYPE, IBinder.class}, new Object[]{Integer.valueOf(24), Boolean.valueOf(true), new Binder()});
ClazzUtils.invokeObjectMethod(mAppOpsManager, "setUserRestriction", new Class[]{Integer.TYPE, Boolean.TYPE, IBinder.class}, new Object[]{Integer.valueOf(45), Boolean.valueOf(true), new Binder()});