CN108229112B - 一种保护应用程序、应用程序的运行方法以及装置 - Google Patents

一种保护应用程序、应用程序的运行方法以及装置 Download PDF

Info

Publication number
CN108229112B
CN108229112B CN201611199716.4A CN201611199716A CN108229112B CN 108229112 B CN108229112 B CN 108229112B CN 201611199716 A CN201611199716 A CN 201611199716A CN 108229112 B CN108229112 B CN 108229112B
Authority
CN
China
Prior art keywords
file
host program
subunit
program
application
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201611199716.4A
Other languages
English (en)
Other versions
CN108229112A (zh
Inventor
郑海波
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Alibaba Group Holding Ltd
Original Assignee
Alibaba Group Holding Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Alibaba Group Holding Ltd filed Critical Alibaba Group Holding Ltd
Priority to CN201611199716.4A priority Critical patent/CN108229112B/zh
Publication of CN108229112A publication Critical patent/CN108229112A/zh
Application granted granted Critical
Publication of CN108229112B publication Critical patent/CN108229112B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/60Protecting data
    • G06F21/602Providing cryptographic facilities or services

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Technology Law (AREA)
  • Multimedia (AREA)
  • Health & Medical Sciences (AREA)
  • Bioethics (AREA)
  • General Health & Medical Sciences (AREA)
  • Storage Device Security (AREA)

Abstract

本申请公开了一种保护应用程序的方法、装置、一种应用程序的运行方法以及装置。其中,所述保护应用程序的方法,包括:获取待保护的文件的配置文件;根据配置文件创建宿主程序;将待保护的文件进行加密处理;将加密后的文件打包到宿主程序内生成保护文件。保护应用程序的方法和应用程序的运行方法相互配合使用,通过宿主程序为dex文件以及资源文件整体加密后的APK提供运行时所需要的android环境,代理被加密的APK的生命周期,在宿主程序中运行加密后的APK。所述技术方案对APK的dex文件和资源整体加密,使得被保护的应用更加安全不易被反编译;且在加密后只增加了极少容量节约存储空间;并且采用无注入文件的加壳方式,不会对操作***带来兼容性的问题。

Description

一种保护应用程序、应用程序的运行方法以及装置
技术领域
本申请涉及数据安全技术领域,具体涉及一种保护应用程序的方法以及一种应用程序的运行方法。本申请同时涉及一种保护应用程序的装置以及一种应用程序的运行装置。
背景技术
APK文件是Android安卓平台的应用程序包文件(application package file),是一种Androi操作***上的应用程序安装文件格式。一个Android应用程序的代码在Android设备上运行,必须先进行编译,然后被打包成为一个被Android***所能识别的文件才可以被运行,而这种能被Android***识别并运行的文件格式便是“APK”文件。一个APK文件内包含被编译的代码文件(classes.dex文件)、文件资源(resources)、证书(certificates)和清单文件(manifestfile:AndroidManifest.xml)。
由于Android平台采用Java语言开发,导致Apk中的代码易于反编译。在反编译的基础上,很容易实现Apk的篡改。APK篡改是指通过反编译APK文件,进行汇编级的代码分析、修改或***代码,重新签名打包为新的APK文件,以达到改变程序原有行为的目的。目前,APK篡改在Android业界使用非常频繁,主要被应用于以下用途,包括:修改国外软件的资源文件达到汉化的目的;加入广告代码;加入扣费代码;应用程序钓鱼,通过加入恶意的代码来窃取用户的隐私信息;修改License代码对软件破解。可以看出,上述多个用途都严重损害了应用程序开发商的利益。
目前常见的保护APK的方法是采用“加壳”的方式,即将APK的dex文件加密为so文件,然后存储在资源目录下,将被加壳的APK的dex替换为壳程序,并注入so库文件,然后将被加壳APK重新打包生成新的APK文件。
由此可见,在现有的APK的保护方案下,只是针对本身dex文件进行加密,未对APK的资源进行加密;加密后的APK被注入了so文件,增大了APK的容量,占用存储空间;并且若注入了so文件后,可能会引起操作***兼容性的问题。
申请内容
本申请提供一种保护应用程序的方法以及一种应用程序的运行方法,以解决现有技术中的上述问题。本申请另外提供一种保护应用程序的装置以及一种应用程序的运行装置。
本申请提供一种保护应用程序的方法,所述保护应用程序的方法,包括:
获取待保护的文件的配置文件;
根据所述配置文件创建宿主程序;
将所述待保护的文件进行加密处理;
将加密后的所述文件打包到所述宿主程序内,生成保护文件。
可选的,所述根据所述配置文件创建宿主程序,包括:
根据宿主程序的jar包创建所述宿主程序;
将所述配置文件修改为所述宿主程序的配置文件。
可选的,所述根据宿主程序的jar包创建所述宿主程序,包括:
创建android项目;
删除所述android项目的资源文件;
将所述宿主程序的jar包放入所述android项目内。
可选的,在所述获取待保护的文件的配置文件时,包括:
判断所述待保护的文件中是否具有so文件;
若是,则在执行所述将所述宿主程序的jar包放入所述android项目内的步骤时,将所述so文件放入与所述宿主程序的jar包相同的路径下。
可选的,所述获取待保护的文件的配置文件,包括:
创建所述待保护的文件的副本;
对所述副本进行反编译获取所述待保护的文件的配置文件。
可选的,在所述将所述待保护的文件进行加密处理的步骤之后,包括:
保存将所述待保护的文件进行加密的密码。
可选的,所述将加密后的所述文件打包到所述宿主程序内,包括:
将加密后的所述文件打包到所述宿主程序的资源目录下。
相应的,本申请还提供了一种保护应用程序的装置,所述保护应用程序的装置,包括:
配置文件获取单元,用于获取待保护的文件的配置文件;
宿主程序创建单元,用于根据所述配置文件创建宿主程序;
加密单元,用于将所述待保护的文件进行加密处理;
程序打包单元,用于将加密后的所述文件打包到所述宿主程序内,生成保护文件。
可选的,所述宿主程序创建单元,包括:
宿主程序创建子单元,用于根据宿主程序的jar包创建所述宿主程序;
配置文件修改子单元,用于将所述配置文件修改为所述宿主程序的配置文件。
可选的,所述宿主程序创建子单元,包括:
项目创建子单元,用于创建android项目;
资源删除子单元,用于删除所述android项目的资源文件;
打包子单元,用于将所述宿主程序的jar包放入所述android项目内。
可选的,所述配置文件获取单元,包括:
判断子单元,用于判断所述待保护的文件中是否具有so文件;
写入子单元,用于接收所述判断子单元的判断结果,若是,则在触发所述打包子单元时,将所述so文件放入与所述宿主程序的jar包相同的路径下。
可选的,所述配置文件获取单元,还包括:
副本创建子单元,用于创建所述待保护的文件的副本;
配置文件获取子单元,用于对所述副本进行反编译获取所述待保护的文件的配置文件。
可选的,所述的保护应用程序的装置,还包括:
密码存储单元,用于在所述将所述待保护的文件进行加密处理之后,保存将所述待保护的文件进行加密的密码。
可选的,所述程序打包单元,具体用于将加密后的所述文件打包到所述宿主程序的资源目录下。
此外,本申请提供一种应用程序的运行方法,所述应用程序的运行方法,包括:
启动存有加密文件的宿主程序;
对所述宿主程序存储的加密文件进行解密;
在所述宿主程序内,构建解密后的所述文件运行所需的环境参数和资源对象;
基于所述环境参数和所述资源对象,在所述宿主程序内运行所述加密文件。
可选的,所述在所述宿主程序内,构建解密后的所述文件运行所需的环境参数和资源对象,包括:
加载解密后的所述文件;
根据所述文件的资源对象,构建所述宿主程序的资源对象;所述宿主程序的资源对象提供所述文件运行时所需的资源;
根据所述文件的应用节点标签,在所述宿主程序内构建所述文件的环境参数。
可选的,所述根据所述文件的资源对象,构建所述宿主程序的资源对象,包括:
构建所述宿主程序的资源对象;
在所述资源对象中添加所述文件的路径;
使所述资源对象中存储所述文件中的资源。
可选的,所述根据所述文件的应用节点标签,在所述宿主程序内构建所述文件的环境参数,包括:
根据所述宿主程序中的应用节点标签获取主线程对象;
获取所述主线程对象中的成员变量;
根据所述文件的应用节点标签以及构建的所述宿主程序的资源对象,替换所述成员变量中对应的对象。
可选的,所述对所述宿主程序存储的加密文件进行解密,包括:
判断本地是否存储所述加密文件的解密密码;
若是,则根据本地存储的所述解密密码对宿主程序存储的加密文件进行解密;
若否,则从服务器端获取所述解密密码,并根据所述解密密码对宿主程序存储的加密文件进行解密。
可选的,在所述从服务器端获取所述密码的步骤之后,包括:
将从所述服务器端获取所述解密密码存储在本地。
可选的,在所述在所述宿主程序内运行所述加密文件的步骤之前,包括:
向服务器端发送版本检测请求;所述版本检测请求中携带所述宿主程序内的加密文件的版本号;
接收所述服务器端反馈的版本检测信息;
若所述服务器端中具有版本号高于所述宿主程序内的加密文件的版本号的版本,则从所述服务器端下载版本号最高的文件;
若所述宿主程序内的加密文件为版本号最高的版本,则运行所述宿主程序。
可选的,在所述从所述服务器端下载版本号最高的文件的步骤之后,包括:
对下载的所述文件进行校验;
将所述文件替换所述宿主程序内的加密文件;
运行所述宿主程序。
相应的,本申请还提供了一种应用程序的运行装置,所述应用程序的运行装置,包括:
启动单元,用于启动存有加密文件的宿主程序;
解密单元,用于对所述宿主程序存储的加密文件进行解密;
构建单元,用于在所述宿主程序内,构建解密后的所述文件运行所需的环境参数和资源对象
程序运行单元,用于基于所述环境参数和所述资源对象,在所述宿主程序内运行所述加密文件。
可选的,所述构建单元,包括:
加载单元,用于加载解密后的所述文件;
资源构建子单元,用于根据所述文件的资源对象,构建所述宿主程序的资源对象;所述宿主程序的资源对象提供所述文件运行时所需的资源;
环境构建子单元,用于根据所述文件的应用节点标签,在所述宿主程序内构建所述文件的环境参数。
可选的,所述资源构建子单元,包括:
资源对象构建子单元,用于构建所述宿主程序的资源对象;
路径添加子单元,用于在所述资源对象中添加所述文件的路径;
资源存储子单元,用于使所述资源对象中存储所述文件中的资源。
可选的,所述环境构建子单元,包括:
主线程对象获取子单元,用于根据所述宿主程序中的应用节点标签获取主线程对象;
成员变量获取子单元,用于获取所述主线程对象中的成员变量;
对象替换子单元,用于根据所述文件的应用节点标签以及构建的所述宿主程序的资源对象,替换所述成员变量中对应的对象。
可选的,所述解密单元,包括:
密码判断子单元,用于判断本地是否存储所述加密文件的解密密码;
本地密码解密子单元,用于接收所述密码判断子单元的判断结果,若是,则根据本地存储的所述解密密码对宿主程序存储的加密文件进行解密;
密码获取子单元,用于接收所述密码判断子单元的判断结果,若否,则从服务器端获取所述解密密码,并根据所述解密密码对宿主程序存储的加密文件进行解密。
可选的,所述解密单元,还包括:
密码存储子单元,用于在所述从服务器端获取所述密码之后,将从所述服务器端获取所述解密密码存储在本地。
可选的,所述程序运行单元,还包括:
检测请求发送子单元,用于在所述运行所述宿主程序之前,向服务器端发送版本检测请求;所述版本检测请求中携带所述宿主程序内的加密文件的版本号;
检测信息接收子单元,用于接收所述服务器端反馈的版本检测信息;
文件下载子单元,用于若所述服务器端中具有版本号高于所述宿主程序内的加密文件的版本号的版本,则从所述服务器端下载版本号最高的文件;
程序运行子单元,用于若所述宿主程序内的加密文件为版本号最高的版本,则运行所述宿主程序。
可选的,所述文件下载子单元,还包括:
校验子单元,用于在所述从所述服务器端下载版本号最高的文件之后,对下载的所述文件进行校验;
文件替换子单元,用于将所述文件替换所述宿主程序内的加密文件;
程序运行触发子单元,用于触发所述程序运行子单元。
与现有技术相比,本申请具有以下优点:
本申请提供的一种保护应用程序的方法以及装置,通过获取待保护的文件的配置文件;根据所述配置文件创建宿主程序;将所述待保护的文件进行加密处理;将加密后的所述文件打包到所述宿主程序内,生成保护文件。
本申请还提供的一种应用程序的运行方法以及装置,通过启动存有加密文件的宿主程序;对所述宿主程序存储的加密文件进行解密;在所述宿主程序内,构建解密后的所述文件运行所需的环境参数和资源对象;基于所述环境参数和所述资源对象,在所述宿主程序内运行所述加密文件。
所述保护应用程序的方法以及所述应用程序的运行方法相互配合使用,通过宿主程序为dex文件以及资源文件整体加密后的APK提供运行时所需要的android环境,代理被加密的APK的生命周期,在宿主程序中运行加密后的APK。所述技术方案对APK的dex文件以及资源进行了整体加密,使得被保护的应用更加安全,不易被反编译;并且在加密后只使APK增加了极少的容量节约了存储空间;并且采用了无注入文件的保护方式,不会对操作***带来兼容性的问题。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。
图1示出了根据本申请的实施例提供的保护应用程序的方法的流程图;
图2示出了根据本申请的实施例提供的保护应用程序的装置的示意图;
图3示出了根据本申请的实施例提供的应用程序的运行方法的流程图;
图4示出了根据本申请的实施例提供的根据所述文件的资源对象,构建所述宿主程序的资源对象的流程图;
图5示出了根据本申请的实施例提供的根据所述文件的应用节点标签,在所述宿主程序内构建所述文件的环境参数的流程图;
图6示出了根据本申请的实施例提供的应用程序的运行装置的示意图。
具体实施方式
在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是本申请能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此本申请不受下面公开的具体实施的限制。
为了能够更清楚地理解本申请的上述目的、特征和优点,下面结合附图和具体实施方式对本申请进行进一步的详细描述。需要说明的是,在不冲突的情况下,本申请的实施例及实施例中的特征可以相互组合。
本申请的实施例提供了一种保护应用程序的方法以及一种应用程序的运行方法。本申请另外提供一种保护应用程序的装置以及一种应用程序的运行装置。
目前常见的保护APK的方法是采用“加壳”的方式,即将APK的dex文件加密为so文件,然后存储在资源目录下,将被加壳的APK的dex替换为壳程序,并注入so库文件,然后将被加壳APK重新打包生成新的APK文件。由此可见,在现有的APK的保护方案下,只是针对本身dex文件进行加密,未对APK的资源进行加密;加密后的APK被注入了so文件,增大了APK的容量,占用存储空间;并且若注入了so文件后,可能会引起操作***兼容性的问题。针对这一问题,本申请的技术方案通过宿主程序为dex文件以及资源文件整体加密后的APK提供运行时所需要的android环境,代理被加密的APK的生命周期,在宿主程序中运行加密后的APK。所述技术方案对APK的dex文件以及资源进行了整体加密,使得被保护的应用更加安全,不易被反编译;并且在加密后只使APK增加了极少的容量节约了存储空间;并且采用了无注入文件的保护方式,不会对操作***带来兼容性的问题。
在详细描述本实施例的具体步骤之前,先对本技术方案涉及的APK文件作简要说明。
在Android***上,一个可以安装、运行的应用,需要打包成Android***的APK文件格式。APK是AndroidPackage的缩写,简称APK文件。APK文件把Android sdk编译的工程打包成一个安装程序文件,即Android安装包。APK文件其实是ZIP文件格式,但后缀名被修改为.apk文件。
反编译是指计算机软件的反向工程(Reverse engineering),也可以称为计算机软件还原工程。通过对目标程序(比如可执行程序)进行“逆向分析、研究”工作,以推导出软件产品所使用的思路、原理、结构、算法、处理过程、运行方法等设计要素,某些特定情况下可能推导出源代码。
反编译APK文件:反编译APK文件一般是在计算机中进行的,在对生成APK文件的各个文件进行反编译的过程中,计算机会通过检测文件的文件头信息中的加密标记位判断文件是否已经加密,若已加密,需提供相应的密码解密后才能继续后续的反编译文件的工作。
在本申请中将APK文件反编译后可以获取到的APK的内部文件结构包括:
META-INF\目录
res\目录
assets\目录
resources
classes.dex
AndroidManifest.xml
lib\目录
其中,META-INF目录下一般有manifest和以.ras、.sf结尾的文件,记录了其它目录文件的证书签名,Android***在安装APK时会逐个检查APK内部各文件是否与本目录记录的证书签名一致,如果不一致,则认为文件已被篡改,拒绝该APK的安装和运行;
res目录存放的是Android应用所使用的图片、文件资源和界面布局等文件。
assets目录下存放的是Android应用所使用的额外资源和配置文件,如TXT或HTML说明文档、字体文件和图片资源等。
resources文件是经过编译后的二进制资源文件。
class.dex文件是Java源码编译后生成的Java字节码文件,.dex是DalvikExecutable(Dalvik虚拟机可执行文件)的缩写。.dex是Android平台上可执行文件的类型。
AndroidManifest.xml文件是APK的全局配置文件,该文件记录了应用的包名、版本号、权限、引用的库文件、模块入口、类等信息。
lib目录是JNI(Java Native Interface)库文件,一般存放一些so文件。so文件是linux下的库文件,是ELF格式的动态链接库文件,该类文件在程序运行需要的时候才动态加载到程序中,后缀为.so。
本申请的实施例提供了一种保护应用程序的方法,所述保护应用程序的方法实施例如下:
请参考图1,其示出了根据本申请的实施例提供的保护应用程序的方法的流程图。
所述保护应用程序的方法包括:
步骤S101,获取待保护的文件的配置文件。
在本实施例中,所述获取待保护的文件的配置文件,可以采用如下方式实现:使用反编译工具对所述待保护的文件进行反编译,获取所述待保护的文件的配置文件。
在本实施例中,使用反编译工具对所述待保护的文件进行反编译,只是一种获取配置文件的实现方式,除此之外,也可以采用其他的方式获取配置文件,在此不做限定。
需要说明的是,所述待保护的文件可以是安装包文件,则通过反编译工具对安装包文件进行反编译后获取配置文件。
例如:所述安装包文件可以是APK文件,版本可以为Android 1.0至Android7.0Nouga版本之间,则对于所述APK文件通过反编译工具进行反编译后获取配置文件为AndroidManifest.xml文件。在所述APK文件的版本中,也不排除随着技术进步出现的其它新的版本,在此不作限定。
在具体实施时,使用反编译工具对所述待保护的文件进行反编译时,使用的Android反编译工具包括但不限于目前流行的apktool或dex2jar和在现有技术下的任何可以对APK文件进行反编译反编译工具,也不排除随着技术进步使用其它新出现的反编译工具,在此不作限定。
步骤S103,根据所述配置文件创建宿主程序。
在本实施例中,所述根据所述配置文件创建宿主程序,可以采用如下方式实现:基于步骤S101中获取的所述待保护的文件的配置文件配置所述宿主程序的配置文件,并创建所述宿主程序。
由于所述宿主程序需要为待保护的文件提供运行时所需要的运行环境,所以在基于所述待保护的文件的配置文件配置所述宿主程序的配置文件时,需要对配置出的所述宿主程序的配置文件的内容进行修改,则所述根据所述配置文件创建宿主程序,具体包括如下步骤:
根据宿主程序的jar包创建所述宿主程序;
将所述配置文件修改为所述宿主程序的配置文件。
在本实施例中,所述根据宿主程序的jar包创建所述宿主程序,可以采用如下方式实现:通过所述宿主程序的核心jar包创建所述宿主程序。
需要说明的是,所述jar包就是将已写好的一些java源文件编译后的class文件进行打包形成的压缩文件。在引入jar包后,就可以在工程内直接调用jar中相关的类。
例如:所述待保护的文件为APK文件,所述宿主程序为host程序,该host程序是一个可以独立运行在Android操作***中的APK文件。所述host程序需要为待保护的APK文件提供运行时所需要的Android环境,所以在基于所述待保护的APK文件的AndroidManifest.xml文件配置所述host程序的AndroidManifest.xml文件时,需要对配置出的所述host程序的AndroidManifest.xml文件的内容进行修改。
可以理解的,每一个APK文件都包含一个配置文件AndroidManifest.xml,它存储在项目层次中的最底层。配置文件可以定义应用程序以及组建的结构和元数据。配置文件包含了组成应用程序的每一个组件(活动、服务、内容提供器和广播接收器)的节点。它还提供了各种属性来详细地说明应用程序的元数据(图标或者主题)以及额外的可用来进行安全设置和单元测试顶级节点。
在本实施例中,所述将所述配置文件修改为所述宿主程序的配置文件,可以采用如下方式实现:将所述待保护的APK文件中的所述配置文件的应用程序入口点指向,由指向原dex文件修改为指向host程序。
需要说明的是,配置文件AndroidManifest.xml是每个APK文件所必需的全局描述文件,里面列出了APK文件中每个模块的入口信息。在所述配置文件中,包含了一些节点,它们定义了应用程序组件、安全设置和组成应用程序的测试类。下面列出了一些常用的节点标签:
应用节点标签(application),在配置文件中一般只包含一个application节点。application节点使用各种属性来指定应用程序的各种元数据(包括标题、图标和主题)。application节点还可以作为一个包含了活动、服务、内容提供器和广播接收器标签的容器,用来指定应用程序组件。
活动节点标签(activity),应用程序显示的每一个活动(Activity)都要求有一个activity标签。
具体的,所述配置文件的应用程序入口点是在application下的onCreate。严格来说,所述配置文件的应用程序入口是ActivityThread的main函数。
需要说明的是,ActivityThread它管理应用进程的主线程的执行(相当于普通Java程序的main入口函数),负责调度和执行activities、broadcasts和其它操作。ActivityThread类即代表application主线程。
在本实施例中,所述根据宿主程序的jar包创建所述宿主程序,具体包括如下步骤:
创建android项目;
删除所述android项目的资源文件;
将所述宿主程序的jar包放入所述android项目内。
在本实施例中,所述创建android项目,可以采用如下方式实现:在java开发工具(例如:eclipse)中新建一个空的Android项目,将所述Android项目作为host项目。
在本实施例中,所述删除所述android项目的资源文件,可以采用如下方式实现:将创建的所述android项目中的assets目录下的资源文件进行删除。
在本实施例中,所述将所述宿主程序的jar包放入所述android项目内,可以采用如下方式实现:将所述宿主程序的核心jar包复制到所述android项目的libs目录下。
步骤S105,将所述待保护的文件进行加密处理。
在本实施例中,所述将所述待保护的文件进行加密处理,可以采用如下方式实现:通过压缩工具对所述待保护的文件进行压缩和加密处理。
需要说明的是,所述待保护的文件可以是安装包文件,通过压缩工具对所述待保护的安装包文件进行压缩并对压缩后的安装包文件进行加密处理。
具体的,所述待保护的安装包文件为APK文件,且Android APK文件的本质上就是ZIP格式的压缩包,所以将Android应用程序的后缀.apk改为.zip就可以用压缩工具将该APK文件进行压缩或解压缩。而在对APK文件进行压缩时同样可以使用压缩工具对APK文件进行加密处理。在ZIP的文件格式中有一个位用来标示该zip压缩文件中的文件是否被加密,在该APK文件进行加密后将该标志位将其置1。
在具体实施时,可以使用ZIP压缩工具对所述待保护的文件进行压缩加密处理。
步骤S107,将加密后的所述文件打包到所述宿主程序内,生成保护文件。
在本实施例中,所述将加密后的所述文件打包到所述宿主程序内,生成保护文件,可以采用如下方式实现:将加密后的所述文件复制到所述宿主程序内,以存储了加密后的所述文件的宿主程序以及所述宿主程序的配置文件,进行打包封装后封装文件,生成保护文件。
例如:所述加密后的所述文件为安装包文件,则在执行步骤S107时,是将加密后的所述安装包文件复制到所述宿主程序内,以存储了加密后的所述安装包文件的宿主程序以及所述宿主程序的配置文件,进行打包封装后封装文件,生成保护文件。
具体的,所述安装包文件可以是android的APK文件,且所述宿主程序为host程序,则生成保护文件为host.apk。
可以理解的,生成的所述保护文件host.apk中包括打包后的加密源APK文件以及host运行程序。
在具体实施时,所述将加密后的所述APK文件打包到所述宿主程序内,是将加密后的所述APK文件复制到所述宿主程序host的资源目录assets目录下。
需要说明的是,在生成一个APK文件时,在该APK文件中除了有代码文件之外,还有很多资源文件。这些资源文件是通过Android资源打包工具aapt(Android Asset PackageTool)打包到APK文件里面的。在打包之前,大部分文本格式的XML资源文件还会被编译成二进制格式的XML资源文件。
在打包时所有资源文件都编译以及生成完成之后,才可以将所有资源文件打包到APK文件,包括:
1.assets目录;
2.res目录;
3.资源项索引文件resources.arsc。
当然,除了这些资源文件外,配置文件AndroidManifest.xml以及用来描述APK的签名信息的文件,也会一并被打包到APK文件中。
作为一个优选实施方式,本申请实施例提供的保护应用程序的方法中,有些APK文件中会携带so格式的文件,则在执行步骤S101获取待保护的文件的配置文件时,还需要判断所述待保护的文件中是否具有so文件;如果所述待保护的文件中具有so文件,则在执行步骤步骤S103根据所述配置文件创建宿主程序时,在执行所述将所述宿主程序的jar包放入所述android项目内的步骤中,还需将所述待保护的文件内的所述so文件放入与所述宿主程序的jar包相同的路径下。
具体的,判断待保护的APK文件中是否具有so文件,可以在该APK文件的libs目录下进行查找,当具有so文件时都会存储在相应APK文件的libs目录下。
可以理解的,so文件是对应于不同cpu架构的协议文件,在使用java的情况下不使用so文件。
如果所述待保护的文件中具有so文件,则在创建宿主程序时将所述待保护的文件中的so文件复制到所述宿主程序的ibs目录下。
作为一个优选实施方式,本申请实施例提供的保护应用程序的方法中,在执行步骤S101获取待保护的文件的配置文件时,是对所述待保护的文件进行复制创建一份副本,并对创建的所述副本进行反编译获取所述待保护的文件的配置文件。
作为一个优选实施方式,本申请实施例提供的保护应用程序的方法中,在执行步骤S105将所述待保护的文件进行加密处理后,由于对所述待保护的文件通过使用密码进行了加密处理,所以需要将使用的加密密码进行保存,将所述密码存储在服务器端。
在上述的实施例中,提供了一种保护应用程序的方法,与上述保护应用程序的方法相对应的,本申请还提供了一种保护应用程序的装置。由于装置的实施例基本相似于方法的实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。所述保护应用程序的装置实施例如下:
请参考图2,其示出了根据本申请的实施例提供的保护应用程序的装置的示意图。
所述保护应用程序的装置,包括:配置文件获取单元201、宿主程序创建单元203、加密单元205以及程序打包单元207;
所述配置文件获取单元201,用于获取待保护的文件的配置文件;
所述宿主程序创建单元203,用于根据所述配置文件创建宿主程序;
所述加密单元205,用于将所述待保护的文件进行加密处理;
所述程序打包单元207,用于将加密后的所述文件打包到所述宿主程序内,生成保护文件。
可选的,所述宿主程序创建单元203,包括:宿主程序创建子单元以及配置文件修改子单元;
所述宿主程序创建子单元,用于根据宿主程序的jar包创建所述宿主程序;
所述配置文件修改子单元,用于将所述配置文件修改为所述宿主程序的配置文件。
可选的,所述宿主程序创建子单元,包括:项目创建子单元、资源删除子单元以及打包子单元;
所述项目创建子单元,用于创建android项目;
所述资源删除子单元,用于删除所述android项目的资源文件;
所述打包子单元,用于将所述宿主程序的jar包放入所述android项目内。
可选的,所述配置文件获取单元,包括:判断子单元以及写入子单元;
所述判断子单元,用于判断所述待保护的文件中是否具有so文件;
所述写入子单元,用于接收所述判断子单元的判断结果,若是,则在触发所述打包子单元时,将所述so文件放入与所述宿主程序的jar包相同的路径下。
可选的,所述配置文件获取单元201,还包括:副本创建子单元以及配置文件获取子单元;
所述副本创建子单元,用于创建所述待保护的文件的副本;
所述配置文件获取子单元,用于对所述副本进行反编译获取所述待保护的文件的配置文件。
可选的,所述的保护应用程序的装置,还包括:密码存储单元;
所述密码存储单元,用于在所述将所述待保护的文件进行加密处理之后,保存将所述待保护的文件进行加密的密码。
可选的,所述程序打包单元207,具体用于将加密后的所述文件打包到所述宿主程序的资源目录下。
在上述的实施例中,提供了一种保护应用程序的方法以及一种保护应用程序的装置,此外,本申请还提供了一种应用程序的运行方法;所述应用程序的运行方法实施例如下:
请参考图3,其示出了根据本申请的实施例提供的应用程序的运行方法的流程图。
所述应用程序的运行方法包括:
步骤S301,启动存有加密文件的宿主程序。
在本实施例中,所述启动存有加密文件的宿主程序,可以采用如下方式实现:监听存有加密文件的宿主程序,在接收到用户对所述宿主程序的启动指令后,启动所述宿主程序。
例如:在接收到用户对所述宿主程序的图标进行点击的操作时,启动所述宿主程序。
步骤S303,对所述宿主程序存储的加密文件进行解密。
在本实施例中,所述对所述宿主程序存储的加密文件进行解密,可以采用如下方式实现:使用解压缩工具并通过解密密码,对所述宿主程序存储的加密文件进行解密。
在具体实施时,可以使用ZIP解压缩工具对所述宿主程序内的加密文件进行解压缩。
例如:所述宿主程序为host程序,使用解压缩工具通过所述解密密码对存放在所述宿主程序的assets目录下的加密文件进行解压缩处理,从而得到保护前的源安装包文件,
在本实施例中,所述解密密码是所述宿主程序内的加密文件在进行加密处理时使用的加密密码,所以在根据所述密码对宿主程序内的加密文件进行解密前,先要从网络服务器端或本地获取所述解压的密码,则所述根据密码对宿主程序内的加密文件进行解密,具体包括如下步骤:
判断本地是否存储所述加密文件的解密密码;
若是,则根据本地存储的所述解密密码对宿主程序存储的加密文件进行解密;
若否,则从服务器端获取所述解密密码,并根据所述解密密码对宿主程序存储的加密文件进行解密。
在本实施例中,在host程序开始运行时,根据host程序的配置文件内的应用节点标签application中的应用程序入口指向加载host运行程序,在host程序的application中从网络服务端或本地获取获取解密密码。
具体的,判断本地是否存储所述解密密码是在本地缓存中是否存储有所述解密密码,若是则直接通过本地缓存中的所述解密密码对宿主程序内的加密文件进行解密;若本地缓存中没有存储所述解密密码,则通过TCP/IP连接等网络协议向服务器端发起连接,所述服务器端在TCP端口上监听接受所述宿主程序的连接请求,建立连接后进行信息交互从服务器端获取所述解密密码。
步骤S305,在所述宿主程序内,构建解密后的所述文件运行所需的环境参数和资源对象。
在本实施例中,所述在所述宿主程序内,构建解密后的所述文件运行所需的环境参数和资源对象,可以采用如下方式实现:在所述宿主程序内,根据解密后的所述文件中的资源对象构建所述宿主程序的资源对象,并根据所述文件的应用节点标签,构建所述文件的环境参数。
下面对所述在所述宿主程序内,构建解密后的所述文件运行所需的环境参数和资源对象进行详细说明。
所述在所述宿主程序内,构建解密后的所述文件运行所需的环境参数和资源对象,具体包括如下步骤:
加载解密后的所述文件;
根据所述文件的资源对象,构建所述宿主程序的资源对象;所述宿主程序的资源对象提供所述文件运行时所需的资源;
根据所述文件的应用节点标签,在所述宿主程序内构建所述文件的环境参数。
在本实施例中,所述加载解密后的所述文件,可以采用如下方式实现:使用所述宿主程序的类加载器加载解密后的所述文件。
需要说明的是,解密后的所述文件为安装包文件,可以是android的APK文件。在对APK文件进行加载的具体过程是,使用MultiDex根据Android的类加载技术(ClassLoader程序)将解密后的所述文件中的dex文件添加到当前的dexPathList中进行加载,使解密后的所述文件中的类添加到当前的ClassLoader中。
需要说明的是,将dex文件添加到当前的dexPathList中进行加载,是根据dex文件中文件头部结构中的data_size字段及data_off字段信息,找到存放解密后的所述文件功能的源代码的物理地址,将将源代码加载至内存。
在本实施例中,所述根据所述文件的资源对象,构建所述宿主程序的资源对象,可以采用如下方式实现:将所述文件的资源对象添加到所述宿主程序内,使所述宿主程序中存储所述文件中的资源,提供所述文件运行时所需的资源。
所述根据所述文件的资源对象,构建所述宿主程序的资源对象,具体包括步骤S305-1至S305-3,下面结合附图4作进一步说明。
请参考图4,其示出了根据本申请的实施例提供的根据所述文件的资源对象,构建所述宿主程序的资源对象的流程图。
所述根据所述文件的资源对象,构建所述宿主程序的资源对象,包括:
步骤S305-1,构建所述宿主程序的资源对象。
在本实施例中,所述构建所述宿主程序的资源对象,可以采用如下方式实现:在所述宿主程序中新建一个资源对象。
需要说明的是,由于所述宿主程序为host程序,该host程序是一个可以独立运行在Android操作***中的APK文件,所以在host程序中新建资源对象时,是新建一个assetManager对象。
Android应用程序在运行的过程中,是通过一个称为AssetManager的资源管理器来读取打包在APK文件里面的资源文件。应用程序的每一个Activity组件都关联ContextImpl对象,ContextImpl对象是用来描述Activity组件的运行上下文环境。Activity组件是从Context类继承的,而ContextImpl同样是从Context类继承的。在Activity组件调用的大部分成员函数都是转发给与它所关联的ContextImpl对象的对应的成员函数来处理的,其中就包括用来访问应用程序资源的两个成员函数getResources和getAssets。getResources返回的是一个Resources对象,通过Resources对象来访问应用程序资源;ContextImpl类的成员函数getAssets返回的是一个AssetManager对象,可以通过文件名来访问那些被编译过或者没有被编译过的应用程序的资源文件。
步骤S305-2,在所述资源对象中添加所述文件的路径。
在本实施例中,所述在所述资源对象中添加所述文件的路径,可以采用如下方式实现:通过反射调用AssetManager类的addAssetPath方法,添加所述文件的路径。
需要说明的是,在创建AssetManager对象后,调用这个新创建的AssetManager对象的成员函数addAssetPath来将参数所描述的Apk文件路径作为它的资源目录。在使用addAssetPath时,AssetManager类的成员函数addAssetPath首先要检查参数path指向的是一个文件或者目录,并且判断该文件或者目录是否存在。
需要说明的是,应用程序集包含模块,而模块包含类型,类型又包含成员。反射调用则提供了封装程序集、模块和类型的对象。可以使用反射调用动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后调用类型的方法或访问其字段和属性。
步骤S305-3,使所述资源对象中存储所述文件中的资源。
在本实施例中,所述使所述资源对象中存储所述文件中的资源,可以采用如下方式实现:在将所述文件的路径添加到所述资源对象后,将所述文件中的资源存储到所述宿主程序的所述资源对象中。
在本实施例中,由于所述宿主程序为host程序,所以将已创建的AssetsManager对象为参数,新建Resources资源对象,使所述资源对象中存储所述文件中的资源。
需要说明的是,Resources类有一个成员函数getAssets,通过它就可以获得保存在Resources类的成员变量mAssets中的AssetManager,例如,ContextImpl类的成员函数getAssets就是通过调用其成员变量mResources所指向的一个Resources对象的成员函数getAssets来获得一个可以用来访问应用程序的非编译资源文件的AssetManager。
在本实施例中,所述根据所述文件的应用节点标签,在所述宿主程序内构建所述文件的环境参数,可以采用如下方式实现:获取所述宿主程序的运行参数,通过所述文件的应用节点标签对所述宿主程序的运行参数进行替换,在所述宿主程序内构建所述文件的环境参数。
所述根据所述文件的应用节点标签,在所述宿主程序内构建所述文件的环境参数,具体包括步骤S305-4至S305-6,下面结合附图5作进一步说明。
请参考图5,其示出了根据本申请的实施例提供的根据所述文件的应用节点标签,在所述宿主程序内构建所述文件的环境参数的流程图。
所述根据所述文件的应用节点标签,在所述宿主程序内构建所述文件的环境参数,包括:
步骤S305-4,根据所述宿主程序中的应用节点标签获取主线程对象。
在本实施例中,所述根据所述宿主程序中的应用节点标签获取主线程对象,可以采用如下方式实现:反射调用获取所述宿主程序中的应用节点标签,并反射调用所述应用节点标签从中获取主线程对象。
需要说明的是,由于所述宿主程序为host程序,该host程序是一个可以独立运行在Android操作***中的APK文件,所以根据所述宿主程序中的应用节点标签获取主线程对象时,是通过反射获取所述宿主程序中的Application类,并从所述Application类中反射ActivityThread的静态方法currentActivityThread获取所述文件的ActivityThread对象。
需要说明的是,ActivityThread类即代表Application主线程。调用静态方法android.app.ActivityThread.currentActivityThread获取的是当前activity所在的主线程对象,将获取的主线程对象称为mCurrentActivityThread。
步骤S305-5,获取所述主线程对象中的成员变量。
在本实施例中,所述获取所述主线程对象中的成员变量,可以采用如下方式实现:反射调用所述主线程对象,从中获取所述主线程对象中的成员变量。
需要说明的是,由于所述宿主程序为host程序,该host程序是一个可以独立运行在Android操作***中的APK文件,所以获取所述主线程对象中的成员变量时,是通过反射调用获取mCurrentActivityThread对象的mPackages成员变量,并根据包名从mPackages中获取当前所述文件中LoaderApk对象。
需要说明的是,mPackages表示当前正在编译的资源包,每一个包都用一个Package对象来描述。例如,在编译应用程序资源时,都会引用***预先编译好的资源包,这样当前正在编译的资源包除了目标应用程序资源包之外,就还有预先编译好的***资源包。
可以理解的,参数PackagesInfo指向的是一个LoadedApk对象,这个LoadedApk对象描述的是当前正在启动的Activity组所属的Apk。其中,用来访问应用程序资源的Resources对象是通过调用参数packageInfo所指向的是一个LoadedApk对象的成员函数getResources来创建的。这个Resources对象创建完成之后,就会保存在ContextImpl类的成员变量mResources中。在调用ActivityThread类的成员函数来获得一个Resources对象的时候,需要指定要获取的Resources对象所对应的Apk文件路径,这个Apk文件路径就保存在LoadedApk类的成员变量mResDir中。
步骤S305-6,根据所述文件的应用节点标签以及构建的所述宿主程序的资源对象,替换所述成员变量中对应的对象。
在本实施例中,所述根据所述文件的应用节点标签以及构建的所述宿主程序的资源对象,替换所述成员变量中对应的对象,可以采用如下方式实现:反射调用所述文件的应用节点标签,将所述主线程对象中的成员变量替换为所述文件的应用节点标签中的应用对象,以及所述宿主程序的资源对象。
需要说明的是,由于所述宿主程序为host程序,该host程序是一个可以独立运行在Android操作***中的APK文件,且所述文件为android的APK文件,所以根据所述文件的应用节点标签以及构建的所述宿主程序的资源对象,替换所述成员变量中对应的对象,是通过将LoadedApk类中的mApplication成员变量替换为在步骤S305-4中通过反射获取所述文件中的Application对象,将LoadedApk类中的mResources成员变量替换为步骤S305-3中新建的Resources资源对象。
步骤S307,基于所述环境参数和所述资源对象,在所述宿主程序内运行所述加密文件。
在本实施例中,所述基于所述环境参数和所述资源对象,在所述宿主程序内运行所述加密文件,可以采用如下方式实现:在所述宿主程序构建所述环境参数和所述资源对象后,在所述宿主程序中将所述加密文件以非安装的形式运行。
需要说明的是,所述宿主程序为host程序,所述加密文件为APK文件,所以在所述宿主程序内运行所述加密文件,是在host程序内将源APK文件以非安装的形式运行。
作为一个优选实施方式,本申请实施例提供的应用程序的运行方法中,为了使宿主程序在每次运行时能够更快的对宿主程序内的加密文件进行解密,在所述宿主程序从所述服务器端获取解压缩的解密密码后,将所述解密密码存储在本地缓存中,使所述宿主程序在下次运行时,可以直接从本地获取到所述解密密码。
作为一个优选实施方式,本申请实施例提供的应用程序的运行方法中,在执行步骤S307基于所述环境参数和所述资源对象,在所述宿主程序内运行所述加密文件之前,需要对所述宿主程序内的加密文件的版本进行检测,具体包括如下步骤:
向服务器端发送版本检测请求;所述版本检测请求中携带所述宿主程序内的加密文件的版本号;
接收所述服务器端反馈的版本检测信息;
若所述服务器端中具有版本号高于所述宿主程序内的加密文件的版本号的版本,则从所述服务器端下载版本号最高的文件;
若所述宿主程序内的加密文件为版本号最高的版本,则运行所述宿主程序。
在本实施例中,所述向服务器端发送版本检测请求,可以采用如下方式实现:通过TCP/IP连接等网络协议向服务器端发起连接,所述服务器端在TCP端口上监听接受所述宿主程序的连接请求,建立连接后进行信息交互向服务器端发送版本检测请求。
在本实施例中,所述接收所述服务器端反馈的版本检测信息,包括:若在所述服务器端中具有版本号高于所述宿主程序内的加密文件的版本号的版本,则所述版本检测信息为所述服务器端中具有的最高版本号;若在所述服务器端中的最高版本号与所述宿主程序内的加密文件的版本号的版本相同,则所述版本检测信息为所述宿主程序内的加密文件为最新版本的提示信息。
在本实施例中,所述从所述服务器端下载版本号最高的文件,可以采用如下方式实现:通过TCP/IP连接等网络协议向服务器端发起连接,所述服务器端在TCP端口上监听接受所述宿主程序的连接请求,建立连接后进行信息交互向服务器端发送下载版本号最高的文件的下载请求。
作为一个优选实施方式,本申请实施例提供的应用程序的运行方法中,由于在从所述服务器端下载版本号最高的文件之后,需要对所述宿主程序内现有的加密文件进行替换,在替换后就是在所述宿主程序中为版本号最高的文件提供运行时所需要的android环境,所以在替换所述宿主程序内的加密文件时,需要对下载的所述文件进行校验,具体包括如下步骤:
对下载的所述文件进行校验;
将所述文件替换所述宿主程序内的加密文件;
运行所述宿主程序。
需要说明的是,对下载的所述文件进行校验,包括:对所述文件的安全性校验以及完整性校验。
在上述的实施例中,提供了一种应用程序的运行方法,与上述应用程序的运行方法相对应的,本申请还提供了一种应用程序的运行装置。由于装置的实施例基本相似于方法的实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。所述应用程序的运行装置实施例如下:
请参考图6,其示出了根据本申请的实施例提供的应用程序的运行装置的示意图。
所述应用程序的运行装置,包括:启动单元601、解密单元603、构建单元单元605以及程序运行单元607;
所述启动单元601,用于启动存有加密文件的宿主程序;
所述解密单元603,用于对所述宿主程序存储的加密文件进行解密;
所述构建单元605,用于在所述宿主程序内,构建所述文件运行所需的环境参数和资源对象;
所述程序运行单元607,用于基于所述环境参数和所述资源对象,在所述宿主程序内运行所述加密文件。
可选的,所述构建单元605,包括:加载单元、资源构建子单元以及环境构建子单元;
所述加载单元,用于加载解密后的所述文件;
所述资源构建子单元,用于根据所述文件的资源对象,构建所述宿主程序的资源对象;所述宿主程序的资源对象提供所述文件运行时所需的资源;
所述环境构建子单元,用于根据所述文件的应用节点标签,在所述宿主程序内构建所述文件的环境参数。
可选的,所述资源构建子单元,包括:资源对象构建子单元、路径添加子单元以及资源存储子单元;
所述资源对象构建子单元,用于构建所述宿主程序的资源对象;
所述路径添加子单元,用于在所述资源对象中添加所述文件的路径;
所述资源存储子单元,用于使所述资源对象中存储所述文件中的资源。
可选的,所述环境构建子单元,包括:主线程对象获取子单元、成员变量获取子单元以及对象替换子单元;
所述主线程对象获取子单元,用于根据所述宿主程序中的应用节点标签获取主线程对象;
所述成员变量获取子单元,用于获取所述主线程对象中的成员变量;
所述对象替换子单元,用于根据所述文件的应用节点标签以及构建的所述宿主程序的资源对象,替换所述成员变量中对应的对象。
可选的,所述解密单元603,包括:密码判断子单元、本地密码解密子单元以及密码获取子单元;
所述密码判断子单元,用于判断本地是否存储所述加密文件的解密密码;
所述本地密码解密子单元,用于接收所述密码判断子单元的判断结果,若是,则根据本地存储的所述解密密码对宿主程序存储的加密文件进行解密;
所述密码获取子单元,用于接收所述密码判断子单元的判断结果,若否,则从服务器端获取所述解密密码,并根据所述解密密码对宿主程序存储的加密文件进行解密。
可选的,所述解密单元603,还包括:密码存储子单元;
所述密码存储子单元,用于在所述从服务器端获取所述解密密码之后,将从所述服务器端获取所述解密密码存储在本地。
可选的,所述程序运行单元605,还包括:检测请求发送子单元、检测信息接收子单元、文件下载子单元以及程序运行子单元;
所述检测请求发送子单元,用于在所述运行所述宿主程序之前,向服务器端发送版本检测请求;所述版本检测请求中携带所述宿主程序内的加密文件的版本号;
所述检测信息接收子单元,用于接收所述服务器端反馈的版本检测信息;
所述文件下载子单元,用于若所述服务器端中具有版本号高于所述宿主程序内的加密文件的版本号的版本,则从所述服务器端下载版本号最高的文件;
所述程序运行子单元,用于若所述宿主程序内的加密文件为版本号最高的版本,则运行所述宿主程序。
可选的,所述文件下载子单元,还包括:校验子单元、文件替换子单元以及程序运行触发子单元;
所述校验子单元,用于在所述从所述服务器端下载版本号最高的文件之后,对下载的所述文件进行校验;
所述文件替换子单元,用于将所述文件替换所述宿主程序内的加密文件;
所述程序运行触发子单元,用于触发所述程序运行子单元。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
1、计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
2、本领域技术人员应明白,本申请的实施例可提供为方法、***或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请虽然以较佳实施例公开如上,但其并不是用来限定本申请,任何本领域技术人员在不脱离本申请的精神和范围内,都可以做出可能的变动和修改,因此本申请的保护范围应当以本申请权利要求所界定的范围为准。

Claims (30)

1.一种保护应用程序的方法,其特征在于,包括:
获取待保护的文件的配置文件;
根据所述配置文件创建宿主程序;
将所述待保护的文件进行加密处理;
将加密后的所述文件打包到所述宿主程序内,生成保护文件;
其中,所述配置文件为所述待保护文件安装包中的全局描述文件。
2.根据权利要求1所述的保护应用程序的方法,其特征在于,所述根据所述配置文件创建宿主程序,包括:
根据宿主程序的jar包创建所述宿主程序;
将所述配置文件修改为所述宿主程序的配置文件。
3.根据权利要求2所述的保护应用程序的方法,其特征在于,所述根据宿主程序的jar包创建所述宿主程序,包括:
创建android项目;
删除所述android项目的资源文件;
将所述宿主程序的jar包放入所述android项目内。
4.根据权利要求3所述的保护应用程序的方法,其特征在于,在所述获取待保护的文件的配置文件时,包括:
判断所述待保护的文件中是否具有so文件;
若是,则在执行所述将所述宿主程序的jar包放入所述android项目内的步骤时,将所述so文件放入与所述宿主程序的jar包相同的路径下。
5.根据权利要求1所述的保护应用程序的方法,其特征在于,所述获取待保护的文件的配置文件,包括:
创建所述待保护的文件的副本;
对所述副本进行反编译获取所述待保护的文件的配置文件。
6.根据权利要求1所述的保护应用程序的方法,其特征在于,在所述将所述待保护的文件进行加密处理的步骤之后,包括:
保存将所述待保护的文件进行加密的密码。
7.根据权利要求1所述的保护应用程序的方法,其特征在于,所述将加密后的所述文件打包到所述宿主程序内,包括:
将加密后的所述文件打包到所述宿主程序的资源目录下。
8.一种保护应用程序的装置,其特征在于,包括:
配置文件获取单元,用于获取待保护的文件的配置文件;
宿主程序创建单元,用于根据所述配置文件创建宿主程序;
加密单元,用于将所述待保护的文件进行加密处理;
程序打包单元,用于将加密后的所述文件打包到所述宿主程序内,生成保护文件,其中,所述配置文件为所述待保护文件安装包中的全局描述文件。
9.根据权利要求8所述的保护应用程序的装置,其特征在于,所述宿主程序创建单元,包括:
宿主程序创建子单元,用于根据宿主程序的jar包创建所述宿主程序;
配置文件修改子单元,用于将所述配置文件修改为所述宿主程序的配置文件。
10.根据权利要求9所述的保护应用程序的装置,其特征在于,所述宿主程序创建子单元,包括:
项目创建子单元,用于创建android项目;
资源删除子单元,用于删除所述android项目的资源文件;
打包子单元,用于将所述宿主程序的jar包放入所述android项目内。
11.根据权利要求10所述的保护应用程序的装置,其特征在于,所述配置文件获取单元,包括:
判断子单元,用于判断所述待保护的文件中是否具有so文件;
写入子单元,用于接收所述判断子单元的判断结果,若是,则在触发所述打包子单元时,将所述so文件放入与所述宿主程序的jar包相同的路径下。
12.根据权利要求8所述的保护应用程序的装置,其特征在于,所述配置文件获取单元,还包括:
副本创建子单元,用于创建所述待保护的文件的副本;
配置文件获取子单元,用于对所述副本进行反编译获取所述待保护的文件的配置文件。
13.根据权利要求8所述的保护应用程序的装置,其特征在于,还包括:
密码存储单元,用于在所述将所述待保护的文件进行加密处理之后,保存将所述待保护的文件进行加密的密码。
14.根据权利要求8所述的保护应用程序的装置,其特征在于,所述程序打包单元,具体用于将加密后的所述文件打包到所述宿主程序的资源目录下。
15.一种应用程序的运行方法,其特征在于,包括:
启动存有加密文件的宿主程序;
对所述宿主程序存储的加密文件进行解密;
在所述宿主程序内,构建解密后的所述文件运行所需的环境参数和资源对象;
基于所述环境参数和所述资源对象,在所述宿主程序内运行所述加密文件,其中,所述宿主程序是根据待保护文件的配置文件创建,所述配置文件为所述待保护文件安装包中的全局描述文件。
16.根据权利要求15所述的应用程序的运行方法,其特征在于,所述在所述宿主程序内,构建解密后的所述文件运行所需的环境参数和资源对象,包括:
加载解密后的所述文件;
根据所述文件的资源对象,构建所述宿主程序的资源对象;所述宿主程序的资源对象提供所述文件运行时所需的资源;
根据所述文件的应用节点标签,在所述宿主程序内构建所述文件的环境参数。
17.根据权利要求16所述的应用程序的运行方法,其特征在于,所述根据所述文件的资源对象,构建所述宿主程序的资源对象,包括:
构建所述宿主程序的资源对象;
在所述资源对象中添加所述文件的路径;
使所述资源对象中存储所述文件中的资源。
18.根据权利要求17所述的应用程序的运行方法,其特征在于,所述根据所述文件的应用节点标签,在所述宿主程序内构建所述文件的环境参数,包括:
根据所述宿主程序中的应用节点标签获取主线程对象;
获取所述主线程对象中的成员变量;
根据所述文件的应用节点标签以及构建的所述宿主程序的资源对象,替换所述成员变量中对应的对象。
19.根据权利要求15所述的应用程序的运行方法,其特征在于,所述对所述宿主程序存储的加密文件进行解密,包括:
判断本地是否存储所述加密文件的解密密码;
若是,则根据本地存储的所述解密密码对宿主程序存储的加密文件进行解密;
若否,则从服务器端获取所述解密密码,并根据所述解密密码对宿主程序存储的加密文件进行解密。
20.根据权利要求19所述的应用程序的运行方法,其特征在于,在所述从服务器端获取所述密码的步骤之后,包括:
将从所述服务器端获取所述解密密码存储在本地。
21.根据权利要求15所述的应用程序的运行方法,其特征在于,在所述在所述宿主程序内运行所述加密文件的步骤之前,包括:
向服务器端发送版本检测请求;所述版本检测请求中携带所述宿主程序内的加密文件的版本号;
接收所述服务器端反馈的版本检测信息;
若所述服务器端中具有版本号高于所述宿主程序内的加密文件的版本号的版本,则从所述服务器端下载版本号最高的文件;
若所述宿主程序内的加密文件为版本号最高的版本,则运行所述宿主程序。
22.根据权利要求21所述的应用程序的运行方法,其特征在于,在所述从所述服务器端下载版本号最高的文件的步骤之后,包括:
对下载的所述文件进行校验;
将所述文件替换所述宿主程序内的加密文件;
运行所述宿主程序。
23.一种应用程序的运行装置,其特征在于,包括:
启动单元,用于启动存有加密文件的宿主程序;
解密单元,用于对所述宿主程序存储的加密文件进行解密;
构建单元,用于在所述宿主程序内,构建解密后的所述文件运行所需的环境参数和资源对象
程序运行单元,用于基于所述环境参数和所述资源对象,在所述宿主程序内运行所述加密文件,其中,所述宿主程序是根据待保护文件的配置文件创建,所述配置文件为所述待保护文件安装包中的全局描述文件。
24.根据权利要求23所述的应用程序的运行装置,其特征在于,所述构建单元,包括:
加载单元,用于加载解密后的所述文件;
资源构建子单元,用于根据所述文件的资源对象,构建所述宿主程序的资源对象;所述宿主程序的资源对象提供所述文件运行时所需的资源;
环境构建子单元,用于根据所述文件的应用节点标签,在所述宿主程序内构建所述文件的环境参数。
25.根据权利要求24所述的应用程序的运行装置,其特征在于,所述资源构建子单元,包括:
资源对象构建子单元,用于构建所述宿主程序的资源对象;
路径添加子单元,用于在所述资源对象中添加所述文件的路径;
资源存储子单元,用于使所述资源对象中存储所述文件中的资源。
26.根据权利要求24所述的应用程序的运行装置,其特征在于,所述环境构建子单元,包括:
主线程对象获取子单元,用于根据所述宿主程序中的应用节点标签获取主线程对象;
成员变量获取子单元,用于获取所述主线程对象中的成员变量;
对象替换子单元,用于根据所述文件的应用节点标签以及构建的所述宿主程序的资源对象,替换所述成员变量中对应的对象。
27.根据权利要求23所述的应用程序的运行装置,其特征在于,所述解密单元,包括:
密码判断子单元,用于判断本地是否存储所述加密文件的解密密码;
本地密码解密子单元,用于接收所述密码判断子单元的判断结果,若是,则根据本地存储的所述解密密码对宿主程序存储的加密文件进行解密;
密码获取子单元,用于接收所述密码判断子单元的判断结果,若否,则从服务器端获取所述解密密码,并根据所述解密密码对宿主程序存储的加密文件进行解密。
28.根据权利要求27所述的应用程序的运行装置,其特征在于,所述解密单元,还包括:
密码存储子单元,用于在所述从服务器端获取所述密码之后,将从所述服务器端获取所述解密密码存储在本地。
29.根据权利要求23所述的应用程序的运行装置,其特征在于,所述程序运行单元,还包括:
检测请求发送子单元,用于在所述运行所述宿主程序之前,向服务器端发送版本检测请求;所述版本检测请求中携带所述宿主程序内的加密文件的版本号;
检测信息接收子单元,用于接收所述服务器端反馈的版本检测信息;
文件下载子单元,用于若所述服务器端中具有版本号高于所述宿主程序内的加密文件的版本号的版本,则从所述服务器端下载版本号最高的文件;
程序运行子单元,用于若所述宿主程序内的加密文件为版本号最高的版本,则运行所述宿主程序。
30.根据权利要求29所述的应用程序的运行装置,其特征在于,所述文件下载子单元,还包括:
校验子单元,用于在所述从所述服务器端下载版本号最高的文件之后,对下载的所述文件进行校验;
文件替换子单元,用于将所述文件替换所述宿主程序内的加密文件;
程序运行触发子单元,用于触发所述程序运行子单元。
CN201611199716.4A 2016-12-22 2016-12-22 一种保护应用程序、应用程序的运行方法以及装置 Active CN108229112B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201611199716.4A CN108229112B (zh) 2016-12-22 2016-12-22 一种保护应用程序、应用程序的运行方法以及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201611199716.4A CN108229112B (zh) 2016-12-22 2016-12-22 一种保护应用程序、应用程序的运行方法以及装置

Publications (2)

Publication Number Publication Date
CN108229112A CN108229112A (zh) 2018-06-29
CN108229112B true CN108229112B (zh) 2022-06-03

Family

ID=62656278

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201611199716.4A Active CN108229112B (zh) 2016-12-22 2016-12-22 一种保护应用程序、应用程序的运行方法以及装置

Country Status (1)

Country Link
CN (1) CN108229112B (zh)

Families Citing this family (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109495459B (zh) * 2018-10-31 2021-05-28 苏州科达科技股份有限公司 媒体数据加密方法、***、设备及存储介质
CN109634682B (zh) * 2018-11-29 2022-02-15 恒生电子股份有限公司 应用程序的配置文件更新方法及装置
CN109976777A (zh) * 2019-04-13 2019-07-05 深圳鼎智通讯股份有限公司 一种基于app安装包的安全验证方法
CN110572689B (zh) * 2019-09-23 2021-09-21 广州方硅信息技术有限公司 展示资源的方法、装置、设备及直播***
CN110795149B (zh) * 2019-10-09 2023-08-01 深圳市证通电子股份有限公司 终端平台运行方法、装置、设备及可读存储介质
CN110795750A (zh) * 2019-10-25 2020-02-14 苏州浪潮智能科技有限公司 一种文档加密寄宿方法、***及装置
CN111143869B (zh) * 2019-12-30 2023-07-14 Oppo广东移动通信有限公司 应用程序包处理方法、装置、电子设备及存储介质
CN111240699A (zh) * 2020-01-22 2020-06-05 上海商汤临港智能科技有限公司 软件产品处理方法和装置、源码解释器
CN111767539A (zh) * 2020-05-15 2020-10-13 上海趣蕴网络科技有限公司 一种apk安全***及安全校验方法
CN112416418A (zh) * 2020-08-13 2021-02-26 上海哔哩哔哩科技有限公司 应用组件的生成方法、装置、计算机设备和可读存储介质
CN112083953A (zh) * 2020-08-26 2020-12-15 武汉普利商用机器有限公司 Android应用程序构建方法及装置
CN112149169B (zh) * 2020-10-12 2024-07-12 Oppo广东移动通信有限公司 一种应用访问方法、装置及计算机可读存储介质
CN112329035B (zh) * 2020-11-02 2022-12-27 成都中科大旗软件股份有限公司 一种基于jar程序解析加密解密的方法、***及存储介质
CN116383781B (zh) * 2023-06-06 2023-08-04 中航信移动科技有限公司 一种软件运行参数的控制方法、电子设备及存储介质

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102087605A (zh) * 2011-01-28 2011-06-08 宇龙计算机通信科技(深圳)有限公司 一种基于android平台应用安装控制方法及***
CN103246525A (zh) * 2012-02-06 2013-08-14 腾讯科技(深圳)有限公司 一种实现应用运行的方法及客户端
CN103886230A (zh) * 2014-02-24 2014-06-25 四川长虹电器股份有限公司 android***的软件版权保护方法及其***
CN104462879A (zh) * 2014-11-28 2015-03-25 北京奇虎科技有限公司 应用程序免Root运行控制方法与装置
CN104537306A (zh) * 2015-01-13 2015-04-22 百度在线网络技术(北京)有限公司 识别病毒文件的方法及装置
CN104573556A (zh) * 2015-01-19 2015-04-29 浪潮集团有限公司 一种基于虚拟***的加密方法
CN106169052A (zh) * 2016-07-19 2016-11-30 北京海泰方圆科技股份有限公司 应用程序的处理方法、装置及移动终端

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101699400B (zh) * 2009-09-03 2013-02-27 中兴通讯股份有限公司 一种生成和运行客户端安装程序的方法及***
CN102135892B (zh) * 2010-01-22 2015-03-04 广州华多网络科技有限公司 应用程序运行方法、装置及***
US20160087928A1 (en) * 2014-06-30 2016-03-24 Aliphcom Collaborative and interactive queuing and playback of content using electronic messaging

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102087605A (zh) * 2011-01-28 2011-06-08 宇龙计算机通信科技(深圳)有限公司 一种基于android平台应用安装控制方法及***
CN103246525A (zh) * 2012-02-06 2013-08-14 腾讯科技(深圳)有限公司 一种实现应用运行的方法及客户端
CN103886230A (zh) * 2014-02-24 2014-06-25 四川长虹电器股份有限公司 android***的软件版权保护方法及其***
CN104462879A (zh) * 2014-11-28 2015-03-25 北京奇虎科技有限公司 应用程序免Root运行控制方法与装置
CN104537306A (zh) * 2015-01-13 2015-04-22 百度在线网络技术(北京)有限公司 识别病毒文件的方法及装置
CN104573556A (zh) * 2015-01-19 2015-04-29 浪潮集团有限公司 一种基于虚拟***的加密方法
CN106169052A (zh) * 2016-07-19 2016-11-30 北京海泰方圆科技股份有限公司 应用程序的处理方法、装置及移动终端

Also Published As

Publication number Publication date
CN108229112A (zh) 2018-06-29

Similar Documents

Publication Publication Date Title
CN108229112B (zh) 一种保护应用程序、应用程序的运行方法以及装置
CN106778103B (zh) 一种安卓应用程序防逆向破解的加固方法、***及解密方法
CN109491695B (zh) 一种集成安卓应用的增量更新方法
JP5821034B2 (ja) 情報処理装置、仮想マシン生成方法及びアプリ配信システム
KR101471589B1 (ko) 공통중간언어 기반 프로그램을 위한 보안 제공 방법
Holla et al. Android based mobile application development and its security
JP5828081B2 (ja) 情報処理装置、情報処理方法、及びプログラム配信システム
CN106295255B (zh) 应用程序的加固方法和装置
CN111143869B (zh) 应用程序包处理方法、装置、电子设备及存储介质
CN109784007B (zh) 一种字节码加密的方法、字节码解密的方法及终端
WO2016078130A1 (zh) 一种防逆向apk文件的动态加载方法
US20080216071A1 (en) Software Protection
WO2015192637A1 (zh) 软件安装包的加固保护方法和装置
US20080270806A1 (en) Execution Device
CN110333868B (zh) 用于生成子应用的安装包的方法和***
US10579592B2 (en) Method and apparatus for compressing an application
CN110309630B (zh) 一种Java代码加密方法及装置
CN106326691B (zh) 加解密功能的实现方法、装置及服务器
CN111382447B (zh) 安装包的加密方法、存储介质及计算机设备
CN107636667B (zh) 在设备中创建多个工作空间的***及方法
KR101863325B1 (ko) 역공학 방지 방법 및 장치
CN112416395A (zh) 一种热修复更新方法和装置
CN109934016B (zh) 应用的签名校验方法、装置及电子设备
JP2008040853A (ja) アプリケーション実行方法およびアプリケーション実行装置
CN113220314B (zh) App资源加载及apk生成方法、装置、设备及介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant