本发明涉及应用安全处理技术领域,特别是涉及一种apk的加固方法、电子设备及存储介质。
背景技术:
随着android开放系统的发展,android系统占据了大量的移动终端时长,已逐渐成为了移动终端的普及的操作系统,同时基于该系统的软件应用也越来越多,但是开发这发布的android应用使用java语言开发,容易被其他人恶意反编译,从而获取应用中重要信息,这样,很容易被逆向而造成损失。目前,应用加固的方法有很多,但大多加固方法启动时过程比较复杂,运行效率低。
因此,现有技术还有待于发展和改进。
技术实现要素:
基于此,本发明提供一种apk的加固方法、电子设备及存储介质,用以解决现有技术中apk的加固安全性低的技术问题。
第一方面,本发明实施例提供了一种apk的加固方法,包括:
对待加固源代码编译,以得到dex文件;
对所述dex文件加密,以得到第一dex文件;
基于所述第一dex文件,生成用于解密所述第一dex文件的解密程序;
对所述解密程序加密,以得到第一解密程序;
将所述解密程序与所述第一解密程序配置为so文件;
将所述第一dex文件配置为apk的资源文件,并与所述so文件得到目标apk。
可选地,所述对待加固源代码编译,以得到dex文件具体包括:
构建java运行环境,获取待加固源代码;
利用集成开发工具对所述待加固源代码执行编译命令,以得到dex文件。
可选地,所述对所述dex文件加密,以得到第一dex文件具体包括:
利用gradle插件对所述dex文件采用加密算法加密,以得到加密的dex文件;
获取待加固apk的签名;
将所述签名作为密钥以对所述加密的dex文件进行加密运算,得到签名后的加密的dex文件,并将所述签名后的加密的dex文件作为第一dex文件。
可选地,所述加密算法包括对称加密算法和非对称加密算法。
可选地,所述基于所述第一dex文件,生成用于解密所述第一dex文件的解密程序具体包括:
确定用于解密所述第一dex文件的解密密钥;
利用集成开发工具编译出解密程序,其中,所述解密程序配置有所述解密密钥。
可选地,所述解密程序为native解密程序,所述native解密程序处于系统框架的native层。
可选地,所述将所述解密程序与所述第一解密程序配置为so文件具体包括:
利用c语言或c++语言分别编译所述解密程序和所述第一解密程序,以得到so文件。
可选地,所述将所述第一dex文件配置为apk的资源文件,并与所述so文件得到目标apk具体包括:
将所述第一dex文件配置为apk的资源文件;
将所述apk的资源文件以及所述so文件按照预设系统规则生成目标apk。
第二方面,本发明实施例还提供了一种电子设备,所述电子设备包括处理器和与所述处理器连接的存储器,所述存储器存储有存储有一个或者多个程序,所述处理器用于执行:
对待加固源代码编译,以得到dex文件;
对所述dex文件加密,以得到第一dex文件;
基于所述第一dex文件,生成用于解密所述第一dex文件的解密程序;
对所述解密程序加密,以得到第一解密程序;
将所述解密程序与所述第一解密程序配置为so文件;
将所述第一dex文件配置为apk的资源文件,并与所述so文件得到目标apk。
第三方面,本发明实施例还提供了一种非临时性计算机可读存储介质,当所述存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行一种apk的加固方法,所述apk的加固方法包括以下步骤:
对待加固源代码编译,以得到dex文件;
对所述dex文件加密,以得到第一dex文件;
基于所述第一dex文件,生成用于解密所述第一dex文件的解密程序;
对所述解密程序加密,以得到第一解密程序;
将所述解密程序与所述第一解密程序配置为so文件;
将所述第一dex文件配置为apk的资源文件,并与所述so文件得到目标apk。
与现有技术相比,本发明实施例具有以下优点:
根据本发明实施方式提供的方法,所述apk的加固方法包括以下步骤:对待加固源代码编译,以得到dex文件;对所述dex文件加密,以得到第一dex文件;基于所述第一dex文件,生成用于解密所述第一dex文件的解密程序;对所述解密程序加密,以得到第一解密程序;将所述解密程序与所述第一解密程序配置为so文件;将所述第一dex文件配置为apk的资源文件,并与所述so文件得到目标apk。本发明使用插件化的方式,将待加固的代码打包到dex文件中,对该dex文件进行加密后与用于解密已加密的dex文件的解密程序进行加密处理后一起打包到apk中,这样,增加获取应用程序源代码文件的难度,从而提高对应用程序代码的保护力度。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例中一种apk的加固方法的流程示意图。
图2为本发明实施例中一种电子设备的结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
为了进一步理解本申请的技术方案,下面结合附图加以说明:
请参阅图1,图1是本发明提供的一种apk的加固方法的流程图,应该说明的是,本发明实施方式的apk的加固方法并不限于图1所示的流程图中的步骤及顺序,根据不同的需求,流程图中的步骤可以增加、移除或者改变顺序。
如图1所示,本发明提供的apk的加固方法包括以下步骤:
s10、对待加固源代码编译,以得到dex文件。
在本实施例中,由于android系统支持的应用格式主要以apk形式存在,该apk(androidapplicationpackage)android应用程序包,是android操作系统使用的一种类似symbiansis或sisx应用程序包文件格式,用于分发和安装移动应用及中间件。
android应用程序的代码想在android设备上运行,要先进行编译,被打包成为一个被android系统所能识别的文件才可以被运行,而这种能被android系统识别并运行的文件格式便是“apk”。apk文件内包含被编译的代码文件(.dex)、文件资源(resources)、ssets、证书(certificates)、清单文件(manifestfile)。
dex文件指的是可执行文件,其通过工具软件dx把所有的字节码文件转成androiddex文件(classes.dex)。
相应地,应用的主要逻辑实现在apk文件中的class.dex文件中。因此,对于class.dex文件的保护是保护整个apk文件安全的关键所在。
为此,本申请采用对应的加密方式隐藏该class.dex文件中实现的逻辑,并且不影响程序的正常运行,为用户保证加固的透明性。
示例性地,对待加固源代码编译,以得到dex文件具体包括:
s11,构建java运行环境,获取待加固源代码;
s12,利用集成开发工具对所述待加固源代码执行编译命令,以得到dex文件。
具体地,所述待加固源代码指的是需要保护的java代码,例如:注册时保存用户信息的java代码,又如登录时检测用户信息的java代码。所述集成开发工具包括eclipse,其附带了一个标准的插件集,包括java开发工具(javadevelopmentkit,jdk)、myeclipse,其包括了完备的编码、调试、测试和发布功能,是功能丰富的javaee集成开发环境等。
s20,对所述dex文件加密,以得到第一dex文件。
在本实施例中,由于dex文件容易被恶意反编译获取到重要数据,因此,为了保护开发者和使用者的权益,且在不影响合法应用便利的前提下,对dex文件采用对应的加密算法进行加密,从而得到加密的dex文件,将该加密的dex文件作为第一dex文件。本申请采用自定义的gradle插件通过一定加密算法对该dex文件进行加密。所述gradle插件内置了很多常用的插件,gradle中的插件在一定的场景中可以提高开发效率,可以通过扩展现有的插件来实现更多功能,比如androidgradle插件就是基于内置的java插件来实现的。其能够实现:
1、添加任务到项目中,可对项目进行测试、编译、打包;
2、添加依赖到项目中,可用来配置项目构建过程中需要的依赖;
3、可以向项目中现有的对象类型添加新的扩展属性、方法等,可方便项目的配置和构建优化,比如android项目构建中的android{}就是androidgradle插件为project对象添加的一个扩展;
4、可以对项目进行一些约定,如使用javagradle插件可以约定src/main/java目录下源代码的存放位置,在编译的时候就可以编译指定目录下的java源代码文件。
因此,采用gradle插件简便易用,还可根据不同项目需求自定义插件,节省开发成本,可移植性强。
示例性地,所述对所述dex文件加密,以得到第一dex文件具体包括:
s21,利用gradle插件对所述dex文件采用加密算法加密,以得到加密的dex文件;
s22,获取待加固apk的签名;
s23,将所述签名作为密钥以对所述加密的dex文件进行加密运算,得到签名后的加密的dex文件,并将所述签名后的加密的dex文件作为第一dex文件。
具体地,所述加密算法包括对称加密算法和非对称加密算法。其中,对称加密算法指的是加密和解密使用相同密钥的加密算法,密钥非公开,其特点是算法公开、计算量小、加密速度快、加密效率高。所述对称加密算法包括des、tripledes、rc2、rc4、rc5和blowfish等。由于本申请仅对需要保护的java代码单独生成的dex文件进行加密,不需要保护的java代码不需要进行加密,因此,可以根据实际需求灵活更改对称加密算法。
非对称加密算法需要两个密钥:公开密钥和私有密码。公开密钥和私有密钥是一对,如果用公开密钥对数据进行加密,只有配对的私有密钥才能解密;如果用私有密钥对数据进行加密,只有配对的公开密钥才能解密。例如:甲方生成一对密钥并将其中一把作为公开密钥向其他方公开;得到该公开密钥的乙方使用该公开密钥对保护信息进行加密后再发送给甲方;甲方再用自己保存的另一把私有密钥对加密后的信息进行解密。同理,甲方可以用自己的私有密钥对保护信息进行加密后再发送给乙方,乙方用甲方的公开密钥对加密后的信息进行解密。非对称加密算法的特点是算法强度复杂,安全性依赖于算法,但加解密速度大于对称加密算法的速度。所述非对称加密算法包括rsa、ecc(移动设备用)、diffie-hellman、elgamal、dsa(数字签名用)等。
签名用于鉴别身份,且用于检验数据的完整性。为了防止被恶意攻击和传输的数据完整,还需要对加密后的dex文件签名,在接收到第一dex文件后,需要先进行验签操作,只有双方的签名匹配,才可获取到所述第一dex文件中的该加密后的dex文件,否则失败或丢弃。
上述加密运算可以有与运算、或运算、与或运算等,根据用户需求进行设定。本实施例中,所述加密运算较佳地为或运算,更进一步提高保护力度。
s30,基于所述第一dex文件,生成用于解密所述第一dex文件的解密程序。
在本实施例中,编译过程中,需要将解密的逻辑一起编译到apk中,而这个解密的逻辑是在目标apk安装到终端如手机或电视等设备上运行时对加密的dex文件进行解密操作的。利用androidstudio开发工具编写用于解密所述加密后的dex文件的解密程序。该解密程序为native解密程序,其位于本地层,即native层。为了进一步提高反编译破解难度,提高安全性,采用c/c++语言编写所述解密程序中的解密的逻辑。
示例性地,所述基于所述第一dex文件,生成用于解密所述第一dex文件的解密程序具体包括:
s31,确定用于解密所述第一dex文件的解密密钥;
s32,利用集成开发工具编译出解密程序,其中,所述解密程序配置有所述解密密钥。
s40、对所述解密程序加密,以得到第一解密程序。
在本实施例中,对该解密程序中的代码逻辑再次采用加密算法进行加密,以更进一步增加反编译难度,降低被破解的概率。具体实施时,获取所述解密程序的代码逻辑;利用自定义gradle插件对该代码逻辑通过加密算法进行加密,以得到第一解密程序。该加密算法同样可以是对称加密算法,也可以是非对称加密算法,本申请并不对加密算法限制。
s50、将所述解密程序与所述第一解密程序配置为so文件。
在本实施例中,所述so文件指的是linux下的程序函数库,即编译好的可以供其他程序使用的代码和数据,为了使得目标apk能够被正常使用,需要该目标apk包含对应的so文件。一般来讲,so文件称为共享库,其依赖于开发平台,无法单独运行使用。
so文件使用方法有:
(1)动态库的编译。提供一头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,将这几个文件编译成一个动态库:libtest.so。
例如:
命令:$gcctest_a.ctest_b.ctest_c.c-fpic-shared-olibtest.so不用该标志外部程序无法连接,其相当于一个可执行文件。
(2)动态库的链接
提供一个程序源文件test.c与动态库libtest.so链接生成执行文件test:
例如:
命令:$gcctest.c-l.-ltest-otest
命令:$lddtest执行test,可以看到它是如何调用动态库中的函数的。
由于java源文件编译出的dex文件被反编译的难度低于c/c++源文件编译出的so文件被反编译的难度,因此,利用c语言或c++语言分别编译所述解密程序和所述第一解密程序,以得到so文件。
s60、将所述第一dex文件配置为apk的资源文件,并与所述so文件得到目标apk。
在本实施例中,为了将加密后的dex文件隐藏,以保护应用程序代码,则将所述第一dex文件配置为应用的assert资源文件,与其他资源文件以及所述so文件一起打包,得到目标apk。所述目标apk能够在终端如手机或电视等设备上运行执行。
示例性地,所述将所述第一dex文件配置为apk的资源文件,并与所述so文件得到目标apk具体包括:
s61,将所述第一dex文件配置为apk的资源文件;
s62,将所述apk的资源文件以及所述so文件按照预设系统规则生成目标apk。
基于上述apk的加固方法,本申请还提供一种电子设备,如图2所示,电子设备1包括处理器11以及与所述处理器11连接的存储器22,图2仅示出了电子设备1的部分组件,但是应理解的是,并不要求实施所有示出的组件,可以替代的实施更多或者更少的组件。
所述存储器22在一些实施例中可以是所述电子设备1的内部存储单元,例如系统100的内存。所述存储器22在另一些实施例中也可以是所述系统100的外部存储设备,例如所述电子设备1上配备的插接式u盘,智能存储卡(smartmediacard,smc),安全数字(securedigital,sd)卡,闪存卡(flashcard)等。进一步地,所述存储器22还可以既包括所述电子设备1的内部存储单元也包括外部存储设备。所述存储器22用于存储安装于所述电子设备1的应用软件及各类数据,例如所述apk的加固程序代码等。所述存储器22还可以用于暂时地存储已经输出或者将要输出的数据。在一实施例中,存储器22上存储有apk的加固程序,该apk的加固程序可被处理器11所执行,从而实现本申请中apk的加固方法,具体如上述方法所述。
所述处理器11在一些实施例中可以是一中央处理器(centralprocessingunit,cpu),微处理器,手机基带处理器或其他数据处理芯片,用于运行所述存储器22中存储的程序代码或处理数据,例如执行所述apk的加固方法,具体包括:
对待加固源代码编译,以得到dex文件;
对所述dex文件加密,以得到第一dex文件;
基于所述第一dex文件,生成用于解密所述第一dex文件的解密程序;
对所述解密程序加密,以得到第一解密程序;
将所述解密程序与所述第一解密程序配置为so文件;
将所述第一dex文件配置为apk的资源文件,并与所述so文件得到目标apk;具体如上所述apk的加固方法中步骤。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本发明的其它实施方案。本发明旨在涵盖本发明的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本发明的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本发明的真正范围和精神由下面的权利要求指出。
应当理解的是,本发明并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本发明的范围仅由所附的权利要求来限制。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。