突破Android P(Preview 1)对调用隐藏API限制的方法

突破Android P(Preview 1)对调用隐藏API限制的方法

一.概要

本文基于对Android P(Preview 1)的源码分析,实现了三种绕过对调用隐藏API限制的方法,有效性均已得到验证,能够成功调用系统隐藏API。

二.限制原理

首先抛开Android P的具体实现过程,安卓系统要实现限制用户代码调用系统隐藏API,至少要做以下两个区分:

  1. 必须区分一个Method(或Field)对用户代码是隐藏的还是公开的。只有隐藏的才需要进行限制。
  2. 必须区分调用者的身份:是用户代码调用的还是系统代码(例如Activity类)调用的。只有用户代码调用时才需要进行限制。

具体到Android P的代码实现,它会在所有通过反射方式和JNI方式获取Method和Field的地方调用以下函数判断是否用户代码调用了系统的隐藏API(位于art/runtime/hidden_api.h),如果这个函数返回true,那么说明用户代码调用了系统的隐藏API,Android P(Preview1)会通过log发出警告,用户代码仍然能够获取到正确的Method或Field,在后续版本中获取到的Method或Field极有可能为空。
这里写图片描述
那么它是如何进行上述两个区分的呢?
1. 每个Method(或Field)都有一个对应的access_flags_(uint32_t类型),原本这个值通过一些特定位(bit)表明其属性(public,private,static等),但是还有一些保留的未定义的位,Android P就利用未定义的几个位,表明这个Method(或Field)是对用户代码隐藏的还是公开

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值