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

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

2018-5-30 03:12
9487

     安卓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.     当前研究与问题

在网上,有一篇不错的文章来阐述这个问题,链接为:3baK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0M7q4)9J5k6i4N6W2K9i4S2A6L8W2)9J5k6i4q4I4i4K6u0W2j5$3!0E0i4K6u0r3M7#2)9J5c8X3t1I4M7%4g2$3f1i4W2s2e0%4M7J5K9q4k6$3k6Y4g2X3e0@1q4K9x3r3N6Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0k6Q4z5e0k6Q4z5o6N6Q4c8e0N6Q4b7f1u0Q4b7e0m8Q4c8e0W2Q4z5f1c8Q4z5f1g2Q4c8e0g2Q4b7U0S2Q4b7U0S2Q4c8e0c8Q4b7U0S2Q4z5p5c8Q4c8e0W2Q4z5e0c8Q4z5e0W2Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0c8Q4b7V1c8Q4z5o6k6Q4c8e0S2Q4b7f1k6Q4b7e0g2Q4c8e0k6Q4z5e0k6Q4z5o6N6Q4c8e0N6Q4b7f1u0Q4b7e0m8Q4c8e0g2Q4b7f1c8Q4z5e0S2Q4c8e0g2Q4z5f1y4Q4b7e0S2Q4c8e0c8Q4b7V1u0Q4b7e0g2Q4c8e0c8Q4b7U0S2Q4z5p5u0Q4c8e0g2Q4z5o6N6Q4b7e0m8Q4c8e0c8Q4b7U0S2Q4b7f1q4Q4c8e0W2Q4z5e0N6Q4b7f1g2Q4c8e0W2Q4b7e0u0Q4z5e0S2Q4c8f1k6Q4b7V1y4Q4z5f1p5`.

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

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

3.     貌似没有源码案例

 

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

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

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

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


[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!

上传的附件:
收藏
免费 1
支持
分享
最新回复 (14)
雪    币: 4222
活跃值: (2674)
能力值: ( 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,不如直接使用57cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6S2L8X3N6Y4M7X3q4&6N6h3c8A6i4K6u0r3j5h3&6V1M7X3!0A6k6q4)9J5k6r3S2A6k6r3c8W2L8W2)9J5k6r3q4H3K9g2!0q4y4W2)9&6c8q4!0m8y4g2!0q4y4g2!0n7c8g2)9&6y4#2!0q4y4#2!0m8c8g2)9^5x3q4!0q4y4g2)9^5c8q4)9&6y4g2!0q4x3#2)9^5x3q4)9^5x3R3`.`.
但问题是,Android  P不仅仅对反射存在限制,同样限制了静态链接,这种方式显然绕不过。
2018-5-30 09:51
0
雪    币: 303
活跃值: (177)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
其实预览版代码我看了,就是个判断而已,然后加个警告,不要管什么限制,只在乎哪一个判断,还有andhook其实模拟器支持有些小问题喔,VMRuntime.getRuntime().hasUsedHiddenApi()是一个native方法,具体见dalvik/system/VMRuntime.java#265,其实绕过大概有3种方法
2018-5-30 10:15
0
雪    币: 303
活跃值: (177)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6
假如判断都是不拥有私有API的,后面逻辑不就都废了,inlinehook直接上,而且,修改app_process也很麻烦,既然都要替换系统文件了,何不换系统jar包
2018-5-30 10:17
0
雪    币: 303
活跃值: (177)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
7
还有这个办法呢,和360公众号发的文章原理一样,如果我不行,他也不行,哈哈,反正我没手机
2018-5-30 10:20
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
preview1和2在检测逻辑上有不少变化,现阶段得出不同结论也属正常。
b02K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6d9M7s2u0G2M7q4)9J5c8X3q4G2M7%4m8Q4y4h3k6H3L8r3q4@1k6X3!0J5L8g2)9#2k6X3q4J5N6q4)9J5c8X3u0D9L8$3u0Q4x3V1k6E0j5i4y4@1k6i4u0Q4x3V1k6@1L8$3!0D9M7#2)9J5c8Y4k6W2M7X3W2V1k6i4S2Q4x3V1k6Z5K9h3c8V1k6h3&6Q4y4h3k6S2M7r3W2Q4y4h3k6X3K9h3&6V1k6i4u0Q4x3X3g2Z5i4K6t1K6e0o6x3@1
b78K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6d9M7s2u0G2M7q4)9J5c8X3q4G2M7%4m8Q4y4h3k6H3L8r3q4@1k6X3!0J5L8g2)9#2k6X3q4J5N6q4)9J5c8X3y4G2L8h3#2A6N6q4)9J5c8U0f1K6y4r3p5H3j5e0p5^5x3o6N6S2y4r3q4S2y4K6M7$3j5U0c8T1k6r3k6S2z5o6V1@1k6e0f1$3y4U0p5J5y4r3t1&6z5o6V1%4z5h3p5`.
2018-5-30 15:53
0
雪    币: 303
活跃值: (177)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
学习了
2018-5-30 17:11
0
雪    币: 10
活跃值: (1925)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
限制太大了,怎么叫没有限制呢?
2018-5-30 19:37
0
雪    币: 303
活跃值: (177)
能力值: ( 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
雪    币: 2804
活跃值: (1746)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
rrrfff 实质是compileOnly,不如直接使用423K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6S2L8X3N6Y4M7X3q4&6N6h3c8A6i4K6u0r3j5h3&6V1M7X3!0A6k6q4)9J5k6r3S2A6k6r3c8W2L8W2)9J5k6r3q4H3K9g2!0q4y4W2)9&6c8q4!0m8y4g2!0q4y4g2!0n7c8g2)9&6y4#2!0q4y4#2!0m8c8g2)9^5x3q4!0q4y4g2)9^5c8q4)9&6y4g2!0q4x3#2)9^5x3q4)9^5x3R3`.`. 但问题是,Android P不仅仅对反射存在限制 ...
隐藏API有其他问题吧
2018-8-31 15:51
0
雪    币: 22
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
能不能apk改之理提供下,现在搜索到的链接都失效了。
2019-7-8 22:02
0
游客
登录 | 注册 方可回帖
返回