加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

另一种绕过 Android P以上非果真API限定的步伐

发布时间:2019-03-17 22:59:19 所属栏目:业界 来源:佚名
导读:客岁宣布的 Android P上引入了针对非果真API的限定,对开拓者来说,这绝对是有史以来最重大的变革之一。前天 Google 宣布了 Android Q 的 Beta 版,越来越多的 API 被插手了黑名单,并且 Google 要求下半年 APP 必需 target 28,这意味着此刻的深灰名单也
副问题[/!--empirenews.page--]

客岁宣布的 Android P上引入了针对非果真API的限定,对开拓者来说,,这绝对是有史以来最重大的变革之一。前天 Google 宣布了 Android Q 的 Beta 版,越来越多的 API 被插手了黑名单,并且 Google 要求下半年 APP 必需 target 28,这意味着此刻的深灰名单也会见效;可以预见,在不久的未来,我们要跟大量的 API 说再会了。

另一种绕过 Android P以上非果真API限定的步伐

客岁我给出了一种绕过Android P对非SDK接口限定的简朴要领,履历证,这步伐在 Android Q 的 Beta 版上依然能正常行使。固然这个要领必要举办内存搜刮,理论上有也许失败,但现实上它曾在 VirtualXposed 和 太极 中获得了较为普及的验证,从未收到过因为反射失败而导致题目的反馈。并且据我所知,有多少用户量不少的 APP 在线上行使了我提供的 FreeReflection 库,想来应该也是没有题目的吧。

不外本日,我规划给出其它一种绕过限定的步伐。这个步伐今朝来说是最优方案,我小我私人行使了一个多月,不存在任何题目。

前次说明体系是怎样施加这个限定 的时辰,我们提到了几种方法,最终给出了一种修改 runtime flag 的步伐;个中我们提到,体系有一个 fn_caller_is_trusted 前提:假如挪用者是体系类,那么就应承被挪用。这是显而易见的,事实这些私有 API 就是给体系用的,假如体系本身都被拒绝了,这是在玩锤子呢?

也就是说,假如我们能以体系类的身份去反射,那么就能流畅无阻。题目是,我们怎样故「体系的身份去反射」呢?一种最常见的步伐是,我们本身写一个类,然后通过某种途径把这个类的 ClassLoader 配置为体系的 ClassLoader,再借助这个类去反射其他类。可是这里的「通过某种途径」依然要行使一些黑科技才气实现,与修改 flags / inline hook 无本质区别。

以体系类的身份去反射 有两个意思,1. 直接把我们本身酿成体系类;2. 借助体系类去挪用反射。我们一个个说明。

「直接把我们本身酿成体系类」这个方法有童鞋也许认为天方夜谭,APP 的类怎么也许成为体系类?可是,必然不要被本身的固有思想给范围,统统皆有也许!我们知道,对APP来说,所谓的体系类就是被 BootstrapClassLoader 加载的类,这个 ClassLoader 并非平凡的 DexClassLoader,因此我们无法通过插入 dex path的方法注入类。可是,Android 的 ART 在 Android O 上引入了 JVMTI,JVMTI 提供了将某一个类转换为 BootstrapClassLoader 中的类的要领!详细来说,我们写一个类袒露反射相干的接口,然后通过 JVMTI 提供的 AddToBootstrapClassLoaderSearch将此类插手 BootstrapClassLoader 就实现目标了。不外,JVMTI 要在 release 版本的 APP 上运行依然必要 Hack,以是这种途径与其他的黑科技无本质区别。

第二种要领,「借助体系的类去反射」也就是说,假如体系有一个要领systemMethod,这个systemMethod 去挪用反射相反的要领,那么systemMethod毋庸置疑会反射乐成。可是,我们从哪去找到这么一个要领给我们用?究竟上,我们不只能找到这样的要领,并且这个要领能辅佐我们挪用恣意的函数,那就是反射自己!也许你已经绕晕了,我表明一下:

起首,我们通过反射 API 拿到 getDeclaredMethod 要领。getDeclaredMethod 是 public 的,不存在题目;这个通过反射拿到的要领我们称之为元反射要领。

然后,我们通过方才反射拿到元反射要领去反射挪用 getDeclardMethod。这里我们就实现了以体系身份去反射的目标——反射相干的 API 都是体系类,因此我们的元反射要领也是被体系类加载的要领;以是我们的元反射要领挪用的 getDeclardMethod 会被以为是体系挪用的,可以反射恣意的要领。

伪代码如下:

  1. Method metaGetDeclaredMethod = 
  2.         Class.class.getDeclaredMethod("getDeclardMethod"); // 果真API,无题目 
  3. Method hiddenMethod = metaGetDeclaredMethod.invoke(hiddenClass, 
  4.         "hiddenMethod", "hiddenMethod参数列表"); // 体系类通过反射行使潜匿 API,搜查直接通过。 
  5. hiddenMethod.invoke // 正确找到 Method 直接反射挪用 

到这里,我们已经能通过「元反射」的方法去恣意获取潜匿要领可能潜匿 Field 了。可是,假如我们全部行使的潜匿要领都要这么干,那尚有点小贫困。在 上文中,我们其后发明,潜匿 API 挪用尚有「宽免」前提,详细代码如下:

  1. if (shouldWarn || action == kDeny) { 
  2.     if (member_signature.IsExempted(runtime->GetHiddenApiExemptions())) { 
  3.       action = kAllow; 
  4.       // Avoid re-examining the exemption list next time. 
  5.       // Note this results in no warning for the member, which seems like what one would expect. 
  6.       // Exemptions effectively adds new members to the whitelist. 
  7.       MaybeWhitelistMember(runtime, member); 
  8.       return kAllow; 
  9.     } 
  10.     // 略     

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读