virtualapp-Android P隐藏API的限制源码及绕过方案

引言

Andriod P开始,对应用能使用的非 SDK 接口实施了限制,具体可参考官方简介:https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces?hl=zh-cn

黑名单、灰名单和白名单
在这里插入图片描述

当您的应用尝试访问黑名单中的非 SDK 接口时可能会出现的预期异常:

在这里插入图片描述

内部API限制代码分析

Android P限制APP对内部API的调用,而内部API只能通过反射或JNI间接调用,那么限制机制必然是在反射和JNI方法调用链中插入判断逻辑。

这里以Class.java中的反射获取函数的getDeclaredMethod()为例来展开说明,其他反射或JNI调用也是类似的逻辑。

代码参考自AOSP中:Android-9.0.0_r1\bin\Work\libcore\ojluni\src\main\java\java\lang\Class.java
在这里插入图片描述
==》getMethod(String name, Class<?>[] parameterTypes, boolean recursivePublicMethods)中第二个参数表示是否为public函数,上面传的是false, 继续看下面的代码:
在这里插入图片描述
==》因为recursivePublicMethods传入的为false,所以会调用getDeclaredMethodInternal,这是一个native函数
在这里插入图片描述
==》跳转到NDK的Class_getDeclaredMethodInternal
代码参考自AOSP中:Android-9.0.0_r1\Android-9.0.0_r1\bin\Work\art\runtime\native\java_lang_Class.cc
在这里插入图片描述
==》跳转到ShouldBlockAccessToMember
在这里插入图片描述
==》关键函数hiddenapi::GetMemberAction
代码参考自AOSP中:Android-9.0.0_r1\Android-9.0.0_r1\bin\Work\art\runtime\hidden_api.h
在这里插入图片描述
这里可以看出绕过隐藏API的方式有多种
可以从GetHiddenApiAccessFlags入手,也可以从GetMemberActionImpl入手

enum Action {
  kAllow,
  kAllowButWarn,
  kAllowButWarnAndToast,
  kDeny
};

==》关键函数1GetHiddenApiAccessFlags
在这里插入图片描述
==》关键函数2GetMemberActionImpl
在这里插入图片描述

绕过内部API限制

cp命令拷贝出libart.so,没有真机,就使用模拟器中的libart.so

C:\Users\Administrator>adb shell
generic_x86:/ # cd /system/
2|generic_x86:/system # cd ./lib
127|generic_x86:/system/lib # cp ./libart.so /sdcard/
127|generic_x86:/ $ exit
C:\Users\Administrator>adb pull /sdcard/libart.so
/sdcard/libart.so: 1 file pulled. 50.6 MB/s (8064080 bytes in 0.152s)

使用IDA打开,从前面我们可以看出,关键函数是hiddenapi::GetMemberAction,IDA搜索hiddenapi::GetMemberAction
在这里插入图片描述
跳转到函数体:
在这里插入图片描述
hook这两个函数就好了,记得要取真实的符号名字,右键Edit function,就可以看到Name of function
在这里插入图片描述
其中detail::GetMemberActionImpl有两个,分别对应符号名字为_ZN3art9hiddenapi6detail19GetMemberActionImplINS_8ArtFieldEEENS0_6ActionEPT_NS_20HiddenApiAccessFlags7ApiListES4_NS0_12AccessMethodE
_ZN3art9hiddenapi6detail19GetMemberActionImplINS_9ArtMethodEEENS0_6ActionEPT_NS_20HiddenApiAccessFlags7ApiListES4_NS0_12AccessMethodE

VA做的操作就是把这几个关键函数做了hook

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值