首页
社区
课程
招聘
[原创]简单暴力非provide式突破Android P对调用隐藏API限制的方法
发表于: 2018-5-30 03:12 9100

[原创]简单暴力非provide式突破Android P对调用隐藏API限制的方法

2018-5-30 03:12
9100

     安卓9.0(Android P)悄然发生,各大加固厂商也于前段期发布了兼容安卓9.0的公告,为什么对安卓9.0那么敏感?因为谷歌在安卓9.0里限制了反射的使用。以前我们可以随意反射使用私有(隐藏)系统API的时代,似乎结束了。众所周知,安卓安全开发中(无论加固还是脱壳机等),反射是至关重要的,很多朋友感到了一丝担忧。其实,反射不能用,不代表正向不能用;正向不能直接导入,不代表自己不能伪造导入;伪造导入编译也不代表必须按自己伪造的运行,而可以逆向修改后运行。

     摘要:本文主要阐述了,如何利用本人所研究的“逆向开发”技术(一种正向和逆向相结合的技术,产品生成同于基于逆向和开发)来实现正向调用我们平时喜欢用反射使用的安卓系统隐藏API,由此证明该技术具有极大的实用性。核心思想其实在“E4A开发xposed插件”中早已形成。

    本文说明与开发测试环境概述:

声明:因本人设备环境有限,也没有安卓9.0手机,实验是在逍遥模拟器上进行的,至少可以当正向调用系统隐藏API的一个范例。案例为:正向调用系统隐藏API 获取当前运行APP的application,并打印出application类名。

开发环境:AS2.3.3+,SDK26

测试环境:逍遥模拟器(安卓5.1)

 

1.     从反射调用获取application说起

在之前,当我们需要获取application时,我们第一时间想到的就是反射,大概有两种方法,我们这里展示通过反射调用android.app.ActivityThread类的getApplication方法来获取的代码。和简单的反射调用相比,我们发现多了一步,获取ActivityThread对象必须先运行currentActivityThread方法,参数是个null。代码:

我们可以得出,如果是正向调用,其实更为简单,先调用currentActivityThread方法,再调用getApplication方法。

 

 

2.     当前研究与问题

在网上,有一篇不错的文章来阐述这个问题,链接为:https://mp.weixin.qq.com/s/b1suvQyGOw2hVvfufOAZ0g,文章非常不错,但该文章存在以下几个问题:

1.     方法一需要新建依赖module,并需要provide,而对于高版本AndroidStudio3.0以上,好像对该方式有所限制;

2.     方法二、方法三过于繁琐,一般非安全开发者几乎是看不懂;

3.     貌似没有源码案例

 

3.简单正向调用隐藏API(正向+逆向-逆向开发!)

首先,我们新建一个AS工程,建好后,不要急于写代码,而是打开源码所在路径的文件夹,新建ActivityThread.java文件。

回到AS开发环境,对ActivityThread.java写代码,需要用到该类的什么函数,就声明什么函数,由于这个类其实是伪造的,我们最终只是为了有这些代码,而交给系统内的对应类和函数运行,因此返回值无所谓,就写为return null。如图:

这里可能很多人有疑问,为什么方法一个写了静态,一个又不是静态,怎么解释呢?如果要仿写,当然和系统源码声明函数的情况一致是最好了。其实原因看代码就可以明白,这个类必然需要动态声明一下的(getApplication就可以调用了),而这个类声明又是有些不同的,不是直接new xxx,而是要通过本身的currentActivityThread方法调用,因此要是静态。代码(如果还是没有看明白,还是参考反射调用的逻辑):


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 1
支持
分享
最新回复 (14)
雪    币: 3429
活跃值: (1566)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
编译成smali后  修改smali语法  再重新打包!
2018-5-30 09:05
0
雪    币: 5
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这种方式应该不行了吧
2018-5-30 09:38
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
实质是compileOnly,不如直接使用https://github.com/anggrayudi/android-hidden-api来得简单。
但问题是,Android  P不仅仅对反射存在限制,同样限制了静态链接,这种方式显然绕不过。
2018-5-30 09:51
0
雪    币: 303
活跃值: (179)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
其实预览版代码我看了,就是个判断而已,然后加个警告,不要管什么限制,只在乎哪一个判断,还有andhook其实模拟器支持有些小问题喔,VMRuntime.getRuntime().hasUsedHiddenApi()是一个native方法,具体见dalvik/system/VMRuntime.java#265,其实绕过大概有3种方法
2018-5-30 10:15
0
雪    币: 303
活跃值: (179)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6
假如判断都是不拥有私有API的,后面逻辑不就都废了,inlinehook直接上,而且,修改app_process也很麻烦,既然都要替换系统文件了,何不换系统jar包
2018-5-30 10:17
0
雪    币: 303
活跃值: (179)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
7
还有这个办法呢,和360公众号发的文章原理一样,如果我不行,他也不行,哈哈,反正我没手机
2018-5-30 10:20
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
preview1和2在检测逻辑上有不少变化,现阶段得出不同结论也属正常。
https://github.com/Rprop/aosp_platform_art/blob/master/tools/veridex/hidden_api_finder.h#L34
https://github.com/Rprop/aosp_platform_art/commit/534a0a1807a4aa776b4bdfa894e566124b98979a
2018-5-30 15:53
0
雪    币: 303
活跃值: (179)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
学习了
2018-5-30 17:11
0
雪    币: 12
活跃值: (1075)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
限制太大了,怎么叫没有限制呢?
2018-5-30 19:37
0
雪    币: 303
活跃值: (179)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
11
这就看你怎么看了呗,如果你只看P1,不看P2,或者就把它当成低版本正向调用API隐藏函数的例子,看你角度
2018-5-30 20:18
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
2018-5-30 23:07
0
雪    币: 2714
活跃值: (1611)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
rrrfff 实质是compileOnly,不如直接使用https://github.com/anggrayudi/android-hidden-api来得简单。 但问题是,Android P不仅仅对反射存在限制 ...
隐藏API有其他问题吧
2018-8-31 15:51
0
雪    币: 22
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
能不能apk改之理提供下,现在搜索到的链接都失效了。
2019-7-8 22:02
0
游客
登录 | 注册 方可回帖
返回
//