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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
VirtualApp是一个开源的、提供虚拟化应用的框架,其源码可以帮助我们了解和学习虚拟化技术的实现原理。 VirtualApp源码中主要包含了以下几个方面的内容: 1. Hook技术:VirtualApp使用了Xposed和Substrate等Hook框架,通过动态修改运行时的Java方法,实现对目标应用的API调用进行拦截和替换。通过Hook技术,VirtualApp能够在虚拟环境中替换目标应用的敏感操作,实现对应用的隔离和保护。 2. 虚拟环境创建:VirtualApp源码实现了一个独立的虚拟环境,可以在这个环境中安装和运行目标应用。这个虚拟环境通过Hook技术对系统运行时的一些特殊API进行拦截和修改,使得目标应用在虚拟环境中运行时能够调用到虚拟环境提供的资源、服务和功能。 3. 进程隔离:VirtualApp使用了Linux的Namespace和Cgroup等技术,实现了进程的隔离。在虚拟环境中运行的应用与宿主系统的应用是完全独立的,互不干扰。这种隔离可以保护宿主系统的安全,同时也可以保护虚拟环境中的应用不受外部环境的干扰。 4. 文件系统隔离:VirtualApp通过Hook技术对文件操作API进行拦截和修改,实现了虚拟环境与宿主系统的文件系统隔离。在虚拟环境中运行的应用只能访问到虚拟环境的文件系统,无法直接访问宿主系统的文件系统,从而保护了宿主系统的文件安全。 总的来说,VirtualApp源码实现了虚拟化应用的关键功能,如Hook技术、虚拟环境创建、进程隔离和文件系统隔离等。通过阅读和学习VirtualApp源码,我们可以深入了解和掌握虚拟化技术的实现原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值