买专利,只认龙图腾
首页 专利交易 科技果 科技人才 科技服务 商标交易 会员权益 IP管家助手 需求市场 关于龙图腾
 /  免费注册
到顶部 到底部
清空 搜索

【发明授权】一种基于ELF感染的Android本地层指令编译虚拟化加壳方法_西北大学_201710453423.2 

申请/专利权人:西北大学

申请日:2017-06-15

公开(公告)日:2020-05-19

公开(公告)号:CN107480476B

主分类号:G06F21/12(20130101)

分类号:G06F21/12(20130101)

优先权:

专利状态码:失效-未缴年费专利权终止

法律状态:2022.05.27#未缴年费专利权终止;2018.01.09#实质审查的生效;2017.12.15#公开

摘要:本发明公开了一种基于ELF感染的Android本地层指令编译虚拟化加壳方法,该方法对待保护的so文件进行Hex抽取和映射虚拟,形成虚拟机so文件,并对so文件的关键代码段进行加密,形成加密后的so文件;利用虚拟机so文件对加密后的so文件进行ELF感染,形成感染后的so文件;利用CydiaSubstrate框架对加密后so文件进行Hook替换,使虚拟机so文件中的虚拟指令码替换加密后so文件中被加密的代码。本发明中使用的是编译时虚拟的思想,这一思想不涉及不同ARM平台版本的问题,因此具有良好的兼容性,能够防止内存Dump分析同时增大了攻击者的攻击成本。

主权项:1.一种基于ELF感染的Android本地层指令编译虚拟化加壳方法,其特征在于,包括以下步骤:查找so文件中需要进行保护的关键代码段,对关键代码段进行指令Hex抽取和映射虚拟,形成虚拟机so文件;对所述的需要保护的关键代码段进行加密处理,得到关键代码段被加密后的so文件;利用虚拟机so文件对加密后的so文件进行ELF感染,形成感染后的so文件;利用CydiaSubstrate框架对加密后so文件进行Hook替换,使虚拟机so文件中的虚拟指令码替换加密后so文件中被加密的代码;所述的查找so文件中需要进行保护的关键代码段,对关键代码段进行指令Hex抽取和映射虚拟,形成虚拟机so文件,包括:根据开发者提供的标签进行查找,定位到关键代码段,对关键代码段进行Hex抽取,将抽取后的结果使用自定义的映射规则进行映射变换,使关键代码段中的每一个代码按照映射规则对应一个虚拟指令码;与此同时,自定义用于指令读取以及解释所述虚拟指令码的解释引擎,该解释引擎根据虚拟指令码调用相应的处理函数以等同实现虚拟指令码对应的关键代码段中代码的功能;将虚拟指令码、解释引擎加入到so文件中进行编译,形成虚拟机so文件;利用CydiaSubstrate框架对加密后的so文件进行Hook替换,使虚拟机so文件中的虚拟指令码替换加密后so文件中被加密的代码,包括:在CydiaSubstrate框架下,加载感染后的so文件,对该so文件中加密过的关键代码的方法名进行查找;利用框架提供的内联Hook机制,根据关键代码的方法的符号地址,在原so文件加载到内存中之后,在关键代码段的开始处完成跳转替换,跳转到虚拟机so文件中的虚拟指令码处;当执行完虚拟机so文件中虚拟指令码之后,跳回到原so文件。

全文数据:一种基于ELF感染的Android本地层指令编译虚拟化加壳方法技术领域[0001]本发明属于Android应用程序加固技术领域,具体涉及一种基于ELF感染的本地层so文件的编译时虚拟化加壳保护,并结合CydiaSubstrate框架进行hook实现核心功能正常调用的保护技术。背景技术[0002]近年来,随着手机应用的蓬勃发展,每年的产量呈指数式的增长,据统计,目前我国主要的应用商店的APP已累计超过1000万。APP在给人们生活带来方便的同时,也给不法分子造就了可乘之机,严重影响APP产业的健康发展。[0003]对于APP的保护由最初的dex的简单加固到目前对dex的抽取加固,保护的对象也由dex层转移到了本地层,同时开发者将APP很多的核心算法写到了本地层,从而保护本地层成为了AndroidAPP代码保护的重要趋势。[0004]现有的对于本地层文件的保护主要有UPX加壳、ELF文件Section段加密和0LLVM混淆,这些Android本地层保护方法只是能够从表面上起到阻止静态分析的作用,但都不能从本质上来应对动态分析和有经验的逆向攻击者。有经验的逆向攻击者进行动态分析调试,选择合适的时机对在内存中还原的so进行Dump;除此之外,现有的0LLVM混淆主要是针对源码级别的代码编译混淆,虽然保护力度大,但是可操作性弱。因此以上方法在Android本地层so保护时都存在一定的局限性,而Android本地层的so文件又通常是整个AndroidApp中核心逻辑代码的重要实现部分,所以亟待一种既能够防止内存Dump分析同时又能够兼顾以上保护优点的方法。发明内容[0005]针对上述现有技术中存在的问题,本发明的目的在于,提供一种将ARM指令在编译时就进行虚拟化,以使得在增加逻辑复杂性的同时,也能够在编译的时候增加编译混淆方法。[0006]为了实现上述任务,本发明采用以下技术方案:[0007]一种基于ELF感染的Android本地层指令编译虚拟化加壳方法,包括以下步骤:[0008]查找so文件中需要进行保护的关键代码段,对关键代码段进行指令Hex抽取和映射虚拟,形成虚拟机so文件;对所述的需要保护的关键代码段进行加密处理,得到关键代码段被加密后的so文件;[0009]利用虚拟机so文件对加密后的so文件进行ELF感染,形成感染后的so文件;利用CydiaSubstrate框架对加密后so文件进行Hook替换,使虚拟机so文件中的虚拟指令码替换加密后so文件中被加密的代码。[0010]进一步地,所述的查找so文件中需要进行保护的关键代码段,对关键代码段进行指令Hex抽取和映射虚拟,形成虚拟机so文件,包括:[0011]根据开发者提供的标签进行查找,定位到关键代码段,对关键代码段进行Hex抽取,将抽取后的结果使用自定义的映射规则进行映射变换,使关键代码段中的每一个代码按照映射规则对应一个虚拟指令码;与此同时,自定义用于指令读取以及解释所述虚拟指令码的解释引擎,该解释引擎根据虚拟指令码调用相应的处理函数以等同实现虚拟指令码对应的关键代码段中代码的功能;将虚拟指令码、解释引擎加入到SO文件中进行编译,形成虚拟机SO文件。[0012]进一步地,利用虚拟机so文件对加密后的so文件进行ELF感染,形成感染后的so文件,包括:[0013]对于加密后的so文件,修改该so文件的字符串表,添加所述的虚拟机so文件;在30文件的程序头表中添加程序加载时的内存映射信息;修改so文件中程序段表和动态段,使二者指向虚拟机so文件。[0014]进一步地,利用CydiaSubstrate框架对加密后的so文件进行Hook替换,使虚拟机so文件中的虚拟指令码替换加密后so文件中被加密的代码,包括:[0015]在CydiaSubstrate框架下,加载感染后的so文件,对该so文件中加密过的关键代码的方法名进行查找;利用框架提供的内联Hook机制,根据关键代码的方法的符号地址,在原so文件加载到内存中之后,在关键代码段的开始处完成跳转替换,跳转到虚拟机so文件中的虚拟指令码处;当执行完虚拟机so文件中虚拟指令码之后,跳回到原so文件。[0016]本发明与现有技术相比具有以下技术特点:[0017]1•本发明极大地增加了攻击者的攻击成本以及保护程序的复杂性;[0018]2•由于对本地层so中的关键代码进行了加密操作,并且之后并没有内存中还原,故而本发明可以防止攻击者通过动态调试分析dump出还原后的so文件;于此同时,动态Hook修复,使得目标so利用dump永远是不可能正确的;[0019]3•本发明中使用的是编译时虚拟的思想,这一思想不涉及不同ARM平台版本的问题,因此具有良好的兼容性,同时,其性能也明显优于其他方法。附图说明[0020]图1为本发明方法的流程图;[0021]图2为实施例中libnative.so文件的保护过程;[0022]图3为代码的原始指令到虚拟指令码的映射规则图;[0023]图4中(a和(b分别是对待保护的so文件中的关键代码段加密前后的文件对比图;[0024]图5为虚拟机so文件被注入后运行时优先加载虚拟机so文件的示意图;[0025]图6是Hook修复的示意图;具体实施方式[0026]本发明提出了一种基于ELF感染的Android本地层指令编译虚拟化加壳方法,包括以下步骤:[0027]步骤1,输入待保护的Android本地层动态链接库文件,通常为.so文件格式,称为so文件;查找so文件中需要进行保护的关键代码段,对关键代码段进行指令Hex抽取和映射虚拟,形成虚拟机so文件;[0028]如图2所示,本实施例中,1ibnative•so为待保护的so文件,本发明首先根据开发者提供的标签进行查找定位到关键代码段,如图中虚线区域所示,对该部分代码进行ffix抽取,将抽取之后的结果使用自定义的映射规则进行映射变换。[0029]所谓的自定义映射规则,指的是自行设置一套映射规则,使得能够对待保护的关键代码段中的每一条代码的原始arm指令都根据这一映射规则生成相应的虚拟指令码VCode。如图3所示,为一段关键代码映射为一段虚拟指令集的过程:[0030]首先抽取出关键的ARM指令的HEX码,根据字节码的语义,E3A0对应着A000;0001对应着1000,最后真实的字节码E3A00001对应着虚拟字节码A0001000;其他的类似,最后就会生成对应的虚拟字节码。[0031]与此同时,自定义用于指令读取以及解释所述的虚拟指令码VCode的解释引擎,该解释引擎就类似于一个CPU,是一个能够自动完成指令读取以及指令解释执行的调度器,其调度的过程具体如下:首先读取虚拟指令码VCode,根据VCode去调用相应的处理函数进行关键代码段中原代码的等同执行。在此之后,将包含有VCode,解释引擎等的虚拟新节加入原so文件中进行编译,生成虚拟机so文件libvm.so〇[0032]本发明是要对Androidso文件中的关键代码进行指令虚拟化,因此需要自定义一套字节码,然后使用一个解释引擎完成指令的读取以及运行。[0033]前面提到的关键代码段中的代码与虚拟指令码之间的映射规则的建立方法是多样的,不同的本领域技术人员完全可以自定义不同的映射规则;为了保证映射规则的健壮性,发明人提供了一种具体的映射规则以供参考:[0034]1-1先将arm架构上的汇编指令进行分类,主要分为数据传送指令、算数指令、控制转移指令等;[0035]1-2对于每一类指令分别建立如下映射规则,仅以几条关键指令为例:[0036]a.数据传送指令:mov-0xa0[0037]b.算数指令:add_0xal[0038]c.控制转移指令:return-0xa2[0039]即,将每一类指令指定一个与其对应的虚拟指令。[0040]1_3调度规则的设计:本方案根据以上映射规则进行功能替换,设置相应的处理函数去代替原指令的执行,即利用不同的处理处理函数来实现与原指令相同的功能;以mov指令来说,在读取其虚拟指令0xa0时,转而去调用其处理函数vm_mov,该处理函数所实现的功能是与mov指令一致的,从而通过处理函数的组合来实现原代码的功能。处理函数的设置是现有的技术手段,在此不赘述。[0041]1-4解释引擎的设计:在该函数中完成寄存器以及立即数的传送,其中建立Vcode和Handler的一个映射关系,对于不同代码的虚拟Vcode进行不同的方法的映射,一个个进行读取解释。[0042]步骤2,针对于原so文件,对所述的需要保护的关键代码段进行加密处理,得到关键代码段被加密后的so文件;这里的加密主要是指对于so文件,根据其自身的ELF文件格式,找到其中待保护的关键代码段,然后选择一种加密方法,例如RSA算法、异或算法等进行加密处理,生成加密后的so文件。[0043]如图2所示,本实例中,对待保护的原1ibnative.so的关键代码段进行加密处理,生成加峦版本so文件libnative_cipher.se,该步骤旨在增加攻击者在静态分析时的逆向攻击的难度和复杂度。[0044]2一1解析待加密libnative.so文件的ELF文件头,获取其中程序头表的程序头内容在整个so文件的偏移值以及段表描述符的大小的值和程序头表中程序头的个数这些字段的信息。[0045]2—2根据so文件程序头部的结构中的段类型描述符得到ELF文件动态段的偏移值和大小;[0046]2-3根据2-2中得到的动态段,遍历动态段找到动态符号表、动态符号字符串表、符号哈希表文件中的偏移和动态符号字符串表的大小;[0047]2-4根据待保护的so文件中关键代码段中的函数的方法名,计算所对应的哈希值;[0048]2-5根据2-4中的哈希值,找到哈希表中对应的ELF文件的解析规则找到对应的字符串值,然后与函数名进行比较,若不等,根据ELF解析规则找下一个符号值,直到找到为止;[0049]2-6根据2-5中得到的结果使用异或算法操作对其进行加密处理。[0050]步骤3,利用虚拟机so文件对加密后的so文件进行ELF感染,形成感染后的so文件;该步骤主要是在加密后的so文件中,注入虚拟机壳,即步骤1得到的虚拟机so文件,使得原so文件在实际加载运行时先去执行这个虚拟机壳,再执行原逻辑,以此实现关键代码段的保护和隐藏,具体步骤包括:[0051]3-1对于加密后的so文件,修改该so文件的字符串表,添加所述的虚拟机3〇文件;为了防止因添加操作所引起的一系列文件偏移的改变,将添加过后的字符串表移至整个so文件的末尾;[0052]3-2在so文件的程序头表中添加程序加载时的内存映射信息;用于完成新字符串表在内存的映射,与3-1中类似,把添加了数据的这部分表移至整个so文件末尾;[0053]3_3修改so文件中程序段表和动态段,使二者指向虚拟机so文件。[0054]在上面的操作完成后,等原so文件加载时的时候会优先指向注入的so文件,为下面的Hook步骤做好准备。[0055]步骤4,利用CydiaSubstrate框架对加密后的so文件进行Hook替换,在加密的so文件加载到内存中后,在此时利用内存也将编译形成的虚拟机so文件也加载到内存中,利用虚拟机so文件中的虚拟指令码替换加密后so文件中被加密的原关键代码段中的代码。等执行完Hook以后,此时上层调用的时候,调用的是虚拟机so文件的关键代码对应的虚拟指令码。[0056]这一步是为了保证在程序动态执行时不还原原so文件关键代码的前提下,实现核心功能,具体是第一步是判断要Hook的位置点为ARM指令还是Thumb指令,第二步是构造跳转指令,也就是构造要跳转到自己要执行的函数处的指令。第三步是就是替换函数的逻辑的编写,比如上面提到的虚拟机so文件中的虚拟指令码,最后是完成指令的修正,等替换完以后要保证能够跳回去继续执行原有程序逻辑。本实施例的具体步骤如下:[0057]4-1加载感染后的so文件,在CydiaSubstrate框架下,编写Hook代码,通过dlopen系统函数加载被加密过关键代码段的libnative_cipher.so文件,通过dlsym系统函数对11如1^代一^浊31'.30中加密过的关键代码的方法名进行查找,为后面的110^替换做好准备;[0058]4-2通过CydiaSubstrate框架提供的内联Hook机制,通过上一步中得到的关键函数的方法的符号地址,根据关键代码的方法的符号地址,在原so文件加载到内存中之后,在关键代码段的开始处完成跳转替换,跳转到虚拟机so文件libvm.so中的虚拟指令码处;当执行完虚拟机so文件中虚拟指令码之后,跳回到原so文件。继续执行接下来的原程序逻辑。[0059]因此,在最终Java层调用关键方法时,函数替换会自动完成,并执行核心操作。[0060]本发明中需要将待保护的so文件进行加密,但要同时不破坏APP原有的核心功能的实现,所以如何在不影响java层调用的情况下选择合适的时机对保护后的方法进行Hook替换是所必须考虑的一个难点。[0061]本方案中H〇〇k替换时间的选定,根据的是在java层调用函数的时机明显是晚于本地层函数的Hook替换这一机制设计的,具体的理解步骤为:[0062]1开始时通过loadlibrary加载加密后的so文件到内存中,但这个so文件很明显方法是加密的不能运行的。[0063]⑵通过如面ELF感染的方法,对加密过的so文件]_ibnative_cipher.so进行感染,优先加载虚拟机libvm.so文件。[00M]⑶这时候会优先的加载虚拟机so,此时加密过的so通过loadlibrary也加载到了内存中,这时候运用Cydiasubstrator的机制进行HOOK方法替换。[0065]4java层进行调用本地层的重要方法时此时已经完成了HOOK替换,调用的不再是加密过的so文件libnative_cipher.so中加密处理过的方法,而是HOOK替换后的虚拟机中的方法。[0066]通过以上的运行加载时机可以完美的解决Hook替换时间的选定问题。[0067]仿真实验:[0068]实验环境:[0069]硬件:谷歌Nexus5手机[0070]软件:Android4.4.2[0071]实验过程:[0072]1•首先编写一个测试的APK,通过Toast显示在本地层进行某个算法得到的数值;[0073]2•根据标签对待保护的so中的关键代码进行抽取、映射并进行虚拟,最后编译形成一个编译虚拟的1ibHookNative.cy.so;[0074]3.对待保护的中的关键代码的进行加密处理,如图四所示ab分别是加密前后的文件对比。可见IDA对加密后的关键代码进行错误的解析。[0075]4•对处理后的关键本地层文件进行ELF感染,使得AndroidJava层在调用本地层的函数时能够优先加载虚拟机1ibHookNative•cy.so,此时加密过的so已经通过java层载入进内存中。这里借助的是CydiaSubstrator框架进行Hook,并修复。如图5所示是优先加载的虚拟so,和图6所;^进彳丁的Hook修复。[0076]5•此时由于Java层的运行时机要慢很多,进行本地层方法调用时已经是替换回来的虚拟机方法,因此整个加壳系统可以完美的运行。

权利要求:1.一种基于ELF感染的Android本地层指令编译虚拟化加壳方法,其特征在于,包括以下步骤:查找so文件中需要进行保护的关键代码段,对关键代码段进行指令Hex抽取和映射虚拟,形成虚拟机so文件;对所述的需要保护的关键代码段进行加密处理,得到关键代码段被加密后的so文件;利用虚拟机SO文件对加密后的so文件进行ELF感染,形成感染后的SO文件;利用CydiaSubstrate框架对加密后so文件进行Hook替换,使虚拟机so文件中的虚拟指令码替换加密后so文件中被加密的代码。2.如权利要求1所述的基于ELF感染的Android本地层指令编译虚拟化加壳方法,其特征在于,所述的查找so文件中需要进行保护的关键代码段,对关键代码段进行指令Hex抽取和映射虚拟,形成虚拟机SO文件,包括:根据开发者提供的标签进行查找,定位到关键代码段,对关键代码段进行Hex抽取,将抽取后的结果使用自定义的映射规则进行映射变换,使关键代码段中的每一个代码按照映射规则对应一个虚拟指令码;与此同时,自定义用于指令读取以及解释所述虚拟指令码的解释引擎,该解释引擎根据虚拟指令码调用相应的处理函数以等同实现虚拟指令码对应的关键代码段中代码的功能;将虚拟指令码、解释引擎加入到so文件中进行编译,形成虚拟机so文件。3.如权利要求1所述的基于ELF感染的Android本地层指令编译虚拟化加壳方法,其特征在于,利用虚拟机so文件对加密后的so文件进行ELF感染,形成感染后的so文件,包括:对于加密后的so文件,修改该so文件的字符串表,添加所述的虚拟机so文件;在8〇文件的程序头表中添加程序加载时的内存映射信息;修改so文件中程序段表和动态段,使二者指向虚拟机SO文件。4.如权利要求1所述的基于ELF感染的Android本地层指令编译虚拟化加壳方法,其特征在于,利用CydiaSubstrate框架对加密后的so文件进行H〇〇k替换,使虚拟机so文件中的虚拟指令码替换加密后s〇文件中被加密的代码,包括:在CydiaSubstrate框架下,加载感染后的so文件,对该so文件中加密过的关键代码的方法名进行查找;利用框架提供的内联Hook机制,根据关键代码的方法的符号地址,在原so文件加载到内存中之后,在关键代码段的开始处完成跳转替换,跳转到虚拟机so文件中的虚拟指令码处;当执行完虚拟机s〇文件中虚拟指令码之后,跳回到原so文件。

百度查询: 西北大学 一种基于ELF感染的Android本地层指令编译虚拟化加壳方法

免责声明
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。