基于LLVM的Android应用程序编译时虚拟化保护之软件工程研究

论文价格:0元/篇 论文用途:仅供参考 编辑:论文网 点击次数:0
论文字数:**** 论文编号:lw202329921 日期:2023-07-22 来源:论文网


第一章 引言

1.1 研究背景与意义
得益于 Android 生态环境的开放性与可扩展性,Android 操作系统被广泛应用。根据 statCounter 的统计数据显示[1],2018 年 Android 首次超越 Windows 成为目前最为流行使用的操作系统。在移动互联网领域 Android 系统的应用更为突出,图 1 为近10 年移动操作系统市场占有率的变化情况[2],可以看出 Android 系统市场占有率持续攀升,并逐渐盘踞移动互联网市场的主导地位。除此之外,Android 系统存在巨大的用户活跃量,根据 Statista 2018 年度的研究报告称[3],2018 年度各移动应用市场应用的下载总量逾 2054 亿次。
Android things 为 Google 针对于低功耗的物联网设备专门定制的操作系统,Android things 的出现再次完善了 Android 生态环境,这使得 Android 平台不仅适用于智能手表、手环、平板、电视等智能终端设备,也同样适用于低功耗以及交互方式简单的小型智能设备上,如传感器、摄像头、智能门锁等等。

........................

1.2 国内外研究现状
1.2.1 二次打包检测及防御
二次打包有着十分巨大的危害,攻击人员在对原合法程序逆向的基础上,通过插入恶意负载实现对原程序的仿冒,进而实现恶意吸费、拦截短信、窃取用户隐私数据等不法行为,使得应用程序开发者和使用者面临巨大的经济利益损失。因此,二次打包问题亟待有效的解决方案。在此相关问题上,业界主要采用基于相似度对比的检测方案和基于主动避免的防护方法。
在二次打包问题的检测中,所有研究都采用了共通的做法,即提取目标程序的特征,通过特征的比较来确定两个应用程序之间的相似性。Droidmoss[8]通过字节码指令序列中操作码顺序实现指纹对比。ViewDroid[9]将程序中所有 Activity 类作为节点,所有的操作作为边来构建视图并执行视图相似性测量,然而这种方法的局限在于只能比较具有 3 个视图以上的程序。CodeMatch[10]首先使用 libDetect 将字节码抽象表示以识别并删除程序中的库代码,在库代码删除的基础上,使用模糊散列处理剩余的抽象表示,最终发现约 15%的 Android 应用程序都是经过二次打包的。AnDarwin[11]为程序中每个方法计算数据依赖关系并生成依赖图,为每一个依赖图计算底层各指令的使用频率,对不同应用程序中出现频率较高的向量进行剪枝,最终将剩余向量散列后实现相似度比较。
采用机器学习的检测手段也相继被提出。MaMaDroid[12]从应用程序的控制流图中提取特征,并使用被抽象的 API 调用序列来捕获应用程序的行为模型,最后通过每个节点之间的转化概率来构造马尔科夫链作为特征向量训练分类器。然而 Android HIV[13]提出了一种攻击方式可以对抗现有的基于机器学习的检测方法,将 Ma MaDroid的准确率从 96%下降到 1%。
.............................

第二章 Android 软件保护方法及攻击机制分析

2.1 Android 应用程序与运行时
2.1.1 Android 应用程序结构
APK 作为 Android 应用程序的安装文件,是一系列资源的合集,实际上可以被看作一个压缩包。图 2 为某 APK 解包之后的实际结构,主要包含 classes.dex、资源文件、签名文件以及本地库文件。


其中,classes.dex 作为安装包的主程序文件,扩展名为.dex,是一种用来存储Davilk 字节码的文件形式。资源文件包括 xml 文件、图片以及相关脚本文件,如 JS、html 等。AndroidManifest.xml 是程序的清单文件,用于声明程序的权限、基本组件以及入口点。其他资源文件存放于 res 目录下,Android 框架为每一资源分配唯一的 ID作为标识,并使用 resources.arsc 保存资源 ID 和具体资源之间的映射关系。Android 系统基于 Linux 内核实现,系统被划分为以下四个层面:Linux 内核层、框架层、Native层以及 Java 层。因此应用程序开发者可以使用 C/C++语言实现 Native 层程序,形成.so尾缀的文件,并存放于 lib 目录下。
.............................

2.2 Android 应用程序防御机制

市场上针对 Android 程序的逆向工具已经形成了一条完整的工具链,图 6 为一个APK 的完整逆向过程以及其间所涉及到的逆向工具。随着攻击工具的不断发展,出现了如 JD-GUI[38]、JEB[39]、jadx[40]、Android killer[41]一类的集成逆向环境,这些集成环境整合了 APK 解压缩、资源文件反编译、主程序文件反编译、程序签名、Smali 指令修改的完整功能,使得攻击者不需要多少专业知识便可以轻松恢复应用程序的原始逻辑。
一般的 APK 二次打包流程如图 7 所示。逆向人员经过脱壳、拆包、反编译等步骤来实施对宿主APK的攻击与逆向过程,得到DEX文件的字节码表示,使用dex2jar[42]等反编译工具获取程序源代码,在理解源码的基础上通过对字节码的修改来插入恶意负载,最后将篡改后的 APK 重新发布到应用市场上,欺骗用户下载虚假的应用程序从而产生利润。为了使 Android 应用程序免受篡改和逆向攻击的影响,混淆、加壳、反调试等防护措施被研究提出,以下是对这些保护技术原理的简要分析。
...........................

第三章 Android 应用程序编译时虚拟化保护方法研究 ................................. 21
3.1 方法概述 .................................. 21
3.2 提前编译决策 ................................ 22
3.3 DEX 字节码函数提前编译研究 ..................... 23
第四章 原型系统的设计与实现 ................................ 39
4.1 整体框架设计 ........................................ 39
4.2 功能模块设计 ............................ 40
第五章 实验分析与评价 ....................................... 51
5.1 实验设计 ...................................... 51
5.1.1 实验环境与实验步骤 .................................. 51
5.1.2 实验对象 ............................ 51

第四章 原型系统的设计与实现

4.1 整体框架设计
本文提出一种 Android 应用程序编译时虚拟化保护方法,使得保护方法紧密结合于目前 Android 平台的攻击场景,同时考虑了 Java 层程序与原生本地层程序的保护问题。D2VM 以完整的 Android 应用程序作为输入,并以经过代码提前编译以及虚拟编译修改后的应用程序作为输出。


图 20 为 Android 应用程序编译时虚拟化保护系统整体框架图,其中 VI 表示虚拟指令的字节码表示,Handler 为虚拟指令的处理函数。D2VM 的系统框架主要包含四大功能组件,即提取组件、翻译组件、虚拟化组件以及重打包组件。提取组件通过决策模型以及用户指定生成翻译配置文件,决定提前编译阶段的翻译对象;翻译组件用于 DEX 文件中字节码指令的转化和重填,本文称为 D2C(DEX Bytecode to C Source);虚拟化组件用于将 IR 转化为虚拟指令以及虚拟运行时环境,称为 C2VM(C Source to VM-based Binary );重打包组件将经过编译虚拟的原生二进制程序以及修改后的DEX 文件重新组合为一个新的 APP。D2C 的主要任务包含三个阶段,分别为指令提取、解析以及转换。具体而言,D2C 提取了 DEX 中的所有 Class,并通过解析提取Class 中的字段、方法以及方法中的指令序列,将 Class 建立为一种内部的节点结构,最后使用转换器将上述节点结构构造为对应的 C/CPP 文件作为输出。C2VM 以 C 或C++代码为输入,以目标平台二进制代码为输出。首先通过调用 Clang 编译器将转化得来的 C/C++代码经过词法、语法分析得到 LLVM IR 中间表示,随后通过定制的优化器实现虚拟指令以及虚拟指令的解释器,其中虚拟指令解释器由一个调度器以及多条解释函数实现,最终虚拟指令和虚拟解释器经过 LLVM 代码生成器映射到目标二进制文件上,使得虚拟化保护能够适用于 Android 繁杂的设备种类以及 CPU 架构。
..............................

总结与展望

总结

Android 程序加固致力于在保证原始逻辑功能不变的情况下,使程序更难以被分析利用,来保护软件免受逆向工程的非法侵害。然而随着逆向工具链的不断成熟以及攻击方法的不断深化,使得一些加固方法难以应对于目前复杂的攻击环境。因此迫切需要一种切实可行的保护方案来有效解决 DEX 字节码程序容易被反编译、SO 防御手段薄弱的问题。本文提出了一种 Android 应用程序编译时虚拟化保护方法,能够有效的缓解目前二次打包攻击带来的安全威胁。
以下是本文主要研究内容的总结:
(1)本文对 Android 应用程序二次打包问题进行了深入的研究分析。首先,分析了二次打包的历程以及原理。其次,详细介绍了当前 Android Java 层以及原生本地层加固方法的实现原理。最后,尝试从程序运行机制以及逆向原理两个层面来说明加壳等程序加固手段在二次打包防御中所具有的局限性。
(2)本文所述方法以 Android 平台的代码文件为研究对象,主要涉及到两大思想,首先,提出并设计一种提前编译技术将 Java 层代码转化为本地层代码,有效地避免了 Java 层被篡改的风险,该转化具有不可逆的性质,转化后的字节码在程序执行的整个生命周期内不会被重新收集,攻击者若想进一步分析目标程序功能只能将攻击目标转移到本地层代码上。其次,本文通过对 NDK 开发套件编译机制的研究,设计实现了一种在本地层程序编译过程中形成虚拟化保护的方法,该方法在不改变本地层程序开发流程的同时,使得虚拟化能保护够适用于Android这种复杂的生态系统下。Android 应用程序编译时虚拟化保护方法打破了传统保护的局限性,将 Android 平台下的两种代码文件的保护问题通过虚拟化的方式共同实现,有效地保护了 Android Java 层与原生本地层程序的核心逻辑不被恶意分析和使用。
参考文献(略)



如果您有论文相关需求,可以通过下面的方式联系我们
客服微信:371975100
QQ 909091757 微信 371975100