Android App加固原理与技术历程

news2024/9/24 19:00:50

App为什么会被破-jie入侵

随着黑客技术的普及化平民化,App,这个承载我们移动数字工作和生活的重要工具,不仅是黑客眼中的肥肉,也获得更多网友的关注。百度一下“App破-jie”就有5290万条结果。

​ 一旦App被破-jie,不仅使用者的照片、身份证、手机号、联系住址、邮箱和支付密码等敏感信息会泄露,还可能感染手机的操作系统,进而导致手机被入侵篡改,乃至成为攻击者操控的“僵尸网络”中的一部分。

安卓App的开发除了部分功能采用C/C++编码外,其余主要都是采用Java进行编码开发功能。Java源码最终编译成smali字符码,以classes.dex保存在App的APK中。

Java是一种解释性语言,功能强大,易用性强。初学者能轻松地学习Java,并编写简单的应用程序。而且Java的基本类库(JDK)是开源的,这就使很多Java开发的应用被逆向破-jie的门槛很低。目前市面上有大量的逆向破-jie工具,例如:Dex2Jar、JEB、JD-GUI等等。只要懂代码编程,利用这些工具就可以破-jie市面上那些防御薄弱、存在大量安全漏洞的App。这就很好理解为什么会有如此多人去搜索“App破-jie”了。

之前曾有媒体报道,有网络黑产专门从各种渠道找到App的apk,然后将apk文件逆向破-jie,再植入广告、病毒代码,最后重新打包投入公开市场,当不明真相的网友将带病毒广告的App下载后,会带来巨大经济损失。

加固技术发展历程

传统App加固技术,前后经历了四代技术变更,保护级别每一代都有所提升,但其固有的安全缺陷和兼容性问题始终未能得到解决。而新一代加固技术—虚机源码保护,适用代码类型更广泛,App保护级别更高,兼容性更强,堪称未来级别的保护方案。

第一代加固技术—动态加载

第一代Android加固技术用于保护应用的逻辑不被逆向与分析,最早普遍在恶意软件中使用,其主要基于Java虚拟机提供的动态加载技术。

保护流程

开发阶段

开发阶段中将程序切分成加载(Loader)与关键逻辑(Payload)两部分,并分别打包;

启动流程

运行时加载部分(Loader)会先运行,释放出关键逻辑(Payload),然后java的动态加载技术进行加载,并转交控制权。

核心代码:

备注(multidex组件的加固原理):

Android的DEX文件在设计之初程序普遍较小,所以在DEX文件设计时,只允许包含65535个函数引用。而随着Android应用的发展,大量的应用的代码已经超过了65535的限制,为了解决这个问题,Android5.0之后原生支持加载多个dex,而为了对旧版本的兼容,Android提供了multidex组件。该组件的实现原理与上面介绍的是一致的。

缺陷与对抗

第一代加固技术的缺陷是依赖Java的动态加载机制,而这个机制要求关键逻辑(Payload)部分必须解压,并且释放到文件系统,这就给了攻击机会去获取对应的文件。虽然可以通过关键逻辑(Payload)被加载后,被从文件系统删除,用于防止被复制,但是攻击者可以拦截对应的删除函数,阻止删除。

而关键逻辑(Payload)会被加密后保存,可用于对抗静态分析,但是攻击者可以通过自定义虚拟机,拦截动态加载机制所使用的关键函数,在这个函数内部,复制文件系统中的关键逻辑(Payload)文件。

第二代加固技术—不落地加载

相对第一代加固技术,第二代加固技术在APK修改方面已经完善,能做到对开发的零干扰。开发过程中不需要对应用做特殊处理,只需要在最终发布前进行保护即可。而为了实现这个零干扰的流程,Loader需要处理好Android的组件的生命周期。

保护流程

1)Loader被系统加载。

2)系统初始化Loader内的StubApplication。

3)StubApplication解密并且加载原始的DEX文件(Payload)。

4)StubApplication从原始的DEX文件(Payload)中找到原始的Application对象,创建并初始化。

5)将系统内所有对StubApplication对象的引用使用替换成原始Application,此步骤使用JAVA的反射机制实现。

6)由Android系统进行其他组件的正常生命周期管理。

对开发零干扰的加固后启动流程:

​ 另一方面,不落地加载技术是在第一代加固技术的基础上改进,主要解决第一代技术中Payload必须释放到文件系统(俗称落地)的缺陷,其主要的技术方案有两种:

A.拦截系统IO相关的函数(如read、write),在这些函数中提供透明加解密。具体的流程是:

1)关键逻辑(Payload)以加密的方式存储在APK中。

2)运行时加载部分(Loader)将关键逻辑释(Payload)放到文件系统,此时关键逻辑(Payload)还处于加密状态。

3)加载部分拦截对应的系统IO函数(read,write等)。

4)加载部分(Loader)正常调用Java动态加载机制。由于虚拟机的IO部分被拦截,所以虚拟机读取到已经解密的关键逻辑(Payload)。

透明加解密方案流程:

​ B.直接调用虚拟机提供的函数进行不落地的加载,具体流程是:

1)关键逻辑(Payload)以加密的方式存储在APK中。

2)运行时加载部分(Loader)将关键逻辑释(Payload)放到内存。

3)加载部分调用虚拟机内部接口进行加载。

不落地加载流程:

关键的系统函数如下:

兼容性

方案A透明加密方案由于其需要拦截系统的IO函数,这部分会使用inline hook或者got hook等技术,其会带来一定的兼容性问题

方案B的不落地加载方案由于其调需要调用系统内部的接口,而这个接口并不导出,各个厂商在实现时又有各自的自定义修改,导致该方案存在兼容性问题。

缺陷与对抗

第二代加固技术在应用启动时要处理大量的加解密加载操作,会造成应用长时间假死(黑屏),用户体验差。

在加固技术实现上没有本质区别,虽然能防止第一代加固技术文件必须落地被复制的缺陷,但是也可以从以下方面进行对抗:

例如内存中的DEX文件头会被清除,用于防止在dump文件中被找到;DEX文件结构被破坏,例如增加了一些错误的数据,提高恢复的成本。

但是Payload被加载之后,在内存中是连续的,利用gdb等调试工具dump内存后可以直接找到Payload,进行简单的处理之后可以恢复出100%的Payload文件。

和第一代加固技术的对抗方法一样,不落地加载也无法对抗自定义虚拟机。只需对上述的关键函数进行拦截然后将对应的内存段写出去,即可恢复Payload。注意,由于IO相关的函数被拦截,所以无法直接调用read/write等函数进行直接的读写,需要使用syscall函数进行绕过。

虽然厂商会自己实现可能上述函数,从而绕过上述函数的拦截。但是Android的类加载器必须能找到对于的结构体才能正常执行,攻击者可以以类加载器做为起点,找到对应的Payload在内存中的位置。

第三代加固技术—指令抽离

由于第二代加固技术仅仅对文件级别进行加密,其带来的问题是内存中的Payload是连续的,可以被攻击者轻易获取。第三代加固技术对这部分进行了改进,将保护级别降到了函数级别。

保护流程

发布阶段

发布阶段将原始DEX内的函数内容(Code Item)清除,单独移除到一个文件中。

运行阶段

运行阶段将函数内容重新恢复到对应的函数体。恢复的时间点有几个方式:

A.加载之后恢复函数内容到DEX壳所在的内存区域

​ B.加载之后将函数内容恢复到虚拟机内部的结构体上:虚拟机读取DEX文件后内部对每一个函数有一个结构体,这个结构体上有一个指针指向函数内容(CodeItem),可以通过修改这个指针修改对应的函数内容。

​ C.拦截虚拟机内与查找执行代码相关的函数,返回函数内容。

兼容性

指令抽离技术使用了大量的虚拟内部结构与未被文档的特性,再加上Android复杂的厂商定制,带来大量的兼容性问题。

缺陷与对抗

指令抽离技术的某些方案与虚拟机的JIT性能优化冲突,无法达到最佳的运行性能。依旧使用了java虚拟机进行函数内容的执行。攻击者可以通过自定义Android虚拟机,在解释器的代码上做记录一个函数的内容(CodeItem)。接下来遍历触发所有函数,从而获取到全部的函数内容。最终重新组装成一个完整的DEX文件。目前已经有自动化工具可以指令抽离技术中脱壳。

第三代加固DEX文件脱壳流程:

第四代加固技术:指令转换/VMP

第三代加固技术在函数级别的保护,使用Android虚拟机内的解释器执行代码,带来可能被记录的缺陷,第四代加固技术使用自己的解释器来避免第三代的缺陷。而自定义的解释器无法对Android系统内的其他函数进行直接调用,必须使用JAVA的JNI接口进行调用。

保护流程

主要实现由两种:

A.DEX文件内的函数被标记为native,内容被抽离并转换成一个符合JNI要求的动态库。 动态库内通过JNI和Android系统进行交互。

B.DEX文件内的函数被标记为native,内容被抽离并转换成自定义的指令格式,该格式使用自定义接收器执行,和A一样需要使用JNI和Android系统进行调用。

兼容性

第四代VMP加固技术一般配合第三代加固技术使用,所以第三代的所有兼容性问题,指令转换/VMP加固也存在。

缺陷与对抗

不论使用指令转换/VMP加固的A方案或者B方案,其必须通过虚拟机提供的JNI接口与虚拟机进行交互,攻击者可以直接将指令转换/VMP加固方案当作黑盒,通过自定义的JNI接口对象,对黑盒内部进行探测、记录和分析,进而得到完整DEX程序。

第四代加固DEX文件恢复:

另外,第四代VMP加固技术只实现Java代码保护,没有做到使用VMP技术来保护C/C++等代码,安全保护能力有所欠缺。

新一代加固技术—虚机源码保护

跟第四代的VMP加固技术,虚机源码保护加固是用虚机技术保护所有的代码,包括Java,Kotlin,C/C++,Objective-C,Swift等多种代码,具备极高的兼容性;使App得到更高安全级别的保护,运行更加稳定。

保护流程

虚机源码保护为用户提供一套完整的工具链,首先把用户待保护的核心代码编译成中间的二进制文件,随后生成独特的虚机源码保护执行环境和只能在该环境下执行的运行程序。

虚机源码保护会在App内部隔离出独立的执行环境,该核心代码的运行程序在此独立的执行环境里运行。即便App本身被破-jie,这部分核心代码仍然不可见。

虚机源码保护加固流程:

对抗优势

生成的虚机源码保护拥有独特的可变指令集,极大的提高了指令跟踪、逆向分析的难度。同时,虚机源码保护还提供了反调试能力和监控能力。虚机源码保护可以通过自身的探针感知到环境的变化,实时探测到外界对本环境的调试、注入等非正常执行流程变化,将调试动作引入程序陷阱,并发出警报,进而进行实时更新,提高安全强度。

加固技术发展及其攻防对抗的更迭,伴随着互联网技术发展不断升级,我们深信邪不能胜正,而虚机源码保护加固作为当前领先的加固技术,在未来很长一段时间,能够为App提供足够强度的保护,为企业和开发者的业务发展保驾护航。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/130029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【图像处理】图像的锐化操作 | 边缘检测sobel算子,拉普拉斯算子,Canny算子| opencv

文章目录前言一、一阶导数算子:sobel算子二、二阶导数算子:拉普拉斯算子三.Canny算子前言 参考视频:opencv教程(跟着视频敲了一遍代码) 参考教材:《数字图像处理基础》 作者:朱虹 一、一阶导数…

【unity笔记】图解 Vector3.SignedAngle()方法的返回值

这个方法可以理解为:“两个向量之间的夹角(有符号的)”。 我会将它想象成:将两个向量都放在坐标原点,一个向量要向哪个方向旋转多少度 才能与另一个向量重合。 于是我在坐标原点放置了两个向量:OB和OA。 …

Java Object 类

Java Object 类是所有类的父类,也就是说 Java 的所有类都继承了 Object,子类可以使用 Object 的所有方法。 Object 类位于 java.lang 包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那…

Python采集股票数据信息

前言 今天打算来整整股票,简简单单的采集一些股票数据 对这个有兴趣的就一起来瞧瞧吧 准备 开发环境 & 第三方模块 解释器版本: python 3.8代码编辑器: pycharm 2021.2requests: pip install requests 爬虫pyecharts: pip install pyecharts 数据分析pandas…

图像属性操作

数字图像处理本质是对多维矩阵的操作。按照处理对象不同,可分为黑白图像处理,灰度图像处理,彩色图像处理。按照处理方法分为空间域处理和频域处理。按照策略分为全局处理和局部处理。 #一般步骤输入图像 多维数组 数组运算 图像…

排序算法:堆排序,快速排序,归并排序。内附完整代码和算法思路详解。

目录 一:堆排序 1.1:堆的数据结构 1.2:大小根堆 1.3:向下调整算法构建小根堆 1.4:堆排序思想 二:快速排序 2.1:快排单趟思想 三:归并排序 3.1:分组过程 3.2&am…

JSP ssh学习管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh学习管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式 开发。开发环境为TOMCAT7.0,Mye…

MMDetection框架入门教程之环境部署

创建虚拟环境 打开Anaconda Prompt,创建一个新的虚拟环境mmlab。注意我这里选择了python3.6,因为在python3.7下出现了mmdet3d.apis中的类无法无法import的情况(但mmdet3d可以import),暂时不清楚原因。 conda create …

SQLSERVER,求平均数,最大,最小,中位数,众数

SQLSERVER,求平均数,最大,最小,中位数,众数 SQLSERVER,求平均数,最大,最小,中位数,众数 SELECT -- *, t1.remark, t1.my_count, t1.my_sum, …

ArcGIS Python ​影像批量裁剪

该工具在:“14综合\工具箱.tbx\影像裁剪\按记录批量裁剪影像”,影像数据按矢量面要素批量裁剪,界面如图14-5所示。 图14-5 影像批量裁剪 按一个矢量面数据,按字段值相同的融合在一起裁剪影像,字段值是裁剪后的影像名字…

【再学Tensorflow2】TensorFlow2的高层封装

TensorFlow2的高层封装使用Tensorflow2构建模型的3种方法使用Sequential按层顺序构建模型使用函数式API创建任意结构的模型使用Model子类化创建自定义模型训练模型的3种方法内置fit方法内置train_on_batch方法自定义训练循环使用GPU训练模型使用单GPU训练模型使用多GPU训练模型…

ti3090安装cuda113+cudnn+anaconda+yolopose过程

wget https://developer.download.nvidia.com/compute/cuda/11.3.1/local_installers/cuda_11.3.1_465.19.01_linux.run sudo sh cuda_11.3.1_465.19.01_linux.run 如果有了nvidia driver,可以不用install driver选项。 配置环境变量: export PATH“/…

十一、kubernetes核心技术Label详解、实例

1、概述 Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。 Label的特点: 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等等 一个资源对象可以定义任意数量的…

【技术博客】文本挖掘之LDA主题模型

文本挖掘之LDA主题模型 作者:郑培 引言 主题模型是文本挖掘的重要工具,近年来在工业界和学术界都获得了非常多的关注。在文本挖掘领域,大量的数据都是非结构化的,很难从信息中直接获取相关和期望的信息,一种文本挖掘…

ArcGIS基础实验操作100例--实验23提取栅格有效边界值

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 基础编辑篇--实验23 提取栅格有效边界值 目录 一、实验背景 二、实验数据 三、实验步骤 (…

sqlserver 求平均数,中位数,众数

sqlserver 求平均数,中位数,众数 sqlserver 聚合函数结合 窗口函数的巧妙使用。 SELECT -- *, t1.remark, t1.my_count, t1.my_sum, t1.my_avg, t1.my_min, t1.my_max, /*my_median : 中位数*/ t2.my_median, /*my_mos…

保姆教程系列二、Redis高可用(主从同步+哨兵模式)

系列文章目录 !!!是的没错,胖友们,保姆教程系列又更新了!!! 保姆教程系列一、Redis部署 so easy 保姆教程系列二、Redis高可用(主从同步哨兵模式) 保姆教程系…

2008-2020年上市公司环境治理费用

2008-2020年上市公司环境治理费用 1、时间区间为:2008-2020年 2、指标包括:统计截止日期、证券代码、证券简称、本期金额、上期金额、上市公司排污费、环保费、绿化费、环保支出等有关环境治理费用 3、指标说明: EndDate [统计截止日期] …

ArcGIS基础实验操作100例--实验22NoData数据处理

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 基础编辑篇--实验22 NoData数据处理 目录 一、实验背景 二、实验数据 三、实验步骤 方法一&#xff1…

Linux网络协议之以太网协议(数据链路层)

Linux网络协议之以太网协议(数据链路层) 文章目录Linux网络协议之以太网协议(数据链路层)1.数据链路层解决的问题2.以太网协议2.1 认识以太网2.2 以太网帧格式2.3 认识MAC地址2.4 MAC地址与IP地址的区别3.ARP协议3.1 ARP协议的作用3.2 ARP数据报格式3.3 ARP协议工作流程3.4 ARP…