当前位置: 首页 > 专利查询>西北大学专利>正文

基于Dex2C与LLVM的Android应用程序保护方法技术

技术编号:22135539 阅读:31 留言:0更新日期:2019-09-18 09:13
本发明专利技术公开了基于Dex2C与LLVM的Android应用程序保护方法,包括:解压APK获取并解析Dex文件,得到每条汇编指令的能够恢复C代码的所有必要信息,根据评估模型选择是否进行Dex2C的转换,若超过阈值,则进行Dex2C的转换:转换预处理操作,包括查找待保护方法、插入汇编指令语句、建立指令的邻接关系等,逐个根据汇编指令类型选择三套转换逻辑中的一种进行转换;基于LLVM实现编译时虚拟化,若未超过阈值,则直接执行LLVM编译虚拟化模块;通过该框架生成So文件后,进行重打包、签名,生成功能等效的APK。本发明专利技术结合了Dex层和本地层的防护方法,一方面能够提高APK的执行效率,另一方面极大的提升了恶意攻击者攻击的难度和成本。

Android application protection method based on Dex2C and LLVM

【技术实现步骤摘要】
基于Dex2C与LLVM的Android应用程序保护方法
本专利技术属于Android应用程序中Dex文件加密与So文件编译时虚拟化的
,具体涉及到Dex文件到C文件的转换与基于LLVM编译时虚拟的Android应用程序保护方法。
技术介绍
近年来,随着移动互联网生态系统的蓬勃发展,移动应用程序的数量呈指数级增长。根据Statista的一项调查,截至2019年3月,GooglePlay共提供了260万个Android应用程序。但是,由于逆向工具链的成熟,攻击者使用逆向工具很容易获取到合法应用程序中So(sharedobject)文件或classes.dex文件的核心逻辑,然后进行篡改,譬如添加恶意代码或替换原始广告等,最终进行重打包签名,通过非法渠道流入市场。这不仅损害了应用开发者的利益,而且也对用户财产与隐私构成了威胁,严重影响了移动应用行业的健康发展。市场上大多数APP是由Java语言和C语言开发的,Java代码在编译过程中生成Dex文件,C代码在编译的过程中生成So文件。目前Dex文件的主要防护方式有以下几种:整体加密、部分类加载加密及Dex文件虚拟化,但相应的,DexExtractor、ZjDroid及PackGrind工具能够对这三种Dex层的保护方案进行有效的攻击。Dex文件目前主流的防护方式还有一个最主要的缺陷是加壳的方法并不会提高Dex文件的执行效率。目前So文件的主要防护方式有:OLLVM与Upx加壳。但相应的攻击工具或方案有DecLLVM与UpxShellTools。由此可见,一方面,目前的保护方案存在着保护能力不足和保护后效率降低的问题,另一方面,目前市面上还没有一种能够同时对Dex文件和So文件同时进行防护的系统。
技术实现思路
本专利技术提出了一种基于Dex2C与LLVM(LowLevelVirtualMachine)的Android应用程序保护方法,能够同时对Dex文件和So文件进行防护,以有效抵御恶意攻击者的静态分析和动态分析。为了实现上述任务,本专利技术采用以下技术方案:基于Dex2C与LLVM的Android应用程序保护方法,包括以下步骤:从待保护的应用程序安装包中获取Dex文件,按照文件格式对其进行逐层解析,得到Dex文件中的每一条汇编指令的能够恢复到C语言代码的所有必要信息并存储于数据结构中;确定待保护的方法并将其修改为本地层类型方法然后重写Dex文件,进行转换前预处理工作;建立评估模型,将待保护方法运行时的核心调用时间占比作为评估模型的决策依据,通过设置阈值,来判定是否将待保护的方法进行Dex2C转换,从而尽可能避免频繁的反射调用和冗余的循环操作;如待保护的方法进行Dex2C转换,则将存储在所述数据结构中对应于待保护方法的必要信息转换为C语言代码,转换过程中针对于不同的汇编指令建立不同的转换逻辑,并恢复汇编指令前驱、后继之间的连接关系,同时保证汇编指令类型正确恢复、数据传递的一致性;将转换后的C代码作为待保护对象;如待保护的方法不进行Dex2C转换,则将待保护的应用程序安装包中的So文件里的入口函数作为待保护对象;将待保护对象进行编译的同时虚拟化,生成虚拟化后的二进制So文件,进行重打包、签名,生成保护后的应用程序。进一步地,所述的汇编指令的能够恢复到C语言代码的所有必要信息,包括类中方法、字段的描述以及每条指令的细节信息;所述的数据结构用于存放每条汇编指令所涉及的寄存器的个数及内容、所属类的信息、参数信息等。进一步地,所述的转换前预处理工作,包括在待保护方法的所在类的执行类构造器中插入汇编指令语句以建立指令间的前驱后继关系。进一步地,所述的评估模型为:计算待保护方法的函数调用链中函数自身的调用时间除以待保护方法的自身调用、子函数调用以及相关系统API的调用时间总和,将计算值与设置的阈值比较,如果超过阈值,则将待保护方法加入转换白名单进行Dex2C转换操作,否则将待保护方法加入转换黑名单不进行Dex2C转换操作。进一步地,所述的针对于不同的汇编指令建立不同的转换逻辑,包括:根据不同的汇编指令建立三种转换逻辑:第一种常规类型指令,包括数据操作指令、返回指令、数据定义指令以及数据运算指令,这类指令根据汇编指令的语义信息直接翻译;第二种引用类型指令,包括实例操作指令、方法调用指令、字段操作指令,这类指令通过JNI函数反射调用Java层的方法来实现这些指令所表达的语义;第三种跳转类型指令,包括跳转指令,则根据指令连接关系进行作用域的划分及指令的转换。进一步地,所述的将待保护对象进行编译的同时虚拟化,包括:在LLVM编译器框架下,对待保护对象进行词法分析、语法分析,解析构建其AST树,从而生成中间表示IR,中间表示剔除了源代码与平台相关的特性,但保留了其逻辑与语义信息;虚拟指令解释器将虚拟指令划分为三种类型进行具体操作,分别为算数运算指令、数据转移指令以及控制流转移类型指令;程序调度器用于模拟CPU的执行过程,首先获取虚拟指令,对虚拟指令解码后索引到解释器,将控制权交由解释器解释该指令,之后重夺控制权并循环上述过程,直至解释所有指令;函数体替换器在中间表示的基础上对函数的函数体执行变形,首先将函数体删除并生成函数的签名,函数签名用来定位该函数所执行的虚拟指令地址,并将该函数的参数传递给虚拟指令的解释器以初始化解释器中相关虚拟寄存器。本专利技术与现有技术相比具有以下技术特点:1.本专利技术能够有效的防止Dex层被逆向破解,相比于传统的Dex层的加壳加密技术,本专利技术提出的方法通过将Dex层的代码实现通过自定义的转换器转换为本地层的C代码实现。能够有效保护核心的Java方法。2.本专利技术能够同时对Dex层的方法和本地层的方法进行防护。对于Dex层的方法,本方案通过Dex2C和基于LLVM的编译时虚拟化方案进行双重加密。对于本地层的方法,本方案通过基于LLVM的编译时虚拟化方案进行防护。恶意攻击者需要同时对两种保护方式进行深入分析和研究,这两种防护方案的组合有效提高了攻击的门槛。3.本专利技术设计的兼容性较好,首先Dex2C将用户提供的待保护方法通过自定义解析器进行解析,将Dex文件转换为C代码,属于代码级转换。后续的基于LLVM编译时虚拟化属于编译时代码级别的转换,因而不存在现有加固方案中兼容性欠佳的问题。4.本专利技术设计灵活性强,能够使用评估模型自行调配保护方案,尽可能的提高了APK的执行效率,避免了因冗余循环操作、频繁JNI调用操作所带来的性能开销。5.测试实验表明,经本专利技术保护后的应用程序相较于保护前的应用程序,APK包的体积平均减少了13.53%,Dex文件的体积平均减少了20.72%,而CPU的使用率减少了12.51%。这是因为抽取了Dex层的方法实现,转而用本地层的实现取代了Dex层的实现,而且在本地层上的运行要比在DVM虚拟机上的运行开销小;本方法能够有效抵御恶意攻击者的静态分析和动态分析。附图说明图1是本专利技术的流程图;图2是本专利技术的系统框架图;图3(a)是Dex文件格式的示意图;图3(b)是Dalvik汇编指令集的所有类型。图4(a)是对invoke-static汇编指令转换前后的示例图;图4(b)是对if...lez汇编指令转换前后的示例图;图5(a)是生成的Smali指本文档来自技高网
...

【技术保护点】
1.基于Dex2C与LLVM的Android应用程序保护方法,其特征在于,包括以下步骤:从待保护的应用程序安装包中获取Dex文件,按照文件格式对其进行逐层解析,得到Dex文件中的每一条汇编指令的能够恢复到C语言代码的所有必要信息并存储于数据结构中;确定待保护的方法并将其修改为本地层类型方法然后重写Dex文件,进行转换前预处理工作;建立评估模型,将待保护方法运行时的核心调用时间占比作为评估模型的决策依据,通过设置阈值,来判定是否将待保护的方法进行Dex2C转换,从而尽可能避免频繁的反射调用和冗余的循环操作;如待保护的方法进行Dex2C转换,则将存储在所述数据结构中对应于待保护方法的必要信息转换为C语言代码,转换过程中针对于不同的汇编指令建立不同的转换逻辑,并恢复汇编指令前驱、后继之间的连接关系,同时保证汇编指令类型正确恢复、数据传递的一致性;将转换后的C代码作为待保护对象;如待保护的方法不进行Dex2C转换,则将待保护的应用程序安装包中的So文件里的入口函数作为待保护对象;将待保护对象进行编译的同时虚拟化,生成虚拟化后的二进制So文件,进行重打包、签名,生成保护后的应用程序。

【技术特征摘要】
1.基于Dex2C与LLVM的Android应用程序保护方法,其特征在于,包括以下步骤:从待保护的应用程序安装包中获取Dex文件,按照文件格式对其进行逐层解析,得到Dex文件中的每一条汇编指令的能够恢复到C语言代码的所有必要信息并存储于数据结构中;确定待保护的方法并将其修改为本地层类型方法然后重写Dex文件,进行转换前预处理工作;建立评估模型,将待保护方法运行时的核心调用时间占比作为评估模型的决策依据,通过设置阈值,来判定是否将待保护的方法进行Dex2C转换,从而尽可能避免频繁的反射调用和冗余的循环操作;如待保护的方法进行Dex2C转换,则将存储在所述数据结构中对应于待保护方法的必要信息转换为C语言代码,转换过程中针对于不同的汇编指令建立不同的转换逻辑,并恢复汇编指令前驱、后继之间的连接关系,同时保证汇编指令类型正确恢复、数据传递的一致性;将转换后的C代码作为待保护对象;如待保护的方法不进行Dex2C转换,则将待保护的应用程序安装包中的So文件里的入口函数作为待保护对象;将待保护对象进行编译的同时虚拟化,生成虚拟化后的二进制So文件,进行重打包、签名,生成保护后的应用程序。2.如权利要求1所述的基于Dex2C与LLVM的Android应用程序保护方法,其特征在于,所述的汇编指令的能够恢复到C语言代码的所有必要信息,包括类中方法、字段的描述以及每条指令的细节信息;所述的数据结构用于存放每条汇编指令所涉及的寄存器的个数及内容、所属类的信息、参数信息等。3.如权利要求1所述的基于Dex2C与LLVM的Android应用程序保护方法,其特征在于,所述的转换前预处理工作,包括在待保护方法的所在类的执行类构造器中插入汇编指令语句以建立指令间的前驱后继关系。4.如权利要求1所述的基于Dex2C与LLVM的Android应用程序保护方法,其特征在于,所述的评...

【专利技术属性】
技术研发人员:汤战勇何中凯张宇翔王薇龚晓庆陈晓江房鼎益
申请(专利权)人:西北大学
类型:发明
国别省市:陕西,61

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1