另一种绕过 Android P以上非公开API限制的办法
只要 IsExempted 要领返回 true,就算这个要领在黑名单中,依然会被放行然后应承被挪用。我们再调查一下IsExempted要领:
继承跟踪转达进来的参数 runtime->GetHiddenApiExemptions() 发明这玩意儿也是 runtime 内里的一个参数,既然云云,我们可以一不做二不休,模拟修改 runtime flag 的方法直接修改 hidden_api_exemptions_ 也能绕已往。但假如我们继承跟踪下去,会有个风趣的发明:这个API 竟然是袒露到 Java 层的,有一个对应的 VMRuntime.setHiddenApiExemptions Java要领;也就是说,只要我们通过 VMRuntime.setHiddenApiExemptions 配置下宽免前提,我们就能舒畅滴行使反射了。 再团结上面这个要领,我们只必要通过 「元反射」来反射挪用 VMRuntime.setHiddenApiExemptions 就能将我们本身要行使的潜匿 API 所有都宽免掉了。更进一步,假如我们再调查下上面的 IsExempted 要领内里挪用的 DoesPrefixMatch,发明这玩意儿在对要领署名举办前缀匹配;童鞋们,我们全部Java要领类的署名都是以 L开头啊!假如我们把直接传个 L进去,全部的潜匿API所有被赦宥了! 具体代码在这里:https://github.com/tiann/FreeReflection 理论上讲,这个方案不存在兼容性题目。纵然 ROM 删掉了 setHiddenApiExemptions 要领,我们依然可以用「元反射」的方法去反射潜匿API,而且全部的代码加起来不高出30行!虽然,假如 Google 继承改造验证潜匿API挪用的要领,这个方法也许会失效;可是今朝的机制没有题目。 文章的最后,我想说的是,本文的目标不是决心去绕过限定。不给思想设限、不给人生设限,才会有更多也许。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |