欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Android 绕过反射黑名单的方法

程序员文章站 2022-04-16 11:54:50
限制原理google 从 android p 开始引入了针对非公开 api 的限制,这一点可以从 native 相关的源码中找到限制的原理,从而从中找到解决办法,不过非必要原因不太建议去挑战这种限制,...

限制原理

google 从 android p 开始引入了针对非公开 api 的限制,这一点可以从 native 相关的源码中找到限制的原理,从而从中找到解决办法,不过非必要原因不太建议去挑战这种限制,毕竟不清楚在后续的版本中会不会做限制,维护起来挺麻烦的。

在 native 层有几个访问级别:

另外还有几个对应的响应级别:

这里介绍一下网上的一些解决方式,此外,还可以把我们调用了反射方法的类的类加载器设置为系统类加载器,这样就可以绕过 native 层的限制了。

系统类伪装

黑名单在系统中有一个 fn_caller_is_trusted 的条件:如果调用者是系统类,那么就允许被调用。即如果我们能以系统类的身份去反射,那么就能畅通无阻:

  1. 首先通过反射 api 拿到 getdeclaredmethod 方法。getdeclaredmethod 是 public 的,不存在问题;这个通过反射拿到的方法网上称之为元反射方法。
  2. 然后通过刚刚的元反射方法去反射调用 getdeclardmethod。这里我们就实现了以系统身份去反射的目的——反射相关的 api 都是系统类,因此我们的元反射方法也是被系统类加载的方法;所以我们的元反射方法调用的 getdeclardmethod 会被认为是系统调用的,可以反射任意的方法。

伪代码如下:

豁免条件

隐藏 api 的调用有「豁免」条件,即只要它是豁免的,则即使它在黑名单中,也会被放行。这种方式暴露给了 java 层,因此可以通过 vmruntime.sethiddenapiexemptions 方法来实现。再结合上面这个方法,我们只需要通过 「元反射」 来反射调用 vmruntime.sethiddenapiexemptions 就能将我们自己要使用的隐藏 api 全部都豁免掉了。另外系统在检查豁免时是通过方法签名进行前缀匹配的,而 java 方法签名都是 l 开头的,因此我们可以把直接传个 l 进去,那么所有的隐藏api全部被赦免了!

源码直接参考网上大佬的开源项目: freereflection

以上就是android 绕过反射黑名单的方法的详细内容,更多关于android 绕过反射黑名单的资料请关注其它相关文章!