美文网首页Android进阶之路AndroidAndroid相关
小花招解决Android 9 Pie 不能反射隐藏API限制

小花招解决Android 9 Pie 不能反射隐藏API限制

作者: Mr云台 | 来源:发表于2021-03-24 21:28 被阅读0次

    一、概述

    Android 9开始,系统会阻止开发者调用非SDKAPI,比如ActivityThread.currentActivityThread(),那有没有办法绕过这些限制呢?

    首先说一下Google限制调用的原理:

    就一句话:如果不是系统类,且API处于黑名单,禁止调用。

    依据上述原理,可以破坏第一个条件,即通过系统类的身份去调用隐藏API。

    二、小妙招

    请看如下工具类,我们通过反射去获取Class.class类上getDeclaredMethod方法,获取到的Method可以称为
    “元反射方法”,通过“元反射方法” 去调用隐藏API,就意味着调用者是java.lang.Class,这个类属于系统类,可以正常调用!!!

    下面本人写的工具类在Android 10上亲测有效,拿走不谢,哈哈!

    如果对你有帮助,顺手点个赞哦!

    /**
     * @author yuntai
     * @date 2021/3/24
     * <p>
     * Description
     */
    class HookUtils {
    
        /**
         * 两次反射,代理Class.getDeclaredMethod方法
         */
        public static Method getDeclaredMethod(Class<?> cls, String name, Class<?>... parameterTypes) {
            try {
                Method dMethod = Class.class.getDeclaredMethod("getDeclaredMethod", String.class, Class[].class);
    
                return (Method) dMethod.invoke(cls, name, parameterTypes);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 两次反射,代理Class.getDeclaredField方法
         */
        public static Field getDeclaredField(Class<?> cls, String name) {
            try {
                Method dMethod = Class.class.getDeclaredMethod("getDeclaredField", String.class);
    
                return (Field) dMethod.invoke(cls, name);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 两次反射,代理Field.get方法
         */
        public static Object fieldGetValue(Field field, Object obj) {
            try {
                Method dMethod = HookUtils.getDeclaredMethod(Field.class,"get", Object.class);
                field.setAccessible(true);
                return obj == null ? dMethod.invoke(field, obj) : dMethod.invoke(field, obj);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 两次反射,代理Field.set方法
         */
        public static void fieldSetValue(Field field, Object obj, Object value) {
            try {
                Method dMethod = HookUtils.getDeclaredMethod(Field.class,"set", Object.class, Object.class);
                field.setAccessible(true);
                dMethod.invoke(field, obj, value);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }
    

    相关文章

      网友评论

        本文标题:小花招解决Android 9 Pie 不能反射隐藏API限制

        本文链接:https://www.haomeiwen.com/subject/gtckhltx.html