本发明涉及应用程序安全防护技术领域,具体涉及一种dex文件的存储方法和装置。
背景技术:
随着Android系统的快速发展和及设备的高速增长,基于Android的平台应用需求也越来越复杂。形形色色的应用软件壮大了Android市场,也丰富了我们的生活,越来越多的人从起初的尝试到享受再到依赖,Android应用越来越广泛。与其它操作系统相比,Android系统的开源性为应用开发者提供了更多的功能接口,但这些功能接口在提高系统可扩展性的同时也为恶意软件提供了遍历,非法拷贝、反编译、内存截取等手段不断威胁着安卓系统的安全,不仅危害了使用者,也给正常应用开发者造成了严重的损害。因此,Android应用安全性一直是开发者所关注的重点问题。
对Android应用进行加固防护的主要目的均是为了防止其java字节码文件classes.dex文件被获取,在Android平台安装运行APK文件时,都必须将dex文件释放到内存,在dex文件加载时,根据文件头header中定义的其它结构的偏移地址和长度信息进行寻址解析,将其它结构中的数据加载分别加载到内存中,加载后的dex文件的内容是存放在内存中的一端连续的内存空间中的,因此,破解者只需要获取到classes.dex文件的起始地址,然后从起始地址开始dump(提取/提取)文件总长度filesize大小的内容,即可提取得到完整的classes.dex文件的内容,进而可以进一步还原出APK文件的源代码,使得安卓应用程序很容易被篡改。
技术实现要素:
针对现有技术中存在的缺陷,本发明实施例的目的在于提供一种能够克服上述问题或者至少能够部分地解决上述问题的一种dex文件的存储方法和装置。
为实现上述目的,本发明的一个实施例中提供了一种dex文件的存储方法,包括:
运行安卓应用程序,解析并加载安卓应用程序的dex文件;
检测所述dex文件中定义的类是否已经被加载到内存空间中;
当检测到所述类已经被加载到内存空间中时,删除所述dex文件中所述类的类数据信息class_data_item。
优选的,如上所述的方法,所述运行安卓应用程序前,包括:
接收安卓应用程序启动指令,启动类检测线程;所述类检测线程用于在安卓应用程序启动过程中,检测安卓应用程序的dex文件中定义的类是否已经被加载到内存空间中。
优选的,如上所述的方法,接收安卓应用程序启动指令前,还包括:创建所述类检测线程;
在删除所述类的类数据信息class_data_item后,关闭所述类检测线程。
优选的,如上所述的方法,所述dex文件中定义的类包括安卓应用程序的dex文件中的定义的至少一个类。
优选的,如上所述的方法,删除所述dex文件中所述类的类数据信息class_data_item,包括:
根据dex文件的类列表区段class_defs中所述类的类数据偏移地址class_data_off,查找到dex文件数据区段data中该类的类数据信息class_data_item并删除。
优选的,如上所述的方法,删除所述dex文件中所述类的类数据信息class_data_item后,还包括:
将所述dex文件的类列表区段class_defs中所述类的类数据偏移地址class_data_off的值修改为0。
优选的,如上所述的方法,所述检测所述dex文件中定义的类是否已经被加载到内存空间中,包括:
通过检测安卓操作系统中的dex文件路径列表DexPathList的dex元素数组dexElements中是否存在所述类的缓存标识,判断所述类是否已经被加载到内存空间中。
优选的,如上所述的方法,所述类的缓存标识为所述类的变量值cookie,所述变量值cookie为加载后的类所在的内存地址。
本发明的实施例中还公开了:一种dex文件的存储装置,包括:
dex文件解析加载模块,用于运行安卓应用程序,解析并加载安卓应用程序的dex文件;
类加载状态检测模块,用于检测所述dex文件中定义的类是否已经被加载到内存空间中;
类数据删除模块,用于当检测到所述类已经被加载到内存空间中时,删除所述dex文件中所述类的类数据信息class_data_item。
优选的,如上所述的装置,该装置还包括:
类检测线程启动模块,用于在运行安卓应用程序前,接收安卓应用程序启动指令,启动类检测线程;所述类检测线程用于在安卓应用程序启动过程中,检测安卓应用程序的dex文件中定义的类是否已经被加载到内存中。
优选的,如上所述的装置,还包括:
类检测线程创建模块,用于在接收安卓应用程序启动指令前,创建所述类检测线程;
类检测线程关闭模块,用于在删除所述类的类数据信息class_data_item后,关闭所述类检测线程。
优选的,如上所述的装置,所述dex文件中定义的类class包括安卓应用程序的dex文件中定义的至少一个类。
优选的,如上所述的装置,所述类数据删除模块包括:
类数据查找单元,用于根据dex文件的类列表区段class_defs中所述类的类数据偏移地址class_data_off,查找到dex文件数据区段data中该类的类数据信息class_data_item;
类数据删除单元,用于删除查找到的类数据信息class_data_item。
优选的,如上所述的装置,还包括:
类偏移修改模块,用于在删除所述dex文件中所述类的类数据信息class_data_item后,将所述dex文件的类列表区段class_defs中所述类的类数据偏移地址class_data_off的值修改为0。
优选的,如上所述的装置,所述类数据删除模块包括:
类缓存判断单元,用于通过检测安卓操作系统中的dex文件路径列表DexPathList的dex元素数组dexElements中是否存在所述类的缓存标识,判断所述类是否已经被加载到内存空间中。
优选的,如上所述的装置,所述类的缓存标识为类的变量值cookie,所述变量值cookie为加载后的类所在的内存地址。
本发明的有益效果在于:本发明实施例中所提供的dex文件的存储方法和装置,在安卓应用程序APP启动时,通过对应用程序的dex文件中定义的类的内存加载状态进行检测,在检测到所述类已经被加载到内存后,删除dex文件结构中所述类的类数据信息,从而避免了在程序运行时,能够通过dexdump等dex文件内存提取工具从内存中提取到完整的dex文件的问题,达到了保护dex文件的目的,该方法和装置,有效避免了dex文件的内存提取,避免了被动态反编译,提高了dex文件动态加载的安全性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,附图仅限于示出优选实施方式的目的,而并不认为是本发明的限制,且对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明的一个实施例中一种dex文件的存储方法的流程示意图;
图2为本发明的一个实施例中dex文件的类列表区段class_defs的部分结构示意图;
图3为本发明的一个实施例中一种dex文件的存储方法的流程示意图;
图4为本发明的一个实施例中一种dex文件的存储方法的流程示意图;
图5为本发明的一个实施例中一种dex文件的存储装置的结构示意图;
图6为本发明的一个实施例中一种dex文件的存储装置的结构示意图;
图7为本发明一个实施例中的类数据删除模块的结构示意图;
图8为本发明一个实施例中的类数据删除模块的结构示意图;
图9为本发明的一个实施例中一种dex文件的存储装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,均属于本发明保护的范围。
图1示出了本发明的一个实施例中提供的一种防止从内存中提取dex文件方法的流程示意图,该方法主要可以包括以下步骤:
步骤S110:运行安卓应用程序,解析并加载安卓应用程序的dex文件;
步骤S120:检测所述dex文件中定义的类是否已经被加载到内存空间中;
步骤S130:当检测到所述类已经被加载到内存空间中时,删除所述dex文件中所述类的类数据信息。
本实施例中,在运行安卓应用程序运行时,由Dalvik虚拟机进行所需要启动的应用程序的dex文件的底层解析与加载,将dex文件的各部分内容加载到内存中,在dex文件的解析与加载过程中,当检测dex文件中定义的类已经被加载到了内存空间中时,则删除dex文件中该类的类数据信息class_data_item。其中,定义的类被加载到内存空间指的即使该类的类数据信息class_data_item已经被存储到内存空间中。
在实际操作中,由于dex文件中定义的类class已经被加载存储到了内存空间中,因此,删除dex文件中的类数据信息class_data_item是不会影响应用程序的正常运行的。
本实施例中,所述dex文件中定义的类包括安卓应用程序的dex文件中定义的至少一个类。
classes.dex文件(本发明实施例中简称为dex文件)是Android平台上可执行文件的类型,dex文件的类列表区段class_defs中存放着classdefinitions即类class的定义,类列表区段class_defs的数据格式为class_def_item,class_def_item结构中的class_idx描述了具体类class类型。本实施例中所述dex文件中定义的类class即是class_idx中描述的至少一个类class。
本实施例中提供的所述dex文件的存储方法,通过将已经加载到内存中的dex文件中的类class的类数据信息class_data_item进行抹除,使得即使采用dexdump工具从内存中的提取dex文件,由于至少一个类class的数据信息class_data_item不存在,因此,无法从内存中dump到完成dex文件,有效避免了dex文件的内存提取。
在本发明的一个实施例中,步骤S130中,所述删除所述dex文件中所述类的类数据信息,包括:
根据dex文件的类列表区段class_defs中所述类class的类数据偏移地址class_data_off,查找到dex文件数据区段data中该类class的类数据信息class_data_item并删除。
class_data_off是上述class_def_item结构中的一个类的偏移地址,指向的内容是对应的类class所需要使用到的数据,位置在dex文件的数据区段data中,格式为class_data_item,class_data_item中描述的是类class所要使用到的数据信息。因此,对于所述类class,根据其类数据偏移地址class_data_off即可在数据区段data找到该类的类数据信息。
如图2所示,为dex文件中类列表区段class_defs的部分结构示意图,图中第二个矩形框中的内容即为某个类的类数据信息class_data_item的结构示意图,本实施例中,所述删除内存中dex文件的中某一个类的类数据信息即是删除图2中第二个矩形框中的内容。
需要说明的是,图2中的英文内容均是安卓dex文件中的通用数据结构,对本领域技术人员来说都是清楚的,在此不再对其中的内容进行一一说明。
在本发明的一个实施例中,步骤S120中,所述检测所述dex文件中定义的类是否已经被加载到内存空间中,包括:
通过检测安卓操作系统中的dex文件路径列表DexPathList的dex元素数组dexElements中是否存在所述类的缓存标识,判断所述类是否已经被加载到内存空间中。
在将dex文件中定义的类class加载到内存后,即将类的类数据信息class_data_item加载到内存中后,会将类所存储在的内存地址作为一个元素添加到安卓操作系统中的dex文件路径列表DexPathList的dex元素数组dexElements中,以建立安卓操作系统的底层与上层的通信调用,由dex类加载器Dexclassloader根据dex元素数组dexElements中的元素完成上层dex文件的动态加载。因此,可以通过检测类的缓存标识在dex元素数组dexElements中是否存在,来判断类是否加载完成,当某个定义的类的缓存标识存在时,则表明该类已经加载到了内存空间中。
在本发明的一个实施例中,所述类的缓存标识可以为类的变量值cookie,所述变量值cookie即为完成底层加载后的类所在的内存地址。
图3示出了本发明的一个实施例中提供的一种防止从内存中提取dex文件方法的流程示意图,该方法主要可以包括以下步骤:
步骤S310:创建类检测线程,
本实施例中,首先创建一类检测线程,所述类检测线程用于在安卓应用程序APP的启动过程中,检测安卓应用程序APP的dex文件中定义的类是否已经被加载到内存空间中。
需要说明的是,所述创建类检测线程的步骤,只需要执行一次,完成一次类检测线程的创建后,在后续安卓应用程序启动时,自动启动该线程即可。
步骤S320:接收安卓应用程序启动指令,启动所述类检测线程;
在接收到安卓应用程序AAP的启动指令时,首先启动所述类检测线程,其中,所述安卓应用程序启动指令,即用户在终端设备上的点击或其它应用程序的启动动作,在接收到用户对所需要启动的应用程序的启动指令后,首先启动上述类检测线程,即在应用程序启动之前,先启动类检测线程,以实现对应用程序运行过程中dex文件中定义的类class的加载状态进行检测。
步骤S330:运行安卓应用程序,解析加载安卓应用程序的dex文件;
步骤S340:当类检测线程检测所述类已经被加载到内存空间中时,删除所述dex文件中所述类的类数据信息;
在所述类检测线程启动后,进入安卓应用程序运行过程,由Dalvik虚拟机进行所需要启动的应用程序的dex文件的底层解析与加载,将dex文件的各部分内容加载到内存中,在dex文件的解析与加载过程中,所述类检测程序检测dex文件的定义的类class是否已经被加载到内存空间中,当检测到所述类class的类数据信息class_data_item已经被加载完成后,则删除内存中所述dex文件中的所述类class的类数据信息class_data_item。
步骤S350:关闭所述类检测线程。
将内存中的所述dex文件中所述类的类数据信息class_data_item删除后,关闭所述类检测线程。当所述类为两个或两个以上时,则在分别删除完dex文件中所述两个或两个以上的类的类数据信息class_data_item后,关闭类检测线程。
在本发明的一个实施例中,如图4所示,在删除所述dex文件中所述类的类数据信息class_data_item后,所述存储方法还可以包括:
步骤S140:将所述dex文件的类列表区段class_defs中所述类的类数据偏移地址class_data_off的值修改为0。
本实施例中,通过将所述类class的类偏移地址class_data_off的值修改为0,进一步删除了该类class的相关信息。class_data_off的值为0表明在数据区中不存在相应的类数据信息,对于图2中所示的结构,将类数据偏移地址class_data_off的值修改为0即是将图2中第一个矩形框中的class_data_off修改成0。
对应于图1中所示的方法,本发明的一个实施例中还提供了一种dex文件的存储装置,如图5所示,该装置可以包括dex文件解析加载模块110、类加载状态检测模块120和类数据删除模块130。其中:
dex文件解析加载模块110,用于运行安卓应用程序,解析并加载安卓应用程序的dex文件;
类加载状态检测模块120,用于检测所述dex文件中定义的类是否已经被加载到内存空间中;
类数据删除模块130,用于当检测到所述类已经被加载到内存空间中时,删除所述dex文件中所述类的类数据信息class_data_item。
其中,所述dex文件中定义的类包括安卓应用程序的dex文件中的至少一个类。
本实施例中所述的dex文件的存储装置,通过在完成dex文件中定义的类的内存加载存储后,将dex文件中定义的类的类数据信息进行删除,使得dexdump等内存提取工具无法从内存中提取到完整的dex文件,保证了dex文件的动态加载的安全。
在本发明的一个实施例中,所述存储装置还可以包括类检测线程创建模块140、类检测线程启动模块150和类检测线程关闭模块160,如图6所示。其中:
类检测线程创建模块140,用于在接收安卓应用程序启动指令前,创建类检测线程;所述类检测线程用于在安卓应用程序启动过程中,检测安卓应用程序的dex文件中定义的类是否已经被加载到内存空间中;
类检测线程启动模块150,用于在接收运行安卓应用程序启动指令前,接收安卓应用程序启动指令,启动所述类检测线程;
类检测线程关闭模块160,用于在删除内存中的所述dex文件中所述类的类数据信息class_data_item后,关闭所述类检测线程。
在本发明的一个实施例中,如图7所示,所述类数据删除模块130包括类数据查找单元132和类数据删除单元133。其中:
类数据查找单元132,用于根据dex文件的类列表区段class_defs中所述类的类数据偏移地址class_data_off,查找到dex文件数据区段data中该类的类数据信息class_data_item;
类数据删除单元133,用于删除查找到的类数据信息class_data_item。
在本发明的一个实施例中,如图8所示,所述类数据删除模块130包括类缓存判断单元131。其中:
类缓存判断单元131,用于通过监测检测安卓操作系统中的dex文件路径列表DexPathList的dex元素数组dexElements中是否存在所述类的缓存标识,判断所述类是否已经被加载到内存空间中。
在本发明的一个实施例中,所述类的缓存标识可以为类的变量值cookie,所述变量值cookie为加载后的类所在的内存地址。
在本发明的一个实施例中,如图9所示,所述装置还可以类偏移修改模块170。其中:
类偏移修改模块170,用于在删除内存中的dex文件中所述类的类数据信息class_data_item后,将类列表区段class_defs中所述类的类数据偏移地址class_data_off的值修改为0。
本实施例中,通过类偏移地址修改模块180进一步删除了所述类class的相关信息。
本发明实施例中所提供的dex文件的存储方法和装置,在安卓应用程序APP的运行过程中,通过对dex文件中定义的类的内存加载状态进行检测,在检测到所述类已经加载到内存即在内存中缓存好之后,即删除dex文件结构中所述类的类数据信息,从而避免了在程序运行时,能够通过dexdump等dex文件内存提取工具从内存中提取到完整的dex文件的问题,达到保护dex文件的目的。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本领域普通技术人员可以理解实现上述装置实施方式中各部分的全部或部分可以以硬件实现,或者以在一个或多个硬件上运行的软件模块来实现,方法实施方式中的全部或部分步骤是可以通过程序来指令相关的硬件来完成。本领域技术人员应该明白,本发明所述的方法和装置并不限于具体实施方式中所述的实施例,上面的具体描述只是为了解释本发明的目的,并非用于限制本发明。本领域技术人员根据本发明的技术方案得出其他的实施方式,同样属于本发明的技术创新范围,本发明的保护范围由权利要求及其等同物限定。
本发明的实例中公开了:A1、一种dex文件的存储方法,包括:
运行安卓应用程序,解析并加载安卓应用程序的dex文件;
检测所述dex文件中定义的类是否已经被加载到内存空间中;
当检测到所述类已经被加载到内存空间中时,删除所述dex文件中所述类的类数据信息class_data_item。
A2、根据A1所述的方法,所述运行安卓应用程序前,包括:
接收安卓应用程序启动指令,启动类检测线程;所述类检测线程用于在安卓应用程序启动过程中,检测安卓应用程序的dex文件中定义的类是否已经被加载到内存空间中。
A3、根据A2所述的方法,接收安卓应用程序启动指令前,还包括:创建所述类检测线程;
在删除所述类的类数据信息class_data_item后,关闭所述类检测线程。
A4、根据权利要求1至3之一所述的方法,其特征在于,所述dex文件中定义的类包括安卓应用程序的dex文件中的定义的至少一个类。
A5、根据A1至A3之一所述的方法,删除所述dex文件中所述类的类数据信息class_data_item,包括:
根据dex文件的类列表区段class_defs中所述类的类数据偏移地址class_data_off,查找到dex文件数据区段data中该类的类数据信息class_data_item并删除。
A6、根据A1至A3之一所述的方法,删除所述dex文件中所述类的类数据信息class_data_item后,还包括:
将所述dex文件的类列表区段class_defs中所述类的类数据偏移地址class_data_off的值修改为0。
A7、根据A1至A3之一所述的方法,所述检测所述dex文件中定义的类是否已经被加载到内存空间中,包括:
通过检测安卓操作系统中的dex文件路径列表DexPathList的dex元素数组dexElements中是否存在所述类的缓存标识,判断所述类是否已经被加载到内存空间中。
A8、根据A7所述的方法,所述类的缓存标识为所述类的变量值cookie,所述变量值cookie为加载后的类所在的内存地址。
本发明实施例中公开了:B9、一种dex文件的存储装置,包括:
dex文件解析加载模块,用于运行安卓应用程序,解析并加载安卓应用程序的dex文件;
类加载状态检测模块,用于检测所述dex文件中定义的类是否已经被加载到内存空间中;
类数据删除模块,用于当检测到所述类已经被加载到内存空间中时,删除所述dex文件中所述类的类数据信息class_data_item。
B10、根据B9所述的装置,该装置还包括:
类检测线程启动模块,用于在运行安卓应用程序前,接收安卓应用程序启动指令,启动类检测线程;所述类检测线程用于在安卓应用程序启动过程中,检测安卓应用程序的dex文件中定义的类是否已经被加载到内存中。
B11、根据B10所述的装置,还包括:
类检测线程创建模块,用于在接收安卓应用程序启动指令前,创建所述类检测线程;
类检测线程关闭模块,用于在删除所述类的类数据信息class_data_item后,关闭所述类检测线程。
B12、根据B9至B11之一所述的装置,所述dex文件中定义的类class包括安卓应用程序的dex文件中定义的至少一个类。
B13、根据B9至B11之一所述的装置,所述类数据删除模块包括:
类数据查找单元,用于根据dex文件的类列表区段class_defs中所述类的类数据偏移地址class_data_off,查找到dex文件数据区段data中该类的类数据信息class_data_item;
类数据删除单元,用于删除查找到的类数据信息class_data_item。
B14、根据B9至B11之一所述的装置,还包括:
类偏移修改模块,用于在删除所述dex文件中所述类的类数据信息class_data_item后,将所述dex文件的类列表区段class_defs中所述类的类数据偏移地址class_data_off的值修改为0。
B15、根据B9至B11之一所述的装置,所述类数据删除模块包括:
类缓存判断单元,用于通过检测安卓操作系统中的dex文件路径列表DexPathList的dex元素数组dexElements中是否存在所述类的缓存标识,判断所述类是否已经被加载到内存空间中。
B16、根据B15所述的装置,所述类的缓存标识为类的变量值cookie,所述变量值cookie为加载后的类所在的内存地址。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其同等技术的范围之内,则本发明也意图包含这些改动和变型在内。