著录项信息
专利名称 | 一种安卓平台的可执行程序加密方法 |
申请号 | CN201310004951.1 | 申请日期 | 2013-01-07 |
法律状态 | 暂无 | 申报国家 | 中国 |
公开/公告日 | 2014-07-09 | 公开/公告号 | CN103914637A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F21/12 | IPC分类号 | G;0;6;F;2;1;/;1;2查看分类表>
|
申请人 | 北京洋浦伟业科技发展有限公司 | 申请人地址 | 北京市海淀区学院路30号科大天工大厦A座605房间
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 北京梆梆安全科技有限公司 | 当前权利人 | 北京梆梆安全科技有限公司 |
发明人 | 陈彪;阚志刚;王卫民 |
代理机构 | 北京志霖恒远知识产权代理事务所(普通合伙) | 代理人 | 郭栋梁 |
摘要
本申请提供一种安卓操作系统的可执行程序加密方法,包括步骤1,通过打包工具将APK文件打包成加密的APK文件;步骤2,通过拦截并且替换API的方式,进行运行时的加解密。本发明通过提供一个APK可执行程序的加密方案,能够防止APK被反编译、被篡改和盗版,从而保护应用程序开发商的利益。
一种安卓平台的可执行程序加密方法\n技术领域\n[0001] 本发明涉及软件处理技术,更具体地,涉及一种安卓平台的可执行程序加密方法。\n背景技术\n[0002] APK文件是Android安卓平台的应用程序包文件(application package file),是一种Android操作系统上的应用程序安装文件格式。一个Android应用程序的代码在Android设备上运行,必须先进行编译,然后被打包成为一个被Android系统所能识别的文件才可以被运行,而这种能被Android系统识别并运行的文件格式便是“APK”文件。一个APK文件内包含被编译的代码文件(classes.dex文件)、文件资源(resources)、证书(certificates)和清单文件(manifest file:AndroidManifest.xml)。\n[0003] 由于Android平台采用Java语言开发,导致Apk中的代码易于反编译。在反编译的基础上,很容易实现Apk的篡改。APK篡改是指通过反编译APK文件,进行汇编级的代码分析、修改或插入代码,重新签名打包为新的APK文件,以达到改变程序原有行为的目的。\n[0004] Apk篡改的主要流程包括:反编译;分析反编译后的代码;加入、修改或者删除代码;重新打包签名;发布篡改后的Apk。\n[0005] 目前,APK篡改在Android业界使用非常频繁,主要被应用于以下用途,包括:汉化,利用APK篡改技术,修改国外软件的资源文件达到汉化的目的;加入广告代码,利用APK篡改技术,加入广告代码;加入SP的扣费代码,利用APK篡改技术来加入SP的扣费代码;应用程序钓鱼,通过加入恶意的代码来窃取用户的隐私信息,从而达到应用程序钓鱼的目的;修改License代码,通过修改License代码以实现对软件的破解。可以看出,上述多个用途都严重损害了应用程序开发商的利益。\n发明内容\n[0006] 为克服现有技术的上述缺陷,针对APK篡改这种情况,提出一种针对Android平台上可执行程序加密的方法,对APK中的dex文件进行加密,达到防止APK反编译的目的。\n[0007] 根据本发明的一个方面,提出了一种安卓操作系统的可执行程序加密方法,包括:\n[0008] 步骤1,通过打包工具将APK文件打包成加密的APK文件;\n[0009] 步骤2,通过拦截并且替换API的方式,进行运行时的加解密。\n[0010] 本发明通过提供一个APK可执行程序的加密方案,能够防止APK被反编译、被篡改和盗版,从而保护应用程序开发商的利益。\n附图说明\n[0011] 图1为Java虚拟机执行流程;\n[0012] 图2 Dalvik VM执行APK的流程;\n[0013] 图3是根据本发明的可执行程序加密方法的流程图。\n[0014] 如图所示,为了能明确实现本发明的实施例的流程,在图中描述了特定的设备和运行顺序,但这仅为示意需要,并非意图将本发明限定在该特定设备、顺序、器件和环境中,根据具体需要,本领域的普通技术人员可以将这些器件和环境进行调整或者修改,所进行的调整或者修改仍然包括在后附的权利要求的范围中。\n具体实施方式\n[0015] 下面结合附图和具体实施例对本发明提供的一种安卓平台的可执行程序加密方法进行详细描述。\n[0016] 以下的描述中,将描述本发明的多个不同的方面,然而,对于本领域内的普通技术人员而言,可以仅仅利用本发明的一些或者全部结构或者流程来实施本发明。为了解释的明确性而言,阐述了特定的数目、配置和顺序,但是很明显,在没有这些特定细节的情况下也可以实施本发明。在其他情况下,为了不混淆本发明,对于一些众所周知的特征将不再进行详细阐述。\n[0017] Android平台使用Dalvik虚拟机来执行APK程序,但与通常的Java虚拟机执行Java程序时有一定的区别。Dalvik虚拟机(Dalvik Virtual Machine),是Google公司设计的用于Android平台的Java虚拟机,它可以支持已转换为dex(即Dalvik Executable)格式的Java应用程序的运行。\n[0018] 其中,dex格式是专为Dalvik虚拟机设计的一种压缩格式。Android平台自身提供了一个虚拟机(Dalvik),这种虚拟机执行的并非java字节码,而是dex格式的字节码,在Dalvik虚拟机中将java文件编译成Class类文件后,再次通过Android平台工具将此Class类文件转换成dex字节码。APK文件中的classes.dex就是dex格式的文件,是Dalvik虚拟机上运行的主要代码部分。\n[0019] 通常的Java虚拟机执行class文件的基本流程如图1所示,Java虚拟机执行class文件时,将Class文件从磁盘或者网络中读入,然后在内部执行解析类,解析类阶段主要是验证Class文件中的字节码是否合法,如果合法,将Class文件中的结构转化为虚拟机内部的结构。然后再开始执行执行Class中的字节码。\n[0020] 其中,Java虚拟机支持动态载入类,其流程包括:利用ClassLoader动态读取class文件,调用虚拟机解析类,虚拟机调用执行引擎执行class文件中的字节码。\n[0021] Android的Dalvik虚拟机对APK的执行流程与通常的虚拟机有所不同,图2示出Dalvik虚拟机执行APK的流程。其中,Dalvik VM(虚拟机)在执行APK时,首先要将APK中的dex文件通过dexopt的程序转换为odex格式的文件,然后该文件再交给Dalvik虚拟机执行。\nDalvik虚拟机读入odex文件后,也需要经过解析类的阶段再开始执行字节码。\n[0022] 其中,Dexopt是手机上的可执行程序,用于将jar、zip或者apk格式的文件中所存在的dex格式文件(该文件必须名为classes.dex文件)转化为odex格式。Dexopt通常在以下两个时间点调用:1、在Android安装一个新的apk时,系统会自动调用dexopt程序(位于手机上/system/bin/dexopt),将apk中的classes.dex转化成odex格式的文件,并将odex格式的文件存放在/data/dalvik-cache目录中;当该APK运行时,实际运行的代码文件是在/data/dalvik-cache中的odex文件。2、使用Android提供的类装载器(DexClassLoader或者PathClassLoader)时,dexopt也会被自动调用。DexClassLoader原型如下为DexClassLoader(String dexPath,String dexOutputDir,String libPath,ClassLoader parent),其中,dexPath是输入的j ar,apk或者zip;dexOutputDir是odex文件存放的路径。\nDexClassLoader是Android平台上提供的一个类加载器,用于动态加载jar,zip或者apk格式的文件,构造函数如下:DexClassLoader(String dexPath,String dexOutputDir,String libPath,ClassLoader parent)。\n[0023] 其中,ODEX文件是指优化的dex文件,是安卓上的应用程序apk中提取出来的可运行文件,即将APK中的classes.dex文件通过dex优化过程(dexopt)优化生成一个.dex文件单独存放,原APK中的classes.dex文件会保留。这样做可以加快软件的启动速度,预先提取,减少对RAM的占用,因为没有odex的话,系统要从apk包中提取dex再运行。\n[0024] ClassLoader类加载器,Java程序(class文件)并不是本地的可执行程序,当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。\n[0025] 同样地,Dalvik虚拟机也支持类的动态载入,在执行类的动态载入时也需要将类通过dexopt程序转化为odex的格式,然后该odex格式的文件再交给Dalvik虚拟机执行。\n实施例\n[0026] 传统的Java虚拟机可以通过ClassLoader的defineClass定义类的方法来实现类的加密,defineClass可以将内存中的一段数据转换为虚拟机的类,但Android虚拟机不提供该方法。另外,由于Android虚拟机引入了一个叫dexopt的阶段,dex文件必须通过该程序转换为odex文件,odex是运行时或者安装apk时产生的,并且存放在磁盘上。由于Android虚拟机本身的限制,导致正常的方法无法实现类的加密。\n[0027] 如图3所示,本发明采用替换API的方式,实现APK的加密。由于Android Dalvik虚拟机和APK运行在同一个进程空间中,因此可以替换掉Dalvik VM的关键API,从而实现APK的运行时解密。\n[0028] 替换API是指替换掉系统的函数,例如替换掉本进程的I/O系统调用以及davik vm,如open,close,read等函数,实际上是劫持了系统的函数。通过安装启动代码,即安装这些替换API,执行dexopt等,安装完劫持函数后,程序在后续执行的过程中,当调用到这些API时,实际上执行替换后的函数\n[0029] 根据本发明的方法包括:步骤1,通过打包工具将APK文件打包成加密的APK文件;\n步骤2,通过拦截并且替换API的方式,进行运行时的加解密。\n[0030] 其中,Android一个APK主要有classes.dex、AndroidManifest.xml以及res、asset、lib几个目录组成。步骤1包括:步骤11,将Classes.dex加密后放在asset/classes.jar中;步骤12,将原来的classes.dex替换为新的启动代码;步骤13,修改AndroidManifest.xml文件,保证新的启动代码会最先执行;步骤14,加入C的运行时库,用于动态修改当前Dalvik虚拟机的代码、dexopt的代码和加解密的代码。\n[0031] 其中,步骤2包括:步骤21,执行新的启动代码;步骤22,拦截标准IO函数;步骤23,拦截Dalvik VM中解析Class的函数;步骤24,执行DexOpt文件,并且安装拦截IO函数;步骤\n25,调用DexClassLoader,装载加密后的类。\n[0032] 其中,步骤23还包括:步骤231,拦截Dalvik VM中执行Class的函数。\n[0033] 其中,步骤22,拦截标准输入输出API。具体地,通过拦截标准的系统调用的诸如open、read、write、mmap、msync等底层的IO函数,在Dalvik VM和dexopt程序中读取和写入dex文件和odex文件时,实现相应的加解密。在这种方案中,整个odex在磁盘上是加密的,但在内存中是解密的。\n[0034] 其中,步骤23,拦截Dalvik VM中解析Class的函数。具体地,由于dex文件在处理dexopt时,可以设置一定的标志,使得dexopt不处理dex文件中每个类的字节码。所以,可以通过拦截Dalvik VM中解析类的函数,在每个类解析时,再解密该类的字节码。\n[0035] 在这种方案中,整个odex在磁盘上是加密的,在内存中每个类也是部分加密的,每个类的字节码还是加密的。只有在这个类第一次被解析时,才会对该类的方法进行解密。\n[0036] 具体地,步骤231,拦截Dalvik VM中执行Class的函数。具体地,在步骤23的基础上,对字节码的操作符进行映射,将原有的字节码映射为新的一套字节码。运行时,拦截Dalvik VM中执行字节码的函数,使得Dalvik VM认识新的字节码,从而让Dalvik VM能够执行这套字节码。\n[0037] 在这种方案中,整个odex在磁盘上是加密的,在内存中每个类也是部分加密的,每个类的字节码还是加密的。同时,解密后的字节码只能在修改的Dalvik VM执行引擎中才能执行。如果将这些字节码放到正常的虚拟机中,则无法执行。\n[0038] 最后应说明的是,以上实施例仅用以描述本发明的技术方案而不是对本技术方法进行限制,本发明在应用上可以延伸为其他的修改、变化、应用和实施例,并且因此认为所有这样的修改、变化、应用、实施例都在本发明的精神和教导范围内。
法律信息
- 2018-01-16
专利权人的姓名或者名称、地址的变更
专利权人由北京洋浦伟业科技发展有限公司变更为北京梆梆安全科技有限公司
地址由100083 北京市海淀区学院路30号科大天工大厦A座605房间变更为100083 北京市海淀区学院路30号科大天工大厦A座605房间
- 2017-06-09
- 2014-08-06
实质审查的生效
IPC(主分类): G06F 21/12
专利申请号: 201310004951.1
申请日: 2013.01.07
- 2014-07-09
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2011-11-09
|
2011-06-30
| | |
2
| |
2011-06-08
|
2011-01-28
| | |
3
| |
2013-01-02
|
2012-07-20
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |