Android 绕过反射黑名单的方法
程序员文章站
2022-04-16 11:54:50
限制原理google 从 android p 开始引入了针对非公开 api 的限制,这一点可以从 native 相关的源码中找到限制的原理,从而从中找到解决办法,不过非必要原因不太建议去挑战这种限制,...
限制原理
google 从 android p 开始引入了针对非公开 api 的限制,这一点可以从 native 相关的源码中找到限制的原理,从而从中找到解决办法,不过非必要原因不太建议去挑战这种限制,毕竟不清楚在后续的版本中会不会做限制,维护起来挺麻烦的。
在 native 层有几个访问级别:
另外还有几个对应的响应级别:
这里介绍一下网上的一些解决方式,此外,还可以把我们调用了反射方法的类的类加载器设置为系统类加载器,这样就可以绕过 native 层的限制了。
系统类伪装
黑名单在系统中有一个 fn_caller_is_trusted 的条件:如果调用者是系统类,那么就允许被调用。即如果我们能以系统类的身份去反射,那么就能畅通无阻:
- 首先通过反射 api 拿到 getdeclaredmethod 方法。getdeclaredmethod 是 public 的,不存在问题;这个通过反射拿到的方法网上称之为元反射方法。
- 然后通过刚刚的元反射方法去反射调用 getdeclardmethod。这里我们就实现了以系统身份去反射的目的——反射相关的 api 都是系统类,因此我们的元反射方法也是被系统类加载的方法;所以我们的元反射方法调用的 getdeclardmethod 会被认为是系统调用的,可以反射任意的方法。
伪代码如下:
豁免条件
隐藏 api 的调用有「豁免」条件,即只要它是豁免的,则即使它在黑名单中,也会被放行。这种方式暴露给了 java 层,因此可以通过 vmruntime.sethiddenapiexemptions 方法来实现。再结合上面这个方法,我们只需要通过 「元反射」 来反射调用 vmruntime.sethiddenapiexemptions 就能将我们自己要使用的隐藏 api 全部都豁免掉了。另外系统在检查豁免时是通过方法签名进行前缀匹配的,而 java 方法签名都是 l 开头的,因此我们可以把直接传个 l 进去,那么所有的隐藏api全部被赦免了!
源码直接参考网上大佬的开源项目: freereflection。
以上就是android 绕过反射黑名单的方法的详细内容,更多关于android 绕过反射黑名单的资料请关注其它相关文章!
上一篇: Android中切换到主线程执行的方法