Xposed 实现给Hook的APP添加权限Permission

因为Xposed的资料都比较老了,所以只有找到android低版本的权限添加。今天研究了一会,把hook app 的动态权限添加了。

直接说方法

Xpose模块:

添加权限需要activity对象,所以首先获取activity。直接拿到onCreate里的this对象就是activity对象了

          findAndHookMethod("com.example.hoyn.example.MainActivity", lpparam.classLoader, "onCreate", Bundle.class, new XC_MethodHook() {                @Override                protected void afterHookedMethod(MethodHookParam param) throws Throwable {                    super.afterHookedMethod(param);                    activity = (Activity) param.thisObject;                    XposedBridge.log(activity.getPackageName());                }            });

接着实现权限获取,我的权限获取是在一个按钮事件中

            //由于OnClickListener是内部类,在hook的时候应是$+数字,具体是数字几可以在反编译后的smali文件里面看到,我这个项目就一个内部类所以是$1            findAndHookMethod("com.example.hoyn.example.MainActivity$1", lpparam.classLoader, "onClick", View.class, new XC_MethodHook() {                @Override                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {                    super.beforeHookedMethod(param);                    XposedBridge.log("点击了之前");                    //获取按钮对象                    v = (View) param.args[0];                    //获取权限                    requestPermission(activity);                }            });
    //请求权限    private void requestPermission(Activity activity) {        //需要的权限        String permission = Manifest.permission.WRITE_EXTERNAL_STORAGE;        //检测是否没有该权限        if (ContextCompat.checkSelfPermission(activity,permission)!= PackageManager.PERMISSION_GRANTED) {//            没有该权限则请求权限,请求码 100            ActivityCompat.requestPermissions(activity,new String[]{permission},100);        }    }

主要的逻辑和平时动态添加权限是一样的,只不过需要先拿到activity对象是关键

请求回调的处理

private void onRequestPermissionsResult(XC_MethodHook.MethodHookParam param) {        int requestCode = (int) param.args[0];        XposedBridge.log(requestCode+"");//100        //如果不加判断,Xpose会Hook所有onRequestPermissionsResult,造成不好的影响        if(requestCode ==100){            String[] permissions = (String[]) param.args[1];            for (String permission:permissions) {                XposedBridge.log(permission); //android.permission.WRITE_EXTERNAL_STORAGE            }            int[] grantResults = (int[]) param.args[2];            for (int grantResult:grantResults) {                //拒绝-1, 允许0                XposedBridge.log(grantResult+"");                if(grantResult==-1){                    //如果不同意请求退出页面                    activity.finish();                    Toast.makeText(activity,"没有权限",Toast.LENGTH_SHORT).show();                    XposedBridge.log("退出了页面");                }else{                    //由于是异步的,所以之前的点击事件没有起作用,要同意之后才能起作用,所以在这里再重新调用它的点击事件                    //因为R.id.xx是xpose模块的ID,不是原HOOK的app的id,所以无法用activity.findViewById去找到按钮。                    //由于在之前hook了它的click方法,而click方法第一个参数就是view,所以能直接拿到                    v.callOnClick();                }            }        }    }

需要Hook的APP:

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                requestPermissionsSuccess();            }        });
    public void requestPermissionsSuccess() {        String sdcard_path = Environment.getExternalStorageDirectory().getAbsolutePath();        writeFileData(sdcard_path + File.separator+"x86"+ File.separator+"asddd.txt","你好");    }

如果没有sd卡写入权限是无法将文件写入的。

Example源码
Github Example

更多相关文章

  1. Android(安卓)Handler的机制和原理(二)
  2. 做好准备,让你的短信应用迎接Android(安卓)4.4(KitKat)
  3. 初学Android,使用Drawable资源之使用StateListDrawable资源(十三
  4. android通过反射代替R来获取控件对象
  5. Android权限获取机制与常见权限不足问题分析
  6. 百度地图开发-申请ak及相关配置
  7. Android(安卓)M WRITE_SETTINGS权限的一个BUG
  8. android内存--强弱软虚
  9. 关于Android中传递对象发现问题随笔

随机推荐

  1. Android的GridView控件点击图片变暗效果
  2. Android菜鸟笔记-获取设备信息
  3. Android应用程序线程消息循环模型分析(4)
  4. java.lang.ClassCastException: android.
  5. android中SOAP的anytype问题
  6. Android(安卓)图片资源的异步加载2
  7. Android源码去除状态栏
  8. android 获取当前手机的 DHCP 信息ip,ser
  9. 让Android(安卓)studio支持java8
  10. [Android]How to use FFmpeg to decode A