android获取其他应用权限(修改状态)

Posted small_role

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android获取其他应用权限(修改状态)相关的知识,希望对你有一定的参考价值。

这两天老大发话说要我研究一下安卓安全软件的功能,先抽取了一个小模块,研究权限管理


一开始就去packagemanager 去看发现有几个方法:

就先去看了一下IPackagemanager 里面的方法:

有很多 这里我之列出跟权限有关的

     PermissionInfo getPermissionInfo(String name, int flags);  
          
        List<PermissionInfo> queryPermissionsByGroup(String group, int flags);  
          
        PermissionGroupInfo getPermissionGroupInfo(String name, int flags);  
          
        List<PermissionGroupInfo> getAllPermissionGroups(int flags);  
      
        int checkPermission(String permName, String pkgName);  
          
        int checkUidPermission(String permName, int uid);  
          
        boolean addPermission(in PermissionInfo info);  
          
        void removePermission(String name);  
      
        void grantPermission(String packageName, String permissionName);  
      
        void revokePermission(String packageName, String permissionName);  
      
      String[] getAppOpPermissionPackages(String permissionName);  
      
    ParceledListSlice getPackagesHoldingPermissions(in String[] permissions,  
                int flags, int userId);  
     boolean addPermissionAsync(in PermissionInfo info);  
     void setPermissionEnforced(String permission, boolean enforced);  

看安全软件上的功能:

通过包名找权限

通过权限找包名

禁用 提示  允许 三种状态

首先:就发现了2个方法:

void removePermission(String name);  
void grantPermission(String packageName, String permissionName); 
我很高兴的就开始写代码了 测试结果:  
java.lang.SecurityException: Can‘t change android.permission.INTERNET. It is required by the application  
一直报这个错  
  
查看源码其实查到了是需要检查权限,源码就不贴了,想要绕过检查这个方法,可以通过hook的方式,猜测把源码修改一下也可以用,目前这种方案先放弃。 

我又去网上查了一部分资料:看到这个类AppOpsManager  我就明白了 我找到相应的服务端代码IAppOpsService:

    interface IAppOpsService {  
        // These first methods are also called by native code, so must  
        // be kept in sync with frameworks/native/include/binder/IAppOpsService.h  
        int checkOperation(int code, int uid, String packageName);  
        int noteOperation(int code, int uid, String packageName);  
        int startOperation(IBinder token, int code, int uid, String packageName);  
        void finishOperation(IBinder token, int code, int uid, String packageName);  
        void startWatchingMode(int op, String packageName, IAppOpsCallback callback);  
        void stopWatchingMode(IAppOpsCallback callback);  
        IBinder getToken(IBinder clientToken);  
      
        // Remaining methods are only used in Java.  
        int checkPackage(int uid, String packageName);  
        List<AppOpsManager.PackageOps> getPackagesForOps(in int[] ops);
       List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, in int[] ops);  
        void setMode(int code, int uid, String packageName, int mode);
        void resetAllModes(int reqUserId, String reqPackageName);  
        int checkAudioOperation(int code, int usage, int uid, String packageName);  
        void setAudioRestriction(int code, int usage, int uid, int mode, in String[] exceptionPackages);  
      
        void setUserRestrictions(in Bundle restrictions, int userHandle);  
        void removeUser(int userHandle);  
    }  

它通过mode的方式来设置状态,

可以通过包名获取权限

也可以通过权限获取包名


更重要的是返回权限不是全部的 会根据级别 系统写好的返回给你

你可以根据权限做个分级,这一切就明朗了

 

以上是关于android获取其他应用权限(修改状态)的主要内容,如果未能解决你的问题,请参考以下文章

当通知进入android时如何获取Bundle数据

分享:Android系统的经常使用权限整理

Android获取各个应用程序的缓存文件代码小片段(使用AIDL)

Android应用如何获取System权限和root权限

Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段

Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段