时间:2021-05-21
Google 从 Android P 开始引入了针对非公开 API 的限制,这一点可以从 Native 相关的源码中找到限制的原理,从而从中找到解决办法,不过非必要原因不太建议去挑战这种限制,毕竟不清楚在后续的版本中会不会做限制,维护起来挺麻烦的。
在 Native 层有几个访问级别:
class HiddenApiAccessFlags { public: enum ApiList { kWhitelist = 0, kLightGreylist, kDarkGreylist, kBlacklist, };}另外还有几个对应的响应级别:
enum Action { kAllow, //通过 kAllowButWarn, //通过,但日志警告 kAllowButWarnAndToast, //通过,且日志警告和弹窗 kDeny //拒绝访问};这里介绍一下网上的一些解决方式,此外,还可以把我们调用了反射方法的类的类加载器设置为系统类加载器,这样就可以绕过 Native 层的限制了。
黑名单在系统中有一个 fn_caller_is_trusted 的条件:如果调用者是系统类,那么就允许被调用。即如果我们能以系统类的身份去反射,那么就能畅通无阻:
伪代码如下:
// 公开API,无问题Method metaGetDeclaredMethod = Class.class.getDeclaredMethod("getDeclardMethod");// 系统类通过反射使用隐藏 API,检查直接通过。Method hiddenMethod = metaGetDeclaredMethod.invoke(hiddenClass, "hiddenMethod", "hiddenMethod参数列表");// 正确找到 Method 直接反射调用hiddenMethod.invoke隐藏 API 的调用有「豁免」条件,即只要它是豁免的,则即使它在黑名单中,也会被放行。这种方式暴露给了 Java 层,因此可以通过 VMRuntime.setHiddenApiExemptions 方法来实现。再结合上面这个方法,我们只需要通过 「元反射」 来反射调用 VMRuntime.setHiddenApiExemptions 就能将我们自己要使用的隐藏 API 全部都豁免掉了。另外系统在检查豁免时是通过方法签名进行前缀匹配的,而 Java 方法签名都是 L 开头的,因此我们可以把直接传个 L 进去,那么所有的隐藏API全部被赦免了!
源码直接参考网上大佬的开源项目: FreeReflection。
public final class BootstrapClass { private static final String TAG = "BootstrapClass"; private static Object sVmRuntime; private static Method setHiddenApiExemptions; static { if (SDK_INT >= Build.VERSION_CODES.P) { try { Method forName = Class.class.getDeclaredMethod("forName", String.class); Method getDeclaredMethod = Class.class.getDeclaredMethod("getDeclaredMethod", String.class, Class[].class); Class<?> vmRuntimeClass = (Class<?>) forName.invoke(null, "dalvik.system.VMRuntime"); Method getRuntime = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "getRuntime", null); setHiddenApiExemptions = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "setHiddenApiExemptions", new Class[]{String[].class}); sVmRuntime = getRuntime.invoke(null); } catch (Throwable e) { Log.w(TAG, "reflect bootstrap failed:", e); } } } /** * make the method exempted from hidden API check. * * @param method the method signature prefix. * @return true if success. */ public static boolean exempt(String method) { return exempt(new String[]{method}); } /** * make specific methods exempted from hidden API check. * * @param methods the method signature prefix, such as "Ldalvik/system", "Landroid" or even "L" * @return true if success */ public static boolean exempt(String... methods) { if (sVmRuntime == null || setHiddenApiExemptions == null) { return false; } try { setHiddenApiExemptions.invoke(sVmRuntime, new Object[]{methods}); return true; } catch (Throwable e) { return false; } } /** * Make all hidden API exempted. * * @return true if success. */ public static boolean exemptAll() { return exempt(new String[]{"L"}); }}以上就是Android 绕过反射黑名单的方法的详细内容,更多关于Android 绕过反射黑名单的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
手查看黑名单的方法是: 1、找到想要加入黑名单的人的作品,点击进去之后,选择上方的三点图标。 2、弹出框之后,点击加入黑名单。 3、加入黑名单之后,我们想
文件后缀名绕过。一种主要是基于黑名单检测技术,如果检测的时候不忽略大小写,那么可以改变后缀名的大小写绕过;其次还有被黑名单表中如果忽略了某些后缀;最后包括能被解
本文实例讲述了Android编程中黑名单的实现方法。分享给大家供大家参考,具体如下:说明:由于挂断电话androidapi不是对外开放的,所以需要使用反射的方法
路由器的黑名单(解除黑名单方法:浏览器输入luyou.360.cn,登录后进入网页管理界面,点击谁在上网—上网黑名单,将设备移出黑名单)。网卡驱动版
花椒直播怎么把人移出黑名单?花椒直播把人移出黑名单的方法?花椒直播是非常出名的直播软件,我们有时候会把人放进黑名单,但是放进黑名单怎么移出来呢花椒直播怎么把