温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

绕过Android P以上非公开API限制的办法是什么

发布时间:2021-12-18 16:14:01 来源:亿速云 阅读:202 作者:iii 栏目:移动开发

这篇文章主要介绍“绕过Android P以上非公开API限制的办法是什么”,在日常操作中,相信很多人在绕过Android P以上非公开API限制的办法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”绕过Android P以上非公开API限制的办法是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

首先,我们通过反射 API 拿到 getDeclaredMethod 方法。getDeclaredMethod 是 public  的,不存在问题;这个通过反射拿到的方法我们称之为元反射方法。

然后,我们通过刚刚反射拿到元反射方法去反射调用 getDeclardMethod。这里我们就实现了以系统身份去反射的目的——反射相关的 API  都是系统类,因此我们的元反射方法也是被系统类加载的方法;所以我们的元反射方法调用的 getDeclardMethod  会被认为是系统调用的,可以反射任意的方法。

伪代码如下:

Method metaGetDeclaredMethod =         Class.class.getDeclaredMethod("getDeclardMethod"); // 公开API,无问题 Method hiddenMethod = metaGetDeclaredMethod.invoke(hiddenClass,         "hiddenMethod", "hiddenMethod参数列表"); // 系统类通过反射使用隐藏 API,检查直接通过。 hiddenMethod.invoke // 正确找到 Method 直接反射调用

到这里,我们已经能通过「元反射」的方式去任意获取隐藏方法或者隐藏 Field 了。但是,如果我们所有使用的隐藏方法都要这么干,那还有点小麻烦。在  上文中,我们后来发现,隐藏 API 调用还有「豁免」条件,具体代码如下:

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

只要 IsExempted 方法返回 true,就算这个方法在黑名单中,依然会被放行然后允许被调用。我们再观察一下IsExempted方法:

bool MemberSignature::IsExempted(const std::vector<std::string>& exemptions) {   for (const std::string& exemption : exemptions) {     if (DoesPrefixMatch(exemption)) {       return true;     }   }   return false; }

继续跟踪传递进来的参数 runtime->GetHiddenApiExemptions() 发现这玩意儿也是 runtime  里面的一个参数,既然如此,我们可以一不做二不休,仿照修改 runtime flag 的方式直接修改 hidden_api_exemptions_  也能绕过去。但如果我们继续跟踪下去,会有个有趣的发现:这个API 竟然是暴露到 Java 层的,有一个对应的  VMRuntime.setHiddenApiExemptions Java方法;也就是说,只要我们通过  VMRuntime.setHiddenApiExemptions 设置下豁免条件,我们就能愉快滴使用反射了。

再结合上面这个方法,我们只需要通过 「元反射」来反射调用 VMRuntime.setHiddenApiExemptions 就能将我们自己要使用的隐藏  API 全部都豁免掉了。更进一步,如果我们再观察下上面的 IsExempted 方法里面调用的  DoesPrefixMatch,发现这玩意儿在对方法签名进行前缀匹配;童鞋们,我们所有Java方法类的签名都是以 L开头啊!如果我们把直接传个  L进去,所有的隐藏API全部被赦免了!

到此,关于“绕过Android P以上非公开API限制的办法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI