本发明涉及应用程序安全防护技术领域,具体涉及一种dex文件的存储方法和装置。
背景技术:
随着Android系统的快速发展和及设备的高速增长,基于Android的平台应用需求也越来越复杂。形形色色的应用软件壮大了Android市场,也丰富了我们的生活,越来越多的人从起初的尝试到享受再到依赖,Android应用越来越广泛。与其它操作系统相比,Android系统的开源性为应用开发者提供了更多的功能接口,但这些功能接口在提高系统可扩展性的同时也为恶意软件提供了遍历,非法拷贝、反编译、内存截取等手段不断威胁着安卓系统的安全,不仅危害了使用者,也给正常应用开发者造成了严重的损害。因此,Android应用安全性一直是开发者所关注的重点问题。
对Android应用进行加固防护的主要目的均是为了防止其java字节码文件classes.dex文件被获取,在Android平台安装运行APK文件时,都必须将dex文件释放到内存中,在dex文件完成加载时,根据文件头header中定义的其它结构的偏移地址和长度信息进行寻址解析,将其它结构中的数据加载分别加载到内存中。由于dex文件的内容是存放在内存中的一端连续的内存空间中,因此,破解者通过dex文件内存提取工具即dexdump工具只需要扫描到内存中的文件头的起始地址位置的字符串,就相当于找到了找到了dex文件,就能把它从内存中提取即dump出来,使得应用程序很容易被篡改,为开发者和用户造成损害。
技术实现要素:
针对现有技术中存在的缺陷,本发明实施例的目的在于提供一种能够克服上述问题或者至少能够部分地解决上述问题的一种dex文件的存储方法和装置。
为实现上述目的,本发明的一个实施例中提供一种dex文件的存储方法,该方法包括:
解析待加载的dex文件,将解析后的dex文件加载到内存中;
删除所述内存中的dex文件的文件头header中的指定数据。
优选的,如上所述的一种dex文件的存储方法,还包括:
根据解析后的dex文件所在的内存地址,完成dex文件的动态加载。
优选的,如上所述的一种dex文件的存储方法,所述指定数据包括文件头header中的魔数字段magic。
优选的,如上所述的一种dex文件的存储方法,所述删除所述内存中的dex文件的文件头header中的指定数据,包括:删除内存中的“dex\0035”字符串。
优选的,如上所述的一种dex文件的存储方法,所述指定数据包括以下数据中的至少一种:
校验码字段checksum、签名字段signature、文件总长度字段fileSize、文件头长度字段headerSize、字节顺序常量标识字段endianTag、连接段开始位置字段link Off、各基地址字段。
本发明的一个实施例中还公开了一种dex文件的存储装置,该装置包括:
dex解析加载模块,用于解析待加载的dex文件,将解析后的dex文件加载到内存中;
指定数据删除模块,用于删除所述内存中的dex文件的文件头header中的指定数据。
优选的,如上所述的一种dex文件的存储装置,还包括:
dex动态加载模块,用于根据解析后的dex文件所在的内存地址,完成dex文件的动态加载。
优选的,如上所述的一种dex文件的存储装置,所述指定数据包括文件头header中的魔数字段magic。
优选的,如上所述的一种dex文件的存储装置,所述指定数据删除模块用于删除内存中的“dex\0035”字符串。
优选的,如上所述的一种dex文件的存储装置,所述指定数据包括以下数据中的至少一种:
校验码字段checksum、签名字段signature、文件总长度字段fileSize、文件头长度字段headerSize、字节顺序常量标识字段endianTag、基地址字段。
本发明的有益效果在于:本发明实施例中所提供的dex文件的存储方法和装置,通过抹除已加载到内存中的dex文件的文件头header中的指定数据,使得反编译者无法从内存中找到dex文件或者无法提取到完整的dex文件,解决了可以从内存中提取dex文件的问题,有效避免了dex文件的动态反编译,提高了dex文件动态加载及运行的安全性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,附图仅限于示出优选实施方式的目的,而并不认为是本发明的限制,且对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明一个实施例中的一种dex文件的存储方法的流程示意图;
图2为现有dex文件的文件头部分在内存中的结构示意图;
图3为本发明一个实施例中将dex文件中的指定数据删除后的内存中的dex文件的文件头部分的结构示意图;
图4为本发明一个实施例中的一种dex文件的存储方法的流程示意图
图5为本发明一个实施例中一种dex文件的存储装置的结构示意图;
图6为本发明一个实施例中一种dex文件的存储装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,均属于本发明保护的范围。
图1示出了本发明的一个实施例中提供的一种dex文件的存储方法的流程示意图,由图中可以看出,该方法可以包括以下步骤:
步骤S110:解析待加载的dex文件,将解析后的dex文件加载到内存中;
步骤S120:删除所述内存中的dex文件的文件头header中的指定数据。
为了实现安卓可执行文件classes.dex文件的动态加载,首先需要将dex文件进行底层解析与加载,根据dex文件的文件头中各部分的偏移地址和数据长度信息等,将dex文件的各部分内容加载到内存中,再通过底层与上层之间的通信调用,由dex类加载器完成上层的dex文件的动态加载。
本实施例中所提供的存储方法,正是在完成待加载的dex文件的底层解析与加载后进行的,因此,首先需要解析待加载的dex文件,在将解析后的dex文件加载到内存中后,删除内存中的dex文件的文件头header中的指定数据。通过该方法,抹除了内存中已加载的dex文件的文件头header中的指定数据,从而避免了反编译工具(如dexdump等)能够从内存中提取完整的dex文件的问题,避免对dex文件的动态反编译。
在本发明的一个实施例中,所述指定数据包括文件头header中的魔数字段magic。此时,所述删除所述内存中的dex文件的文件头header中的指定数据,包括:删除内存中的“dex\0035”字符串。
魔数字段magic,即Dex文件的标识符,其格式为“dex\0035”,其中,035表示结构的版本,将dex文件解析加载到内存后,魔数字段magic的字符串“dex\0035”即标识了dex文件在内存中的起始地址位置,dexdump等反编译工具能够通过查找内存中的“dex\0035”字符串找到dex文件,因此,通过删除文件头中的数字段magic,使反编译工具无法在内存中找到dex文件的起始地址位置,从而无法从内存中提取到dex文件。
在本发明的一个实施例中,所述指定数据还可以包括以下数据中的至少一种:
校验码字段checksum、签名字段signature、文件总长度字段fileSize、文件头长度字段headerSize、字节顺序常量标识字段endianTag、连接段开始位置字段link Off、各基地址字段。
其中,所述基地址字段包括连接段开始位置字段link Off、数据基地址字段mapOff、字符串列表基地址字段stringIds Off、类型列表基地址字段typeIds Off、原型列表基地址字段protoIds Off、字段列表基地址fieldIds Off、方法列表基地址字段methodIds Off、类定义列表基地址字段classDefs Off和数据段基地址字段data Off。
本实施例中,通过删除dex文件的文件头中的上述任一指定数据,使得反编译工具即使能够通过魔数字段magic的字符串“dex\0035”找到dex文件的起始位置,但也无法提取到完整的dex文件。
在本发明的一个优选实施例中,所述指定数据包括文件头header中的魔数字段magic,还可以包括上述各字段数据中的一种或多种。
图2示出了现有技术中dex文件的文件头部分在内存中的结构示意图,图3中示出了本发明一个实施例中dex文件的文件头部分在内存中的结构示意图,由图中可以看出,本实施例中,所述指定数据包括了魔数字段magic和上述各字段中的所有字段,将dex文件解析加载到内存中后,对于文件头header,除了考虑到系统的兼容性问题,保留了文件头中的size字段外,别的其它信息即上述指定数据均被抹除了,这样在内存中就无法搜索到classes.dex文件的起始地址位置的字符串“dex\0035”,也无法提取到上述各字段,达到了防止从内存中暴力搜索“dex\0035”字符串来从内存中提取dex文件的目的,避免了dex文件被动态反编译。
在本发明的一个实施例中,所述dex文件的存储方法还可以包括步骤S130,如图4所示。
步骤S130:根据解析后的dex文件所在的内存地址,完成dex文件的动态加载。
在完成dex文件的底层解析与加载后,通过dex类加载器Dexclassloader根据解析后的dex文件所在的内存地址,完成dex文件的动态加载,实现对应应用程序的运行。
对应于图1中所示的方法,本发明的一个实施例中还提供了一种dex文件的存储装置,如图5所示,该装置包括dex解析加载模块110和指定数据删除模块120。其中:
Dex解析加载模块110,用于解析待加载的dex文件,将解析后的dex文件加载到内存中;
指定数据删除模块120,用于删除所述内存中的dex文件的文件头header中的指定数据。
本发明的另一个实施例中,该存储装置还可以包括dex动态加载模块130,如图6所示。其中:
dex动态加载模块130,用于根据解析后的dex文件所在的内存地址,完成dex文件的动态加载。
本发明的一个实施例中,所述指定数据包括文件头header中的魔数字段magic。此时,所述指定数据删除模块120用于删除内存中的“dex\0035”字符串。
在本发明的另一个实施例中,所述指定数据可以包括以下数据中的至少一种:
校验码字段checksum、签名字段signature、文件总长度字段fileSize、文件头长度字段headerSize、字节顺序常量标识字段endianTag、基地址字段。
在本发明的一个优选实施例中,所述指定数据包括文件头header中的魔数字段magic和上述实施例中的一个或多个字段。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本领域普通技术人员可以理解实现上述装置实施方式中各部分的全部或部分可以以硬件实现,或者以在一个或多个硬件上运行的软件模块来实现,方法实施方式中的全部或部分步骤是可以通过程序来指令相关的硬件来完成。本领域技术人员应该明白,本发明所述的方法和装置并不限于具体实施方式中所述的实施例,上面的具体描述只是为了解释本发明的目的,并非用于限制本发明。本领域技术人员根据本发明的技术方案得出其他的实施方式,同样属于本发明的技术创新范围,本发明的保护范围由权利要求及其等同物限定。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其同等技术的范围之内,则本发明也意图包含这些改动和变型在内。