首页
社区
课程
招聘
[原创]从第一代到第五代,App加固技术详解
发表于: 2021-8-11 18:08 13216

[原创]从第一代到第五代,App加固技术详解

2021-8-11 18:08
13216

通过这几年的发展APP加固技术,不断得到快速迭代发展,加固的强度也在不断的提升。加固技术的发展主要经历:动态加载、内存不落地加载、指令抽取、指令转换、虚拟机保护。下面就分别对这些技术实现进行解析。

Android动态加载加固技术用于保护App应用的逻辑不被逆向与分析,最早普遍在恶意软件中使用,它主要基于Java虚拟机提供的动态加载技术。由于动态加载技术主要依赖于java的动态加载机制,所以要求关键逻辑部分必须进行解压,并且释放到文件系统。这种动态加载技术不足之处在于:1.这一解压释放机制就给攻击者留下直接获取对应文件的机会;2.可以通过hook虚拟机关键函数,进行dump出原始的dex文件数据。

Android不落地加载技术,它是在动态加载技术的基础进行改进。它通过借鉴第一代加固的动态加载技术中,关键逻辑部分必须释放到文件系统的缺陷,它主要新增文件级别的加解密。文件级别的加解密技术主要有两种实现方案:1.通过拦截系统的IO相关函数,在这些系统的函数中进行透明加解密。2.直接调用虚拟机提供的函数,进行不落地的加载。这种文件级别的加解密不足之处在于:1.由于在App启动时需处理大量加解密操作,它会造成App启动卡顿假死或黑屏现象,用户体验感较差;2.由于它的内存是连续的,通过hook关键函数就可以获取到连续完整的dex数据。

android的指令抽取,主要在于函数基本的抽取保护。通过使用android虚拟机自带的解释器进行执行代码。将原始App中dex文件的函数内容进行清除,并将单独移动到一个加密文件中,在App运行的时候,再将函数内容重新恢复到对应的函数体。这一指令抽取技术的不足之处在于:1.使用大量的虚拟机内部结构,会出现兼容性问题;2.使用android虚拟机进行函数内容的执行,无法对抗自定义虚拟机;3.它跟虚拟机的JIT优化出现冲突,达不到最佳的性能表现。

它主要通过实现自定义Android虚拟机的解释器,由于自定义解释器无法对Android系统内的其他函数进行直接调用,所有必须使用java的jni接口进行调用。这种实现技术主要有两种实现:1.dex文件内的函数被标记为native,内容被抽离并转换为一个符合jni要求的动态库。2.dex文件内的函数被标记为native,内容被抽离并转换为自定义的指令格式。并通过实现自定义接收器,进行执行代码。它主要通过虚拟机提供的jni接口和虚拟机进行交互。这一指令转换技术实现方案不足之处在于:在攻击者面前,攻击者可以直接将这个加固技术方案当做黑盒,通过实现自定义的jni接口对象进行内部调试分析,从而得到完整的原始dex文件。

通过利用虚拟机技术保护App中的所有代码,包括java、Kotlin、C/C++等多种代码,虚拟机技术主要是通过把核心代码编译成中间的二进制文件,随后生成独特的虚拟机源码,保护执行环境和只有在该环境下才能执行的运行程序。通过基于llvm工具链实现ELF文件的vmp保护。通过虚拟机保护技术,让ELF文件拥有独特的可变指令集,大大提高了指令跟踪,逆向分析的强度和难度。但虚拟机源码保护技术的不足之处在于:1.无法摆脱JNI的依赖;2.通过采用虚拟化保护会是App的体积呈现增大情况,同时性能会有所下降。

将App的源代码中敏感字符串做随机加密处理。在运行时进行对字符串动态解密,这样就可以避免攻击者,通过利用工具进行静态逆向分析发现关键字符串信息,从而快速定位到应用中的业务代码。

将so文件中C\C++代码中的执行控制逻辑变换为平坦的控制逻辑,从抽象语法树层面进行深度混淆,使得其在常用反编译工具中,极大的降低反编译逆向代码的可读性,增加逆向代码的分析难度。

对代码中的运算表达式进行等效转换,使其在常用反编译工具中,提高破解者逆向分析门槛,有效的保护核心算法的原始逻辑。

对源代码中的变量名称进行做混淆操作,混淆后变量名称变成无任何意义的名称。这给分析者加大了分析强度。

对App应用中的类名称、函数名称进行混淆操作,增大直接用工具分析难度,让反编译逆向工具,无法直接通过类名称、函数名称进行快速定位App的核心代码。

采用在混淆过程中引入随机性技术,在相同的混淆策略下,每次混淆后的代码均不一致,进一步提升攻击者通过利用工具进行静态分析的难度。

将代码中分支跳转判断条件,由原来的确定值变为表达式,增加程序逻辑的复杂性、降低代码的可读性。

对App应用进行防调试保护、检测到配置防动态调试功能的类、方法、函数被IDA逆向工具进行动态调试时候,App应用进行自动退出运行操作,有利于保护App应用直接被动态调试,从而提高攻防对抗的门槛。

对App应用进行防动态注入保护,当利用zygote或ptrace技术进行App应用的注入操作时,App应用进行自动退出运行操作,以此进行防御攻击方对App应用的非法操作,避免动态分析执行代码,从而达到动态保护App应用安全。

对App进行防HOOK保护,检测到配置防hook保护功能的类名、方法名、函数名在被frida、xposed等工具动态hook时候,App进行自动退出操作,以此进行提高防御App安全性,保护App不被注入攻击,抵御恶意侵入。

对App应用中的代码段进行完整性校验,发现代码段被篡改,App应用进行自动退出运行,防止App应用中的代码逻辑被篡改,以此进行动态保护App的源代码安全性。


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

上传的附件:
收藏
免费 6
支持
分享
最新回复 (4)
雪    币: 1490
活跃值: (9913)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
2
整体科普了一遍。学习了。大佬能放几个加固的样本吗?第三代、第四代、第五代的加固样本方便放出来么。
2021-8-11 18:26
0
雪    币: 2089
活跃值: (3933)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
misskings [em_13]整体科普了一遍。学习了。大佬能放几个加固的样本吗?第三代、第四代、第五代的加固样本方便放出来么。
怕被你秒脱壳修复,不敢放了
2021-8-11 22:23
0
雪    币: 14824
活跃值: (6063)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
个人认为最多三代:
一代,简单dex加固,最多在dex头上作变化
二代:代码抽取
三代:vmp
2021-8-11 22:28
2
雪    币: 2714
活跃值: (1611)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
2021-8-13 10:14
0
游客
登录 | 注册 方可回帖
返回
//