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

    技术2026-08-13  18

    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

    Processed: 0.009, SQL: 10