基于动态恢复so文件的Android应用加固方法与流程

文档序号:11156075阅读:524来源:国知局
本发明涉及信息安全
技术领域
:,尤其涉及一种针对动态恢复Android系统应用程序动态链接库so文件的Android应用加固方法。
背景技术
::2007年,Google公司推出了开源智能手机操作系统安卓(Android)操作系统,由于其丰富的功能和强大的定制能力,在短短几年内它便跃居为智能手机操作系统市场份额的首位。与此同时,基于Android平台的应用程序数目飞速增长。2013年7月,Google公司宣布在GooglePlay商店上架的应用程序超过一百万,GooglePlay商店成为全球最大的应用商店。随着Android系统的兴起,诸多潜在的安全问题逐渐暴露出来,信息泄露、恶意扣费、系统被破坏的事件屡见不鲜。Android安全性的研究也开始受到人们的关注。因为Android平台应用软件使用的语言是Java,传统的Java语言编写的程序很容易遭到逆向破解,导致Android应用程序其破解难度远小于其他使用编译性语言编写的程序。由此得知,Android系统在应用加固方面所面临的主要问题是应用二次打包和恶意代码插入。应用二次打包技术使得盗版应用大量普及,大大损害了开发者的利益和积极性,而恶意代码的植入使得Android用户面临隐私数据的泄漏和财产损失的风险。Android应用的黑色产业链正是因此产生,通过二次打包植入广告降低用户的体验获取利润,又或者插入恶意代码绑定设备上的私密数据进行敲诈勒索。目前,Android应用加固多数情况还执着于静态处理dex文件,也就是对dex文件进行一些细微修改来提升攻击的难度。这一类加固方法增加了可代码的阅读难度,但实质上并没有起到多少防护效果。这是因为Android平台诞生时间较短,软件保护方面的研究尚处于起步阶段,难以保护应用开发者的软件著作权与利益和广大用户的隐私安全。技术实现要素:为了克服上述现有技术的不足,本发明提供一种针对动态恢复Android系统应用程序动态链接库so文件的Android应用加固方法,该方法基于Android系统利用二进制流加密方法进行加固,对so文件中的关键代码进行加密,以达到保护Android应用程序的目的。本发明提供的技术方案是:一种基于动态恢复so文件的Android应用加固方法,针对动态恢复Android系统应用程序动态链接库so文件,通过二进制流加密方法对so文件中的关键方法(关键代码)进行加固,使得Android应用程序代码得到保护;所述加固方法包括加密过程和解密过程,具体包括如下步骤:A.针对需要保护的Android应用程序的so文件,具体设定需要加密的特定节的关键方法,对关键代码所在的节(section)进行加密,执行如下操作:A1.首先对需要保护的Android应用程序解压,获得Android应用程序中的so文件,对所述so文件进行解析;A2.读取elf文件头,根据e_shoff定位到节区头部表;A3.根据elf文件头中的e_shnum得到节区数量;A4.根据e_shoff和e_shnum读取节区头部表中的所有项;A5.通过elf文件头中的e_shstrndx项得到节表字符串表在节表中的索引,然后找到节表字符串表的偏移;A6.读取节表字符串表中的字符串将每一个节的名字保存起来;A7.比较每一个节的名字和自定义节的名字,如果匹配则通过shdr->sh_offest和shdr->sh_zie得到目标节的内容,并保存到content中;A8.设定密钥key1,使用密钥key1对步骤A7所述content进行第一次加密,得到第一次加密后的中间数据;A9.设定密钥key2,使用密钥key2对步骤A8所述中间数据进行第二次加密;A10.将二次加密后得到数据更新到so文件中,得到新的so文件;A11.压缩重新生成apk,即完成加密过程;所述重新生成的apk中包含原有的dex文件以及包含解密过程中需要用的密钥和第二次加密后的得到的数据so文件;B.开始执行Android应用程序时,对加密的so文件进行动态恢复得到关键代码,执行如下操作:B1.Android应用程序被载入内存后,执行so文件中.init_array段中的程序;B2.在内存中找到so文件在进程中的地址;B3.在so文件中查找待解密节的地址;B4.得到待解密节占用的页的大小,修改占用页的读写权限;B5.执行关键代码时,从so文件中取得密钥key2,对待解密节进行解密,得到中间代码;B6.针对步骤B5得到的中间代码,从so文件中取得密钥key1,进行第二次解密,得到最终的关键代码;B7.进行关键代码的方法调用。上述Android系统的应用程序的so文件加固方法,进一步地,所述设定节的关键代码的方法,具体包括重要算法方法、验证登陆方法、系统关键流程方法中的一个或多个。上述Android系统的应用程序的so文件加固方法,进一步地,步骤A8所述第一次加密或步骤A9所述第二次加密均可采用AES加密方法,所述AES加密方法包括采用使用AES通用加密标准的代码或使用AES的加密工具,可采用自编写的AES或现有的AES加密工具。上述Android系统的应用程序的so文件加固方法,进一步地,步骤B1所述执行so文件中的程序,具体为通过JNI调用机制调用so文件中的方法。与现有技术相比,本发明的有益效果是:现有Android应用加固多数情况还执着于静态处理dex文件,也就是对dex文件进行一些细微修改来提升攻击的难度。这一类加固方法不过是增加可代码的阅读难度,但实质上并没有其多少防护效果。利用本发明提供的技术方案,可以动态地解密so文件,将Android保护的方向由dex文件转移到了so文件。本发明提供的加固方法对关键函数进行双层加密保护,并增加了攻击者逆向分析的难度,攻击者无法拿到程序的核心代码,修改的程序也不能正常运行,可以实现对代码的完整性进行保护,有效地抵抗了静态分析,防止so文件的代码被篡改和劫持,并使得黑客不能通过反编译等工具查看Android源码,而且只对关键代码进行加密保护,保证了程序的运行效率。附图说明图1是本发明提供方法的流程框图。图2是Android应用程序中的so文件的文件组成结构图。具体实施方式下面结合附图,通过实施例进一步描述本发明,但不以任何方式限制本发明的范围。本发明提供一种针对动态恢复Android系统应用程序动态链接库so文件的加固方法,针对动态恢复Android系统应用程序动态链接库so文件,通过二进制流加密方法对so文件中的关键代码进行加固,使得Android应用程序代码得到保护;本发明提供的加固方法包括加密过程和解密过程,图1是本发明提供方法的流程框图,包括如下步骤:A.对关键代码所在节进行加密,执行如下操作:A1.解析so文件;A2.定位到特定方法所在节;A3.使用密钥key1进行第一次加密;A4.使用密钥key2进行第二次加密;A5.更新so文件;A6.计算so文件的Hash值并对Hash值进行加密,存放到dex文件中;B.对加密的代码进行解密,执行如下操作:B1.找到so文件在内存中的起始地址;B2.对so文件进行Hash值运算,将得到的结果进行加密,和dex文件中保存的值进行比较;B3.使用密钥key1进行第一次解密;B4.使用密钥key2进行第二次解密;B5进行关键代码的方法调用。本发明提供的基于Android系统二进制流加密技术的加固方法包括加密过程和解密过程;以下通过实施例说明本发明方法的具体实施:加密过程:对于需要保护的Android应用程序(apk),首先解压获得apk中的so文件,然后对so文件进行解析;开发者设定需要加密的JNI关键方法(需要加密的JNI关键方法根据开发者的需求进行判断设定,例如,某些重要算法方法,或者验证登陆方法,或者某一个系统关键流程),然后定位到需要加密的JNI的关键方法所在的自定义节;由加固者设定密钥key1(加固者需要保密,在解密的时候需要用这个密钥对密文进行解密),先使用密钥key1对关键方法的指令进行第一次加密(采用AES加密,可采用自行编写的AES加密程序,也可以使用AES的加密工具),得到第一次加密后的中间数据;然后设定密钥key2,使用密钥key2对中间数据进行第二次加密(也采用AES加密);连续两次AES加密,可增加安全性;更新so文件:将二次加密后得到数据更新到so文件中,得到新的so文件;计算新的so文件的Hash值,该值用于校验so的完整性;对Hash值进行加密(MD5加密)后存入到dex文件中;即在dex文件中加入了对so文件的校验参数;压缩重新生成apk,即完成加密过程。重新生成的apk中,包含已添加so文件的校验hash的dex文件、部分关键代码加密的so文件(是加固者提供的一段程序C程序,默认是安全的),so文件中还包含解密过程和对自身的校验过程。解密过程:开始执行程序(AES加密的apk程序),首先执行so文件中的静态段:具体地,AES加密程序被载入内存后,在程序开始执行的时候先通过JNI(JavaNativeInterface)调用机制,执行so文件中的校验和解密以及恢复代码,具体是通过Java代码调用so文件(so库)中的方法,先搜索程序内存,找到经过加密处理后需要还原的相应的类和方法。寻找时可预制一些标签在程序中,来帮助寻找需要解密的部分;然后,在内存中寻找加密代码所在节:so文件的组成结构如图2所示,so文件即ELF文件主要包括分别是ELF头(ELFheader)、程序头表(Programheadertable)、节(Section,包括.text和.rodata)和节头表(Sectionheadertable)。实际上,一个文件中不一定包含全部内容,而且位置也未必与说明顺序相同,只有ELF头的位置是固定的,其余各部分的位置、大小等信息由ELF头中的各项值来决定。寻找方法具体是:将指针跳回到so文件的起始位置,读取so文件的文件头,根据e_shoff定位到节区头部表,根据elf_shnum得到节区的数量size。从节区头部表读取size个节区项。通过elf文件头中的e_shstrndx项得到节表字符串表在节表中的索引,然后找到节表字符串表的偏移string_off。将每一个节区地址和它的字符串对应,查找和自定义加密节字符串相同的节,如果匹配则通过shdr->sh_offest和shdr->sh_zie定位得到该节的内容。Elf文件头记录了so文件其他部分在so文件中的偏移,从而可以定位到so文件其他部分所在的区域,以供进一步解析。ELF文件头部(Elf文件头)主要包括校验和以及其他结构的偏移地址和长度信息,具体见表1:表1Elf文件头记录的信息和相应含义对于so文件,计算so文件的Hash值,然后对Hash进行加密((MD5加密)),和dex文件中保存的值进行比较,如果一致,则说明程序未被修改,否则返回错误码,程序停止运行。当执行关键代码时,从so文件中取得密钥key2,对关键代码进行解密,得到中间代码。对于得到的中间代码,从so文件中取得密钥key1,进行第二次解密得到最终的关键代码;两次解密过程分别对应两次加密过程,以确保应用程序的安全。最后,实现正确安全地调用关键代码的方法。需要注意的是,公布实施例的目的在于帮助进一步理解本发明,但是本领域的技术人员可以理解:在不脱离本发明及所附权利要求的精神和范围内,各种替换和修改都是可能的。因此,本发明不应局限于实施例所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1