基于dex与so文件动态执行的Android应用加固方法技术

技术编号:14113637 阅读:93 留言:0更新日期:2016-12-07 10:58
本发明专利技术公布了一种Android应用加固方法,所述加固方法基于dex与so文件的动态执行,通过加密方法对Android应用程序中的关键代码进行加固,使得Android应用程序代码得到保护;所述加固方法包括加密过程和解密过程,包括:通过加密过程对Android应用程序中的关键代码进行加固;当动态执行Android应用程序时进行解密;本发明专利技术方法对核心dex的解密函数用C++语言编写,增加其反编译的难度,以动态链接库的形式存在并且进行加密,相当于对核心dex双重加密,对动态链接库的关键代码也进行了加密,解密过程摆脱了JNI调用机制,使得解密过程不会在硬盘留下解密后的明文so文件,全部在内存中进行。本发明专利技术方法具有更高的安全性。

【技术实现步骤摘要】

本专利技术涉及信息安全
,尤其涉及一种基于dex与so文件动态执行的Android应用加固方法
技术介绍
Android是google公司于2007年推出的开源手机操作系统,由于其强大的功能和灵活的定制能力,使其在短短几年内便跃居智能手机操作系统市场份额的首位,据著名市场研究机构IDC的最新数据表明,2015年第三季度,Android系统智能手机的市场份额高达84.7%,远超其他系统。虽然Android系统在设计之初便充分考虑到了安全问题,但随着其广泛应用,诸多潜在的安全问题还是逐渐地暴露出来,对其安全性的研究开始受到人们的广泛关注。由于Android平台软件使用的编程语言是Java,而Java源代码编译后的二进制代码极易被反编译,导致其破解难度远小于其他使用编译性语言编写的程序。虽然Android 2.3以后加入了代码混淆机制,但通过逆向工程,其API级别上的代码仍是难以隐藏,对攻击者来说,破解的可能性仍是很大。现有的一些Android应用程序加固方法,大多采用静态处理的方法,即对dex文件进行一些修改来增加攻击的难度。这种加固方法只是增加了代码阅读难度。或者基于JNI调用机制,通过加密原so文件,使用壳程序加载并解密原so文件,间接调用原so文件的函数。然而,由于基于JNI调用机制该方案,不可避免地会在硬盘短暂的留下解密后的明文so文件,攻击者使用Hook系统API、自动化脚本可以轻易地破解此方案。因此攻击者依然能够得到程序的代码,无法保证应用程序的安全性。
技术实现思路
为了克服上述现有技术的不足,本专利技术详细分析了Android的系统架构、程序结构、程序执行机制以及Android平台软件面临的逆向威胁,基于classes.dex文件动态加载、利用so库解密dex文件加固方案,提出和实现了一种能使so库脱离JNI调用机制依赖,从而在内存中完成so文件的加解密,保证没有临时so文件的生成、保证不能通过内存中映射表截断方法获得的so核心代码的具有更高安全性的加固方案。本专利技术提供的技术方案是:一种基于dex与so文件动态执行的Android应用加固方法,通过二进制流加密方法对Android应用程序中的关键代码进行加固,使得Android应用程序代码得到保护;所述加固方法包括加密过程和解密过程,具体包括如下步骤:A.通过软件加固模块实现加密过程:软件加固模块即为针对Android应用程序的加固模块,通过二进制流加密方法对Android应用程序中的关键代码进行加固;A1.解压软件主体部分apk文件,提取其classes.dex文件;一个Android应用程序(软件)会打包成一个APK文件,对于APK文件进行解压可以得到dex文件、assets文件、arsc文件等;其中classes.dex包含是Android平台上可执行文件的类型;A2.将核心功能部分代码编译成独立的apk文件并对其进行加密;核心功能部分代码根据提取classes.dex文件之后对代码进行分析得到,一般地,核心代码是自己编写的程序,而不是引用的系统或者外部库的代码;A3.把加密后的apk文件写入到软件主体部分的classes.dex文件的末尾,并在文件尾部添加加密数据的大小,用以解密时找到核心功能部分代码的起始位置;应用程序编译成独立的apk文件之后可以得到此文件的大小的数值,即为加密数据的大小;A4.重新计算classes.dex文件的checksum、signature和file_size字段的值。分别计算这几个字段变化之后的值,替换原位置的checksum、signature和file_size字段的值,替换原位置的内容即可;A5.将修改后的classes.dex文件放回软件主体部分apk包中,使用Android SDK中提供的签名工具对程序进行签名;A6.读取待加固的so库文件(假设为a.so),解析文件信息,得到待加密函数的偏移地址与大小,并向待加密函数末尾处写入decryDEX()解密函数,用于解密加密后的dex文件,重新计算待加密函数的大小并填写;具体地,修改解密函数中的数值,也就是将原来待加密函数中的数值修改为改变之后的数值,此数值为待加密函数的大小;A7.对待加密函数进行异或加密;A8.解析so库文件的文件头,修改文件头部部分字段值,包括so文件大小、so文件中函数的偏移地址;A9.计算so库文件的MD5值,并将其写入文件末尾;A10.在so文件中的.init_array节的代码段中添加运行环境检测、对抗动态调试、MD5完整性校验,以及对so文件进行解密的代码。B.开始动态执行Android应用程序进行解密时,执行如下操作:B1.软件主体部分从自身的apk文件中读取classes.dex文件,在classes.dex文件尾部得到加密数据的长度,根据加密数据长度计算出加密数据的起始位置,从而读取得到加密数据;B2.调用loadLibrary系统函数加载a.so,这一阶段loadLibrary会加载共享库(即实施例中的so文件a.so)、控制权传递给动态连接器Linker,Linker会检查文件头部合法性、根据头部的数据分别读入对应的各种数据结构,并将所有PT_LOAD属性的段加载至合适的地址空间,然后为该库在共享库链表中分配一个soinfo节点并填充其数据结构,执行标记为.init,.init_array的节的代码进行代码初始化工作,若存在JNI_OnLoad函数,执行该代码;(.init_array过程会解密加密函数);B3.调用decryDEX()解密得到核心功能部分的apk;B4.通过Android API提供的DexClassLoader类,对核心功能部分码(核心功能部分的apk)进行反射调用,从而实现核心功能部分代码的动态加载;B5.调用完成后,删除核心功能部分apk文件,从而避免核心功能部分代码暴露在系统内部存储之中,被攻击者得到。与现有技术相比,本专利技术的有益效果是:现有的一些Android应用程序加固方法,大多采用静态处理的方法,即对dex文件进行一些修改来增加攻击的难度,或者基于JNI调用机制,通过加密原so文件,使用壳程序加载并解密原so文件,间接调用原so文件的函数。然而,由于基于JNI调用机制该方案,不可避免地会在硬盘短暂的留下解密后的明文so文件,攻击者使用Hook系统API、自动化脚本可以轻易地破解此方案。本专利技术提供的加固方法对核心dex进行加密保护,对核心dex的解密函数用C++语言编写,增加了其反编译的难度,以动态链接库的形式存在并且也进行了加密。相当于对核心dex双重加密,对动态链接库的关键代码也进行了加密。并且解密过程摆脱了JNI调用机制,使得解密过程不会在硬盘留下解密后的明文so文件,全部在内存中进行,避免被攻击者得到。本专利技术方法能够保证没有临时so文件的生成、保证不能通过内存中映射表截断方法获得的so核心代码,是具有更高安全性的加固方案。附图说明图1是本专利技术提供方法的流程框图;其中,A为提取dex文件核心功能部分并编译成一个独立的apk文件,并将它写入文件classes.dex文件尾部;B为将该独立的apk文件解密函数写入待加固的so文件中的待加密部分并加密该部分代码;C本文档来自技高网...
基于dex与so文件动态执行的Android应用加固方法

【技术保护点】
一种Android应用加固方法,所述加固方法基于dex与so文件的动态执行,通过加密方法对Android应用程序中的关键代码进行加固,使得Android应用程序代码得到保护;所述加固方法包括加密过程和解密过程,具体包括如下步骤:A)通过加密过程对Android应用程序中的关键代码进行加固,执行如下步骤:A1.解压Android应用程序主体部分apk文件,提取其中的classes.dex文件;A2.将Android应用程序核心功能部分代码编译成独立的apk文件并对该apk文件进行加密;A3.把加密后的apk文件写入到A1中Android应用程序主体部分的classes.dex文件的末尾,并在所述classes.dex文件尾部添加加密数据的大小,用于解密时找到核心功能部分代码的起始位置;A4.重新计算classes.dex文件的checksum、signature和file_size字段的值,替换原位置的相应字段的值,得到修改后的classes.dex文件;A5.将修改后的classes.dex文件放回所述应用程序软件主体部分apk包中,再对所述应用程序进行签名;A6.读取待加固的so库文件,通过解析文件信息得到待加密函数的偏移地址与大小,并向待加密函数末尾处写入decryDEX()解密函数,用于解密加密后的dex文件;重新计算得到改变之后的待加密函数的大小的值,并将原来待加密函数中的大小修改为所述改变之后的待加密函数的大小的值;A7.对所述待加密函数进行异或加密;A8.解析so库文件的文件头,修改文件头部部分字段值,包括so文件大小、so文件中函数的偏移地址;A9.计算so库文件的MD5值,将所述MD5值写入所述so库文件的末尾;A10.在所述so库文件中的.init_array节的代码段中添加运行环境检测、对抗动态调试、MD5完整性校验和对so库文件进行解密的代码;B.当动态执行Android应用程序进行解密时,执行如下操作:B1.所述Android应用程序主体部分从自身的apk文件中读取classes.dex文件,从classes.dex文件尾部得到加密数据的长度,计算得到加密数据的起始位置,从而读取得到加密数据;B2.加载所述so库文件;B3.调用decryDEX()解密函数进行解密,得到核心功能部分的apk;B4.通过Android API提供的DexClassLoader类,对B3所述核心功能部分的apk进行反射调用,从而实现核心功能部分代码的动态加载;B5.调用完成后,删除核心功能部分apk文件,从而避免核心功能部分代码暴露在系统内部存储之中而被攻击者得到。...

【技术特征摘要】
1.一种Android应用加固方法,所述加固方法基于dex与so文件的动态执行,通过加密方法对Android应用程序中的关键代码进行加固,使得Android应用程序代码得到保护;所述加固方法包括加密过程和解密过程,具体包括如下步骤:A)通过加密过程对Android应用程序中的关键代码进行加固,执行如下步骤:A1.解压Android应用程序主体部分apk文件,提取其中的classes.dex文件;A2.将Android应用程序核心功能部分代码编译成独立的apk文件并对该apk文件进行加密;A3.把加密后的apk文件写入到A1中Android应用程序主体部分的classes.dex文件的末尾,并在所述classes.dex文件尾部添加加密数据的大小,用于解密时找到核心功能部分代码的起始位置;A4.重新计算classes.dex文件的checksum、signature和file_size字段的值,替换原位置的相应字段的值,得到修改后的classes.dex文件;A5.将修改后的classes.dex文件放回所述应用程序软件主体部分apk包中,再对所述应用程序进行签名;A6.读取待加固的so库文件,通过解析文件信息得到待加密函数的偏移地址与大小,并向待加密函数末尾处写入decryDEX()解密函数,用于解密加密后的dex文件;重新计算得到改变之后的待加密函数的大小的值,并将原来待加密函数中的大小修改为所述改变之后的待加密函数的大小的值;A7.对所述待加密函数进行异或加密;A8.解析so库文件的文件头,修改文件头部部分字段值,包括so文件大小、so文件中函数的偏移地址;A9.计算so库文件的MD5值,将所述MD5值写入所述so库文件的末尾;A10.在所述so库文件中的.init_array节的代码段中添加运行环境检测、对抗动态调试、MD5完整性校验和对so库...

【专利技术属性】
技术研发人员:文伟平
申请(专利权)人:北京鼎源科技有限公司
类型:发明
国别省市:北京;11

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

1