本发明涉及计算机应用技术领域,尤其涉及基于动态加载的javasdk代码加解密方法及终端。
背景技术:
java是一门面向对象编程语言,不仅吸收了c++语言的各种优点,还摒弃了c++里难以理解的多继承、指针等概念,因此java语言具有功能强大和简单易用两个特征;java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程;java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。
jar是java(计算机编程语言)软件包文件格式,通常用于聚合大量的java字节码文件。java的sdk(softwaredevelopmentkit,软件开发工具包,一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合)代码指的就是jar文件。常见的sdk包括广告、支付等,这些sdk面临着来自第三方黑客和集成sdk的开发者带来的双重威胁,所以对javasdk的代码保护越来越受到重视。
但是现有技术中缺乏有效手段对javasdk的代码保护,容易对对sdk集成者和应用使用者暴露sdk代码,无法有效的保护sdk的代码安全。
因此,现有技术还有待于改进和发展。
技术实现要素:
本发明的主要目的在于提供基于动态加载的javasdk代码加解密方法及终端,旨在解决现有技术中无法有效的保护sdk的代码安全的问题。
为实现上述目的,本发明提供一种基于动态加载的javasdk代码加解密方法,所述基于动态加载的javasdk代码加解密方法包括如下步骤:
解析jar包中的class文件,将所述class文件中的函数转换为无代码的接口函数;
将jar包进行加密隐藏,如果是android平台的jar包,则将jar包转换为android系统的dex文件后进行加密;
当加密操作完成后,输出接口jar、解密引擎jar和加密后的jar;
将加密后的jar作为资源文件放入应用源码工程,并将接口jar和解密引擎jar引入工程,并在使用加密后的jar之前,初始化调用解密引擎jar;
启动集成了加密sdk的应用,并在运行时启动解密引擎jar,获取当前进程的主类加载器;
解密引擎jar进行解密并使用主类加载器加载解密后的jar中的代码到内存中,应用正常调用解密后sdk的代码。
可选地,所述的基于动态加载的javasdk代码加解密方法,其中,所述将所述class文件中的函数转换为无代码的接口函数,具体包括:
根据字节码文件的二进制文件结构,解析jar包中的每个class文件;
获取每个class文件中所有函数的代码段,删除代码段中保存的二进制代码指令,将每个class文件中的函数转换为无代码的接口函数。
可选地,所述的基于动态加载的javasdk代码加解密方法,其中,所述接口函数中无代码,只有函数声明。
可选地,所述的基于动态加载的javasdk代码加解密方法,其中,所述解析jar包中的class文件,之前还包括:
如果是androidaar格式的sdk,则需要从aar中解压出jar包。
可选地,所述的基于动态加载的javasdk代码加解密方法,其中,所述如果是android平台的jar包,则将jar包转换为android系统的dex文件后进行加密,具体包括:
如果是android平台的jar包,需要通过使用dx工具将jar包中的class文件转为androiddalvik虚拟机支持的dex格式的dex文件。
可选地,所述的基于动态加载的javasdk代码加解密方法,其中,所述接口函数用于开发者集成sdk时引用sdk中的代码,不会编译到应用中。
此外,为实现上述目的,本发明还提供一种终端,其中,所述终端包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的基于动态加载的javasdk代码加解密程序,所述基于动态加载的javasdk代码加解密程序被所述处理器执行时实现如上所述的基于动态加载的javasdk代码加解密方法的步骤。
此外,为实现上述目的,本发明还提供一种存储介质,其中,所述存储介质存储有基于动态加载的javasdk代码加解密程序,所述基于动态加载的javasdk代码加解密程序被处理器执行时实现如上所述的基于动态加载的javasdk代码加解密方法的步骤。
本发明通过解析jar包中的class文件,将所述class文件中的函数转换为无代码的接口函数;将jar包进行加密隐藏,如果是android平台的jar包,则将jar包转换为android系统的dex文件后进行加密;当加密操作完成后,输出接口jar、解密引擎jar和加密后的jar;将加密后的jar作为资源文件放入应用源码工程,并将接口jar和解密引擎jar引入工程,并在使用加密后的jar之前,初始化调用解密引擎jar;启动集成了加密sdk的应用,并在运行时启动解密引擎jar,获取当前进程的主类加载器;解密引擎jar进行解密并使用主类加载器加载解密后的jar中的代码到内存中,应用正常调用解密后sdk的代码。本发明通过解析jar包中的class文件,把其中的函数转换为无代码的接口函数,并将原jar包进行加密隐藏,转换后的sdk接口文件仅用于开发者集成sdk时引用sdk中的代码,不会编译到应用中,运行集成了加密sdk的应用,获取当前应用的主类加载器,然后使用主类加载器动态加载被加密的sdk代码,完成对加密sdk的加载工作,不会对sdk集成者和应用使用者暴露sdk代码,有效的保护sdk的代码安全。
附图说明
图1是本发明基于动态加载的javasdk代码加解密方法的较佳实施例的流程图;
图2是本发明基于动态加载的javasdk代码加解密方法的较佳实施例中加密流程的示意图;
图3是本发明基于动态加载的javasdk代码加解密方法的较佳实施例中运行解密流程的示意图;
图4是本发明基于动态加载的javasdk代码加解密方法的较佳实施例中jar文件结构的示意图;
图5是本发明基于动态加载的javasdk代码加解密方法的较佳实施例中class文件结构的示意图;
图6是本发明基于动态加载的javasdk代码加解密方法的较佳实施例中aar文件结构的示意图;
图7为本发明终端的较佳实施例的运行环境示意图。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚、明确,以下参照附图并举实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明较佳实施例所述的基于动态加载的javasdk代码加解密方法,如图1、图2和图3所示,所述基于动态加载的javasdk代码加解密方法包括以下步骤:
步骤s10、解析jar包中的class文件,将所述class文件中的函数转换为无代码的接口函数;
具体地,复制一份原jar包,解析jar包中的class文件(可以是多个class文件,例如图2中的a.class、b.class和c.class),把其中的函数转换为无代码的接口函数。如果是androidaar格式的sdk,需要先从aar中解压出jar再进行加密操作,如图6所示,aar是android平台的sdk格式,aar也是一个zip压缩包,里面保存sdk的代码classes.jar还有一些额外的资源文件,可以直接解压获取classes.jar,对classes.jar进行加密保护。
其中,在软件领域,jar文件(java归档,英语:javaarchive)是一种软件包文件格式,通常用于聚合大量的java类文件、相关的元数据和资源(文本、图片等)文件到一个文件,以便开发java平台应用软件或库,如图4所示。
其中,class文件全名称为javaclass文件,主要在平台无关性和网络移动性方面使java更适合网络,它在平台无关性方面的任务是:为java程序提供独立于底层主机平台的二进制形式的服务,如图5所示,表示class文件结构的一个示意图。
其中,java代码需要被编译为class字节码这种二进制文件,才能被java虚拟机执行。jar包是一个zip格式的压缩文件,里面存储了若干的class字节码文件,每个class文件都对应一个java源码文件,而真正要加密保护的是jar包中class文件保存的函数代码的二进制指令。
将所述class文件中的函数转换为无代码的接口函数具体为:根据字节码文件的二进制文件结构,解析jar包中的每个class文件,获取每个class文件中所有函数的代码段,删除代码段中保存的二进制代码指令,将每个class文件中的函数转换为无代码的接口函数,其中,所述接口函数中无代码,只有函数声明。
步骤s20、将jar包进行加密隐藏,如果是android平台的jar包,则将jar包转换为android系统的dex文件后进行加密。
具体地,对原jar包进行加密隐藏,如果是android平台的jar包,需要通过使用dx工具(或者d8工具)将jar包中的class文件转为androiddalvik虚拟机支持的dex格式的dex文件。
例如android平台,从aar这种sdk格式文件中,解压获取classes.jar,然后对classes.jar中的class文件进行加密。
由于android系统的dalvik虚拟机和普通的java虚拟机支持的可执行文件格式不同,所以需要调用android官方dx工具,把jar中class文件转为dex文件(dex文件是android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据)。
当java程序编译成class后,还需要使用dex工具将所有的class文件整合到一个dex文件,目的是其中各个类能够共享数据,在一定程度上降低了冗余,同时也是文件结构更加经凑,dex文件是传统jar文件大小的50%左右;dex将原来class每个文件都有的共有信息合成一体,这样减少了class的冗余。
步骤s30、当加密操作完成后,输出接口jar、解密引擎jar和加密后的jar。
具体地,如图2所示,完成加密后的输出物,包括接口jar、解密引擎jar和加密后的jar。
步骤s40、将加密后的jar作为资源文件放入应用源码工程,并将接口jar和解密引擎jar引入工程,并在使用加密后的jar之前,初始化调用解密引擎jar。
具体地,应用集成使用加密sdk,需要把加密后的jar作为资源文件放入应用源码工程,并把接口jar和解密引擎jar引入工程,并在使用加密jar之前,初始化调用解密引擎jar。
步骤s50、启动集成了加密sdk的应用,并在运行时启动解密引擎jar,获取当前进程的主类加载器。
具体地,启动集成了加密sdk的应用,在运行时首先启动的解密引擎jar;解密引擎启动,获取当前进程的主类加载器。在class文件中描述的各种信息最终都需要加载到虚拟机中之后才能运行和使用,虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。
加密后的sdk最终是要给其他开发工程师使用,由他们把sdk集成到自己的工程项目中,使用sdk提供的功能。
步骤s60、解密引擎jar进行解密并使用主类加载器加载解密后的jar中的代码到内存中,应用正常调用解密后sdk的代码。
具体地,解密引擎,解密并使用主类加载器加载被加密的jar到内存。应用正常调用解密引擎加载的加密jar中的代码。
本发明提供的代码加密方法,首先解析jar中的class文件,把其中的函数转换为无代码的接口函数,另外把原jar进行加密隐藏(如果是android系统运行,需要把jar转为android平台可执行的dex文件格式),其中转换后的sdk接口文件仅用于开发者集成sdk时,引用sdk中的代码,不会编译到应用中。另外,运行集成了加密sdk的应用,首先执行我们的解密引擎,获取当前应用的主类加载器,然后使用主类加载器,动态加载被加密的sdk代码,完成对加密sdk的加载工作,不会对sdk集成者和应用使用者暴露sdk代码,所以能够有效的保护sdk的代码安全。
进一步地,如图6所示,基于上述基于动态加载的javasdk代码加解密方法,本发明还相应提供了一种终端,所述终端包括处理器10、存储器20及显示器30。图6仅示出了终端的部分组件,但是应理解的是,并不要求实施所有示出的组件,可以替代的实施更多或者更少的组件。
所述存储器20在一些实施例中可以是所述终端的内部存储单元,例如终端的硬盘或内存。所述存储器20在另一些实施例中也可以是所述终端的外部存储设备,例如所述终端上配备的插接式硬盘,智能存储卡(smartmediacard,smc),安全数字(securedigital,sd)卡,闪存卡(flashcard)等。进一步地,所述存储器20还可以既包括所述终端的内部存储单元也包括外部存储设备。所述存储器20用于存储安装于所述终端的应用软件及各类数据,例如所述安装终端的程序代码等。所述存储器20还可以用于暂时地存储已经输出或者将要输出的数据。在一实施例中,存储器20上存储有基于动态加载的javasdk代码加解密程序40,该基于动态加载的javasdk代码加解密程序40可被处理器10所执行,从而实现本申请中基于动态加载的javasdk代码加解密方法。
所述处理器10在一些实施例中可以是一中央处理器(centralprocessingunit,cpu),微处理器或其他数据处理芯片,用于运行所述存储器20中存储的程序代码或处理数据,例如执行所述基于动态加载的javasdk代码加解密方法等。
所述显示器30在一些实施例中可以是led显示器、液晶显示器、触控式液晶显示器以及oled(organiclight-emittingdiode,有机发光二极管)触摸器等。所述显示器30用于显示在所述终端的信息以及用于显示可视化的用户界面。所述终端的部件10-30通过系统总线相互通信。
在一实施例中,当处理器10执行所述存储器20中基于动态加载的javasdk代码加解密程序40时实现以下步骤:
解析jar包中的class文件,将所述class文件中的函数转换为无代码的接口函数;
将jar包进行加密隐藏,如果是android平台的jar包,则将jar包转换为android系统的dex文件后进行加密;
当加密操作完成后,输出接口jar、解密引擎jar和加密后的jar;
将加密后的jar作为资源文件放入应用源码工程,并将接口jar和解密引擎jar引入工程,并在使用加密后的jar之前,初始化调用解密引擎jar;
启动集成了加密sdk的应用,并在运行时启动解密引擎jar,获取当前进程的主类加载器;
解密引擎jar进行解密并使用主类加载器加载解密后的jar中的代码到内存中,应用正常调用解密后sdk的代码。
所述将所述class文件中的函数转换为无代码的接口函数,具体包括:
根据字节码文件的二进制文件结构,解析jar包中的每个class文件;
获取每个class文件中所有函数的代码段,删除代码段中保存的二进制代码指令,将每个class文件中的函数转换为无代码的接口函数。
所述接口函数中无代码,只有函数声明。
所述解析jar包中的class文件,之前还包括:
如果是androidaar格式的sdk,则需要从aar中解压出jar包。
所述如果是android平台的jar包,则将jar包转换为android系统的dex文件后进行加密,具体包括:
如果是android平台的jar包,需要通过使用dx工具将jar包中的class文件转为androiddalvik虚拟机支持的dex格式的dex文件。
所述接口函数用于开发者集成sdk时引用sdk中的代码,不会编译到应用中。
本发明还提供一种存储介质,其中,所述存储介质存储有基于动态加载的javasdk代码加解密程序,所述基于动态加载的javasdk代码加解密程序被处理器执行时实现如上所述的基于动态加载的javasdk代码加解密方法的步骤。
综上所述,本发明提供基于动态加载的javasdk代码加解密方法及终端,所述方法包括:解析jar包中的class文件,将所述class文件中的函数转换为无代码的接口函数;将jar包进行加密隐藏,如果是android平台的jar包,则将jar包转换为android系统的dex文件后进行加密;当加密操作完成后,输出接口jar、解密引擎jar和加密后的jar;将加密后的jar作为资源文件放入应用源码工程,并将接口jar和解密引擎jar引入工程,并在使用加密后的jar之前,初始化调用解密引擎jar;启动集成了加密sdk的应用,并在运行时启动解密引擎jar,获取当前进程的主类加载器;解密引擎jar进行解密并使用主类加载器加载解密后的jar中的代码到内存中,应用正常调用解密后sdk的代码。本发明通过解析jar包中的class文件,把其中的函数转换为无代码的接口函数,并将原jar包进行加密隐藏,转换后的sdk接口文件仅用于开发者集成sdk时引用sdk中的代码,不会编译到应用中,运行集成了加密sdk的应用,获取当前应用的主类加载器,然后使用主类加载器动态加载被加密的sdk代码,完成对加密sdk的加载工作,不会对sdk集成者和应用使用者暴露sdk代码,有效的保护sdk的代码安全。
当然,本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关硬件(如处理器,控制器等)来完成,所述的程序可存储于一计算机可读取的存储介质中,所述程序在执行时可包括如上述各方法实施例的流程。其中所述的存储介质可为存储器、磁碟、光盘等。
应当理解的是,本发明的应用不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。