首页
社区
课程
招聘
[原创]新姿势绕过应用的ROOT检测
发表于: 2021-11-15 12:46 48960

[原创]新姿势绕过应用的ROOT检测

2021-11-15 12:46
48960

最近一直在研究国企,更多的是银行相关的应用,发现几乎所有的应用都引入了ROOT检测机制,通过数次逆向分析ROOT检测的实现和尝试绕过检测机制,也发现了不少的乐趣。除此之外呢,由于疫情昨日接到防疫办的电话,通知居家隔离14天,也正因为这一突发情况让我暂时无法静下心来工作。今天也趁着时间比较富裕,分享一篇小文来打发下时间。

关于安卓手机的ROOT,相信大部分人都不会陌生。在手机没有ROOT之前,我们只能作为一个使用者来用这个手机,需要在系统的约束下进行程序的安装和部分功能的使用。而ROOT之后的设备,对于我们来说有大有可为了,相当于我们可以获取最高的用户权限,从而卸载系统应用、定制化UI等各种骚操作便有了实现的可能。当然,ROOT之后的手机对于应用和用户来说都是极其危险的。

在前面提到了,ROOT之后的手机对于应用和用户来说都非常危险。那么ROOT检测的意义便是保护应用和用户,以免因为手机被ROOT而受到危害。我们可以猜测一下ROOT手机的原因,总的来说可以分为三类:个性化、安全研究、攻击行为。设想一下,为了追求个性化而去ROOT手机万一操作不慎删除一些关键文件或者卸载了一些必要的应用,很可能会导致系统不可用,造成不可挽回的损失。而对于安全研究来说,由于该需求的特殊性暂不考虑其危害性,毕竟研究的目的就是为了保障安全嘛。至于攻击行为,这一类别的名字已经告诉了我们有多么的危险。由于ROOT之后的手机允许获取最高用户权限,那么攻击者可以将目标应用运行在ROOT之后的手机上,从而可以越权访问应用的私有数据;除此之外,目前主流的Hook框架如frida、xposed等在ROOT手机上更是如鱼得水。ROOT检测存在的意义便是及时的发现应用所运行的环境是一个被ROOT后的手机、是一个不安全的运行环境,为了保障应用的安全运行,保护数据不被窃取、篡改,从而采取一系列的防护措施。

通过对部分应用的ROOT检测机制进行逆向分析,以及查阅相关资料发现一些事情。各应用ROOT检测机制没有相对统一的标准,具体表现在检查内容、处置方式等方面,下面是我整理的一些常用的检测方法:
1、检查常用目录是否存在su
2、使用which命令查看是否存在su
3、主动申请root权限
4、执行busybox
5、访问私有目录,如/data目录,查看读写权限
6、读取build.prop中关键属性,如ro.build.tags和ro.build.type
7、检查市面主流的模拟器
8、检测frida、xposed等Hook框架的特征

上面便是我整理的各种应用主流的检测方法,目前看来绝大多数的应用都是对上面几个检测方法组合使用,甚至有很多只会实现其中的一项或者两项。另外,上面的方法也没有囊括所有的可能,比如有些应用还会检测“面具”或者Superuser.apk等是否存在来进行ROOT检测。总结来说,目前主流的ROOT检测就是对ROOT之后的手机独有的一些特征进行验证,如特征文件是否存在、是否存在越权、关键属性是否被修改等等。

检测到手机被ROOT之后如何处置也是一个重要的问题,目前看来主要有两种处置手段:其一是发现即摧毁,顾名思义就是检测到ROOT设备之后不允许应用正常运行;另外一种则是允许应用运行,但是切换与后台服务器的交互。接下来,咱们对这两种处置手段进行简单的比较:
1、第一种处置,检测到ROOT设备之后如何停止应用的运行?根据工信部的监管要求还不能直接让应用直接退出,因此现在一般的做法就是通过弹窗、Toast等以文字描述提示用户当前手机被root了存在风险,由用户决定是否退出或者延时几秒后退出。我们可以看出这种处置是将用户体验放在了一个相对重要的位置,但是这同时也给攻击者带来了诸多便利。友好的文案提示方面攻击者确认是触发了环境检测机制,从而专心绕过。不立即停止应用的运行,留给攻击者足够的时间去进行分析和注入,从而绕过应用的ROOT检测机制。
2、对第二种处置,对于攻击者来说无法直接定位到业务失败的原因,可能需要通过抓包分析,甚至自己猜测来定位,在一定程度上提高了攻击者的攻击成本和难度。但是这种处置也可能会误杀一部分为了个性化而将手机ROOT的正常用户,为了减少误杀率,现在的应用也会进行一些特殊的处置。

前面扯了一堆,后面的内容算是开始步入正题。无论我们是从事安全研究还是作为攻击者,也无论应用对检测到的ROOT设备是如何处置的,ROOT检测机制的存在都会对我们造成一些阻碍。因此,绕过应用的ROOT检测是一个必要的事情,也是我们工作中经常要遇到的。那么,如何绕过ROOT检测机制呢?这里提供两个思路,其一是对应用下手,干预应用的ROOT检测行为;另外一个思路则是对系统下手,隐藏系统自身ROOT相关的特征。我们可以借助jadx等逆向工具对应用源码进行分析,Hook相关的实现函数绕过;也可以获取AOSP源码,通过定制ROM来隐藏ROOT的特征。

目前主流的Hook框架有frida和xposed,本人比较倾向于前者,我们也可以用frida的可见框架RMS进行注入。相对来说,通过Hook的方式来绕过ROOT检测机制操作比较简单、方便,但Hook本身会受到很多的约束。一方面,受限于应用自身的加固手段,可能难以定位ROOT检测的实现函数;另一方面,Hook框架自身也会具备一些易于被检测到的特征,可能会受到这些特征的约束而难以完成工作。

定制ROM的手段有很多种,可以通过对官方包进行解包、修改后重打包。我推荐的方式是获取AOSP源码,自己编译后制作ROM包。这样可以实现更高程度的定制化,与基于现有包修改的方式相比该方式的操作空间更大,但是同样的它会带来更好的编译成本、修改难度也更大。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 9
支持
分享
最新回复 (21)
雪    币: 6212
活跃值: (6447)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
大佬 银行app一般都加壳,怎么热修复自己的代码
2021-11-15 15:03
0
雪    币: 3609
活跃值: (4725)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
mb_aoooaosd 大佬 银行app一般都加壳,怎么热修复自己的代码
hi,这就是一个简单的实例哈。文中提到的应用也是动态加载的RootUtil,无非就是找到合适的替换位置就好
2021-11-15 15:16
0
雪    币: 181
活跃值: (2998)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你这个思路,有点东西的。。。
2021-11-16 11:04
0
雪    币: 3609
活跃值: (4725)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
huaerxiela 你这个思路,有点东西的。。。[em_85]
哈哈,就是玩儿嘛。图省事,自己刷个包一劳永逸
2021-11-16 11:09
0
雪    币: 29
活跃值: (5857)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
虽然但是,这只会让检测更简单,本来还要解析method的修饰符或ArtMethod的flag的,你这getClassLoader判断一下dex路径就直接无了,历史倒退了属于是
2021-11-16 11:56
0
雪    币: 3609
活跃值: (4725)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
不吃早饭 虽然但是,这只会让检测更简单,本来还要解析method的修饰符或ArtMethod的flag的,你这getClassLoader判断一下dex路径就直接无了,历史倒退了属于是
哈哈,这就是搞着玩的。估计也不会有人去检测这玩意儿
2021-11-16 13:17
0
雪    币: 32
活跃值: (78)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这个不高级
2021-11-22 10:08
0
雪    币: 3609
活跃值: (4725)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
三点水的湫 这个不高级
不至于不至于,搞些玩的谈不上
2021-11-22 11:21
0
雪    币: 5330
活跃值: (5479)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
10
没见过风控检测在Java层的。。。
2021-11-22 12:06
0
雪    币: 3609
活跃值: (4725)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
GitRoy 没见过风控检测在Java层的。。。
大量APP的root检测都是在Java层...
2021-11-22 12:11
0
雪    币: 50
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
大佬,能把这个 ROOT检测逻辑demo给个链接。让我动手实践下。
2021-11-23 10:58
0
雪    币: 348
活跃值: (1618)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
直接改内核,留个后门,神仙来了也检测不到
2021-11-23 12:35
0
雪    币: 3269
活跃值: (3079)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
14

捉虫:更好的编译成本 -> 更高的编译成本


文章建议:


可在我决定采用Hook的方式来进行绕过。之后加上一句(最后还是没素质了~)


这样读者的困惑可能会更少一些。

2021-12-7 22:23
0
雪    币: 3269
活跃值: (3079)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
15

楼主一开始提到:


定制ROM来绕过ROOT检测有点浪费且无赖(定制ROM绕过该行的环境检测是经过结果验证的)。作为一个有素质的人,我决定采用Hook的方式来进行绕过。


但是之后却没有将这个思路进行下去,因为:


定位Hook检测的实现再绕过的工作量甚至不小于定制ROM


于是使用了定制ROM实现的热修复技术。


个人认为其实可以继续下去。因为定位Hook检测的工作量可能并不是很大,属于常规逆向流程。之后使用Frida或Xposed即可完成绕过。


如果实在要用热修复的话,定制ROM还是有点重了,按楼主的修改方式,可以考虑重打包framework


PS:既然都定制ROM了,为啥不直接重写系统和内核层的Root相关检测

最后于 2021-12-17 20:53 被xhyeax编辑 ,原因:
2021-12-7 22:26
0
雪    币: 6
活跃值: (1201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
我只想知道在家隔离,工资照发吗
2021-12-8 08:48
0
雪    币: 27
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
Hotfix是什么类
2021-12-9 18:45
0
雪    币: 244
活跃值: (266)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
建议直接修改rom 做定向root,内核级别的,只有自己的APP能 拿到shell和root权限 
2021-12-11 12:06
0
雪    币: 2108
活跃值: (1389)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
xhyeax 楼主一开始提到:定制ROM来绕过ROOT检测有点浪费且无赖(定制ROM绕过该行的环境检测是经过结果验证的)。作为一个有素质的人,我决定采用Hook的方式来进行绕过。但是之后却没有将这个思路进行下去,因 ...
定位hook检测的工作量可能很大哦,一般hook检测以及root检测都放在so层,但是有些so会对代码做ollvm混淆,分析起来还是很有难度的
2021-12-17 04:13
0
雪    币: 3269
活跃值: (3079)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
20
Itachi_ 定位hook检测的工作量可能很大哦,一般hook检测以及root检测都放在so层,但是有些so会对代码做ollvm混淆,分析起来还是很有难度的

你也说了是“可能”嘛,还是需要具体情况具体分析。


我的意思是,楼主可以再跟一下,看看检测点到底是在哪个函数。然后再评估要不要继续分析。


况且,我们不需要分析整个so函数的流程,只需要找到它的检测点即可。


常规定位思路:

Hook常见检测点(比如通过libc.so或JNI),过滤字符串并回溯堆栈,定位到检测位置。

对于系统调用,可采用SVC Hook、定制内核、或模拟执行的方式,找到检测位置。


对于混淆严重的代码,不好分析逻辑进行Patch。可以通过上述方式,找到它的检测特征(通常是字符串),然后写脚本或定制Hook工具,绕过检测。


PS:这种有提示的检测都是可以定位并绕过的(只是工作量大小有区别),隐而不发、散布各处的才是最难搞的。

最后于 2021-12-17 21:09 被xhyeax编辑 ,原因:
2021-12-17 20:30
1
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21
大神。求助。我想给你私信打不开、有偿、看到希望能联系我、希望有机会合作
2023-12-29 05:31
0
雪    币: 215
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
打印出当前应用所有已经加载的类
请问这个怎么操作的
2024-1-3 14:36
0
游客
登录 | 注册 方可回帖
返回
//