基于双重ARM指令虚拟的Android应用程序保护方法与流程

文档序号:13446652阅读:418来源:国知局
本发明属于android应用程序中so(sharedobject的缩写)文件加固的
技术领域
:,具体涉及基于双重arm指令虚拟的android应用程序保护方法。
背景技术
::近年来,随着android智能设备的普及和对应设备上面的应用程序数量的日益增长,越来越多的攻击者和不发分子将关注点集中于移动平台上的应用程序,因此随之而来的是逆向分析和二次打包的现象愈发严重,给程序的开发厂商和使用者带来了巨大的经济利益损失。因此为了减少开发厂商的不必要的经济损失,维护使用者的合法权益,急需对app(application的简写)进行有效的保护加固。目前市场上对app的保护主要是在对于dex(apk中的classes.dex的简称,android应用程序下的可执行文件)的加固,并且在目前最新dex的加固技术采用了虚拟化技术后,整个对虚拟化结果解释的程序将被转移到本地层,因此对于本地层so文件的保护显得越来越重要。然而,目前对于so文件的保护主要还是处于加壳和混淆阶段,加壳主要使用upx加壳(theultimatepackerforexecutables)或者通过重写loader的方式进行加壳保护,加壳程序能够阻止一定的静态分析,但是不能有效地防动态调试分析,攻击者如果比较了解整个elflinker的加载过程,就能准确地找到脱壳的时机点进行脱壳,也就是说加壳不能从本质上来应对动态分析和有经验的逆向攻击者。另外一种针对于so文件的常见保护方式便是混淆,目前混淆主要是采用基于源码的ollvm混淆,虽然ollvm混淆在表面看起来增大了控制流的复杂度,但是过多的控制流会影响程序本身的性能,并且基于源码有很大的局限性,很多时候是在二进制的基础上进行保护的,操作性比较弱。虽然目前有了对于so文件的虚拟化保护技术,单从虚拟化保护后的效果来看这种方式确实能够增大动态分析的成本,但是在手机平板这样一个设备前提上,这种方式将引进很大的性能开销,不具有通用性和可扩展性,造成这种方式至今为止没有应用到市场。因此急需一种在保护后程序性能开销不大的情况下的既能够防止静态分析又能够广泛防止动态分析的应用程序保护方法。技术实现要素:针对上述对于本地层文件保护存在不足的情况,本文提出并设计一个基于双重arm(advancedreducedinstructionsetcomputermachines)指令虚拟的android应用程序保护方法,其核心思想是通过基于栈的arm指令虚拟化保护技术和指令编译虚拟化保护技术的结合来提升保护后程序的安全性并同时保证程序的执行效率。arm指令虚拟机保护利用代码虚拟化技术,将应用程序的原始指令(这里是arm指令)转换成一种自定义的虚拟指令,在程序执行时,这些虚拟指令被一个虚拟解释器逐条解释执行,从而实现原始指令的功能。考虑到vmp(virtualmachineprotection,指代arm指令虚拟化保护技术)保护后的指令在手机移动设备上所带来的性能损耗,其中部分指令通过vop(virtualopcodeprotection,指代指令编译虚拟化保护技术)进行编译虚拟,这样在多重虚拟保护后的本地层文件既能够在牺牲性能和开销不大的情况下有效地保护android应用程序本地层文件中的关键代码,增加保护后文件的逆向成本,同时又能够对dex虚拟机中的解释器起到间接的保护作用。为达到上述目的,本发明采用如下技术方案:基于双重arm指令虚拟的android应用程序保护方法,包括以下步骤:查找so文件中需要进行保护的关键代码段,所述需要进行保护的关键代码段包括需要vop保护的关键代码段和需要vmp保护的关键代码段;对需要vop保护的关键代码段进行hex抽取和映射虚拟,形成vop虚拟机so文件;对需要vop保护的关键代码段进行加密处理,然后利用cydiasubstrate框架对加密后的需要vop保护的关键代码段进行hook替换使vop虚拟机so文件中的虚拟指令码替换加密后的需要vop保护的关键代码段所对应的so文件中被加密的代码;对需要vmp保护的关键代码段进行指令虚拟,形成具有虚拟节的保护后的vmp虚拟机so文件;使vmp虚拟机so文件中的驱动数据替换需要vmp保护的关键代码段所对应的so文件中的代码。进一步地,对需要vop保护的关键代码段进行hex抽取和映射虚拟,形成vop虚拟机so文件,包括:根据开发者提供的标签进行查找,定位到vop标签标记的关键代码段,得到需要vop保护的关键代码段;对需要vop保护的关键代码段进行hex抽取,将抽取后的结果分别使用自定义的映射规则进行映射变换,使需要vop保护的关键代码段中的每一个代码按照映射规则对应一个虚拟指令码;与此同时,自定义用于指令读取以及解释所述虚拟指令码的vop解释引擎,该vop解释引擎根据虚拟指令码调用相应的处理函数以等同实现虚拟指令码对应的需要vop保护的关键代码段中代码的功能;将虚拟指令码、解释引擎加入到需要vop保护的关键代码段所对应的so文件中进行编译,形成vop虚拟机so文件。进一步地,对需要vop保护的关键代码段进行加密处理,然后利用cydiasubstrate框架对加密后的需要vop保护的关键代码段进行hook替换使vop虚拟机so文件中的虚拟指令码替换加密后的需要vop保护的关键代码段所对应的so文件中被加密的代码,包括:在cydiasubstrate框架下,加载vop虚拟机so文件,对原vop虚拟机so文件中加密过的关键代码的方法名进行查找;利用cydiasubstrate框架提供的内联hook机制,根据vop标签标记的关键代码段的方法的符号地址,在原vop虚拟机so文件加载到内存中之后,在vop标签标记的关键代码段的开始处完成跳转替换,跳转到vop虚拟机so文件中的虚拟指令码处;当执行完vop虚拟机so文件中虚拟指令码之后,跳回到原vop虚拟机so文件中。进一步地,对需要vmp保护的关键代码段进行指令虚拟,形成具有虚拟节的保护后的vmp虚拟机so文件,包括:根据开发者提供的标签进行查找,定位到vmp标签标记的关键代码段,得到vmp关键代码段,需要vmp保护的关键代码段,进行反汇编、指令虚拟,使需要vmp保护的关键代码段中的每一个代码按照映射规则对应一个虚拟指令码,将虚拟指令码的每一条指令虚拟表示为多个驱动数据;与此同时,自定义用于驱动数据读取以及解释所述驱动数据的vmp解释引擎,该vmp解释引擎根据驱动数据的不同动态在原子操作指令集合中查找并选择对应的原子操作指令来解释驱动数据,将驱动数据、vmp解释引擎加入到so文件中进行组合,形成具有虚拟节的保护后的vmp虚拟机so文件。与现有技术相比,本发明具有以下技术效果:(1)本发明结合两种不同的虚拟机保护思想,将两者的保护优势最大化,极大地增加了逆向者的攻击成本以及保护后程序的复杂性;(2)本发明设计的虚拟机灵活性高,扩展性强,由于虚拟解器是自定义的,因此容易控制保护后代码的扩展性和复杂度;另外,使用者完全可以根据自己的需求调整虚拟指令保护以及arm指令虚拟机保护的关键代码段的位置和比例,做到动态调控的效果;(3)本发明对于vop保护技术,由于对本地层so中的关键代码进行了加密操作,并且之后并没有内存中还原,故而本发明可以防止攻击者通过动态调试分析dump出还原后的so文件;于此同时,动态hook修复,使得目标so利用dump永远是不可能正确的;(4)本发明对于vmp保护技术,由于vmp是属于指令级别的虚拟机,攻击者只能从汇编层面去突破,然后arm指令虚拟机的调度逻辑复杂,逆向者想要弄清所有的映射规则是非常困难的,因此不管是在防止静态分析还是动态调试上arm指令虚拟机都有突出的表现;(5)本发明在编译时虚拟保护技术(vop)和arm指令虚拟机保护技术(vmp)是相对于软件保护壳技术的发展,具有不容易被识别和排除的特点,以及传统软件保护壳不具备的优点,防篡改防破解能力强。并且vop和vmp属于不同层级上的虚拟机技术-源码级别和指令级别。他们分别有种两套不同的映射规则和解释规则。因此,破解两套映射规则对于攻击者来说存在相当大的挑战;(6)本发明中使用的是编译时虚拟和arm指令虚拟机相结合的思想,因此这种思想可以兼顾系统的兼容性保护强度以及程序的运行效率等问题。附图说明图1是本发明的流程图;图2是本发明的整体系统框架图;图3(a)是对指令采用vmp保护前的节的分布;图3(b)是对指令采用vmp保护后的节的分布;图4(a)是对乘法函数采用vop保护前的函数表现;图4(b)是对乘法函数采用vop保护后的函数表现。具体实施方式下面通过附图和实施例对本发明作进一步说明。实施例1本实施例提出了一种基于双重arm指令虚拟的android应用程序保护方法,包括以下步骤:步骤1,输入待保护的android本地层动态链接库文件,通常为.so文件格式,称为so文件;查找so文件中需要进行保护的关键代码段,所述需要进行保护的关键代码段包括需要vop保护的关键代码段和需要vmp保护的关键代码段;步骤2,对需要vop保护的关键代码段进行hex抽取和映射虚拟,形成vop虚拟机so文件;对需要vop保护的关键代码段进行加密处理,然后利用cydiasubstrate框架对加密后的需要vop保护的关键代码段进行hook替换使vop虚拟机so文件中的虚拟指令码替换加密后的需要vop保护的关键代码段所对应的so文件中被加密的代码;步骤3,对需要vmp保护的关键代码段进行指令虚拟,形成具有虚拟节的保护后的vmp虚拟机so文件。如图2所示,本实施例中,input为需要进行保护的关键代码段的arm指令,本发明首先根据开发者提供的标签进行查找定位到关键代码段,如图中左边方框内所示,左边方框中上面的关键代码段为需要vmp保护的关键代码段,下面的关键代码段为需要vop保护的关键代码段,分别应用vmp和vop虚拟机方法进行保护。vmp利用指令虚拟技术将需要vmp保护的关键代码段虚拟为一段虚拟指令码,如图2所示为一段需要vmp保护的关键代码段通过指令虚拟为一段虚拟指令码的过程:首先抽取关键的arm指令:movro#01;movr1#01;addror1;将上述arm指令通过指令虚拟得到的虚拟指令码为:load#01;storer0;load#01;storer1。而vop是自定义映射规则,指的是自行设置一套映射规则,使得能够对每一条代码的arm指令都根据这一映射规则生成相应的虚拟指令码,根据发明人前期申请的
专利名称::为“一种基于elf感染的android本地曾指令编译虚拟化加壳方法”中有详细介绍。共用一套映射规则的方式可以很大程度上减少设计上的复杂度,但是安全性也会降低,所以本发明也可以采取两套不同的映射规则,实现两套虚拟机制相互隔离,提升虚拟机自身的安全性和防破解能力。不同的是需要vmp保护的关键代码段映射为一段虚拟指令集后还要将虚拟指令码的每一条指令虚拟表示为多个驱动数据,如图2,上述虚拟指令码load#01虚拟表示为驱动数据即为01010200;由于vop虚拟机so文件与vmp虚拟机so文件中的解释引擎不同,现分别进行说明:对于vop虚拟机so文件:在对需要vop保护的关键代码段进行hex抽取和映射虚拟,形成vop虚拟机so文件的同时,自定义用于指令读取以及解释所述虚拟指令码的vop解释引擎,该vop解释引擎类似于一个cpu,是一个能够自动完成指令读取以及指令解释执行的调度器,其调度的过程具体如下:首先读取虚拟指令码,根据虚拟指令码去调用相应的处理函数(高级语言)进行需要vop保护的关键代码段中原代码的等同执行。在此之后,将包含有虚拟指令码、vop解释引擎的虚拟新节加入到原需要vop保护的关键代码段所对应的so文件中进行编译,生成vop虚拟机so文件libvm.so。对于vmp虚拟机so文件:根据开发者提供的标签进行查找,定位到vmp标签标记的关键代码段,得到vmp关键代码段,需要vmp保护的关键代码段,进行反汇编、指令虚拟,使需要vmp保护的关键代码段中的每一个代码按照映射规则对应一个虚拟指令码,将虚拟指令码的每一条指令虚拟表示为多个驱动数据;与此同时,自定义用于驱动数据读取以及解释所述驱动数据的vmp解释引擎,该vmp解释引擎类似于一个cpu,能够自动完成读取驱动数据并对驱动数据进行解释,vmp解释引擎包括dispatcher和handler两个核心模块,vmp解释引擎每读取到一个驱动数据,就会跳转到dispatcher,dispatcher根据驱动数据的不同动态在handler的地址表中查找并选择对应的handler来解释读取到的驱动数据,由于一条arm指令可对应多个驱动数据,因此存在多个dispatcher;这种arm指令和驱动数据之间一对多的不定关系,带来的好处是逆向者在尝试突破虚拟机的映射关系时很难找到一个通用的办法。其中,dispatcher是cpu执行的调度器,handler是原子操作指令的集合,一个或者多个handler共同负责一条本地指令的解释。该vmp解释引擎根据驱动数据的不同动态在原子操作指令集合中查找并选择对应的原子操作指令来解释驱动数据,将驱动数据、vmp解释引擎加入到so文件中进行组合,形成具有虚拟节的保护后的vmp虚拟机so文件。由于arm指令的种类繁多,不可能为每一条具体的指令设计一条handler。这种方式会占用相当大的程序空间,每一个handler的利用率也不高。在本发明中,发明人将指令的类型分为数据传输指令,算术和逻辑运算指令,跳转指令,不可模拟指令。其中跳转指令进一步分为长跳转和短跳转,分别用来应对跳转在虚拟机范围内和跳出虚拟机范围的情况;另外,为了使我们设计的指令集具有图灵完备性,对于某些特殊指令将被定义为不可模拟指令,并通过特殊的虚拟指令进行模拟。在vmp中,其核心思想是在程序执行时使用自定义的虚拟解释器解释来还原与目标代码等价的逻辑功能,使得攻击者想要逆向分析应用的核心逻辑,就必须先分析突破虚拟解释器和虚拟指令集的语义和逻辑,因此能大大增加逆向分析的难度,同时考虑到arm指令虚拟存在的性能开销问题以及对不同版本的系统和不同厂家存在的兼容性问题;图3(a)是对指令采用vmp保护前的节的分布;可以看到的是一个正常的elf文件的节的分布,主要包括.plt/.got(动态链接的跳转表和全局入口表);.text(表示可执行代码段);.data(已经初始化的全局静态变量和局部静态变量);.rodata(只读数据段);.bss(未初始化的全局变量和局部静态变量);(.init_array/.fini_array)程序初始化与终结代码段。.abs(标识不该被重定位的符号)。图3(b)是对指令采用vmp保护后的节的分布;可以看到在图(a)的基础上多了.nisl这一个节,这个节表示虚拟机so文件,即包含虚拟机功能的一个节。本专利进一步提出了编译虚拟化保护(vop)的思想,vop同样也是采用虚拟机的思想,只是整个调度过程是在高级语言的层面进行维护执行。最后采用内联hook的机制,在java层函数对待虚拟保护的关键函数进行调用时跳转到编译解释的虚拟机文件处对指令进行解释执行,执行完以后跳回到原来的地方继续执行。保障虚拟化保护后的apk能够正常的运行。本发明将vmp和vop相结合,做到两个虚拟机的组合利用,充分保障了两虚拟保护技术优势的最大化。图4(a)是对乘法函数采用vop保护前的函数表现;可以看到在vop保护前的乘法函数的指令分布,可以看到指令仅仅是“mulr0,r1,r0”一句乘法指令,这个算法对于攻击者是很显而易见的。图4(b)是对乘法函数采用vop保护后的函数表现,可以看到的是在运行的过程中通过hook技术对函数进行了替换,表现为了一个经过vop处理以后的一个表示乘法运算的复杂的算法,这样就起到了保护算法的效果。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1