一种Java程序保护方法、装置、设备及可读存储介质与流程

文档序号:17090944发布日期:2019-03-13 23:27阅读:173来源:国知局
一种Java程序保护方法、装置、设备及可读存储介质与流程

本发明涉及软件技术领域,特别是涉及一种java程序保护方法、装置、设备及可读存储介质。



背景技术:

java是一种跨平台、解释型的语言。java编译工具将java源代码被编译成为javaclass文件,由java虚拟机负责对javaclass文件进行解释执行。与本地目标代码不同,对javaclass文件进行反编译就显得比较容易。有许多java的反编译工具都能够从javaclass文件生成高质量的源代码。

为阻止对javaclass文件进行反编译,目前主要对java编译出来的整个class文件进行加密,使用jvmti(jvm工具接口)编写native的agent(一种动态链接库),在classloader加载被加密的class文件时,进行实时解密。同时对此动态链接库进行加固处理。

虽然此加密整个class文件可阻止对class文件进行反编译,但是这种方案有严重的兼容性问题。具体的,因为现在很多框架和容器会在class文件被classloader加载前扫描其中的内容,以实现一些特定的功能(如安全排查等),这些框架或容器扫描到加过密的class文件时,就会报错,进而无法加载class文件,破坏了java程序的兼容性。

综上所述,如何有效地在保障兼容性的情况下保护java程序等问题,是目前本领域技术人员急需解决的技术问题。



技术实现要素:

本发明的目的是提供一种java程序保护方法、装置、设备及可读存储介质,在不损耗java程序的兼容性前提下,保护java程序。

为解决上述技术问题,本发明提供如下技术方案:

一种java程序保护方法,包括:

解析待加密的class文件,并确定code属性中的指令部分;

对所述class文件的所述指令部分进行加密,获得目标class文件;

创建meta文件,并将所述指令部分在所述目标class文件中对应的位置信息写入所述meta文件;

建立所述目标class文件和所述meta文件的对应关系;

在使用运行所述目标class文件过程中,加载所述目标class文件时,读取与所述目标class文件具有对应关系的所述meta文件;

利用所述meta文件记录的所述位置信息,对所述目标class文件中的所述指令部分进行解密,获得所述class文件。

优选地,加载所述目标class文件,包括:

利用c/c++编写的native的agent,并调用class文件加载函数加载所述目标class文件。

优选地,所述读取与所述目标class文件具有对应关系的所述meta文件,包括:

利用java本地接口调用加载所述目标class文件的classloader实时查找所述meta文件;

查找到所述meta文件时,读取所述meta文件。

优选地,所述创建meta文件,并将所述指令部分在所述目标class文件中对应的位置信息写入所述meta文件,包括:

将加密后的所述指令部分在所述目标class文件中的起始位置和长度确定为所述位置信息;

创建所述meta文件,并在所述meta文件中记录所述位置信息。

优选地,所述建立所述目标class文件和所述meta文件的对应关系,包括:

将所述meta文件存放在与所述目标class文件相同的路径下。

优选地,对所述class文件的所述指令部分进行加密,获得目标class文件,包括:

对所述指令部分进行加密,获得加密指令;

将所述class文件中的所述指令部分替换为所述加密指令,获得所述目标class文件。

一种java程序保护装置,包括:

文件解析模块,用于解析待加密的class文件,并确定code属性中的指令部分;

指令加密模块,用于对所述class文件的所述指令部分进行加密,获得目标class文件;

meta文件记录模块,用于创建meta文件,并将所述指令部分在所述目标class文件中对应的位置信息写入所述meta文件;

对应关系建立模块,用于建立所述目标class文件和所述meta文件的对应关系;

加载解密模块,用于在使用运行所述目标class文件过程中,加载所述目标class文件时,读取与所述目标class文件具有对应关系的所述meta文件;利用所述meta文件记录的所述位置信息,对所述目标class文件中的所述指令部分进行解密,获得所述class文件。

优选地,所述加载解密模块,具体用于利用c/c++编写的native的agent,并调用class文件加载函数加载所述目标class文件。

一种java程序保护设备,包括:

存储器,用于存储计算机程序;

处理器,用于执行所述计算机程序时实现上述java程序保护方法的步骤。

一种可读存储介质,所述可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述java程序保护方法的步骤。

应用本发明实施例所提供的方法,解析待加密的class文件,并确定code属性中的指令部分;对class文件的指令部分进行加密,获得目标class文件;创建meta文件,并将指令部分在目标class文件中对应的位置信息写入meta文件;建立目标class文件和meta文件的对应关系;在使用运行目标class文件过程中,加载目标class文件时,读取与目标class文件具有对应关系的meta文件;利用meta文件记录的位置信息,对目标class文件中的指令部分进行解密,获得class文件。

由于框架或容器扫描class文件,通常都没有具体扫描到指令部分,所以只加密指令部分,就可以兼容大部分场景。基于此,在设计开发阶段或公布包括class文件的应用之前,在对java程序编译后,即获得class文件时,可对class文件进行解析,并确定code属性中的指令部分进行加密,获得目标class文件。该目标class文件与class文件的区别仅在于文件中的code属性中的指令部分存在是否被加密,即class文件中的code属性中的指令部分未被加密,目标class文件中的code属性的指令部分已加密。其中,code属性中的指令部分即java程序中的java方法体内的代码转换而得,将该指令部分进行加密后,便可阻止非法人员对目标class文件进行反编译,进而获得java程序。对class文件中的code属性中的指令部分进行加密,获得目标class文件之后,创建meta文件,并将指令部分在目标class文件中对应的位置信息写入meta文件,然后,建立目标class文件和meta文件的对应关系。可在使用运行目标class文件时,通过meta文件所记载的位置信息,对目标class文件中加密后的指令部分进行解密,以便被正常加载。如此,便可在不影响class文件的兼容性的情况下,有效地阻止class文件被反编译,实现保护java程序的目的。

相应地,本发明实施例还提供了与上述java程序保护方法相对应的java程序保护装置、设备和可读存储介质,具有上述技术效果,在此不再赘述。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例中一种java程序保护方法的实施流程图;

图2为本发明实施例中一种java程序保护装置的结构示意图;

图3为本发明实施例中一种java程序保护设备的结构示意图;

图4为本发明实施例中一种java程序保护设备的具体结构示意图。

具体实施方式

为了使本技术领域的人员更好地理解本发明方案,下面结合附图和具体实施方式对本发明作进一步的详细说明。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

实施例一:

请参考图1,图1为本发明实施例中一种java程序保护方法的流程图,该方法包括以下步骤:

s101、解析待加密的class文件,并确定code属性中的指令部分。

在设计开发阶段,或公布包括class文件的应用之前,在对java程序编译后,即获得class文件时,可对class文件进行解析。也就是说,待加密的class文件是需保护的java程序,在进行编译后获得的。对class文件进行解析时,可参照class文件格式的标准进行,在此不再一一赘述该解析过程。在对class文件进行解析时,主要目的是确定class文件中code属性中的指令部分。该指令部分代表了java源程序的代码逻辑,也就是java源程序中的方法体。

s102、对class文件的指令部分进行加密,获得目标class文件。

对class文件中的指令部分进行加密,便可获得仅加密了指令部分的目标class文件。由于该指令部分代表了java源程序的代码逻辑,即使是对目标class文件进行反编译,也不会获得与class文件相对应的java源程序。如此,便可实现保护java程序的目的。需要说明的是,本文中的class文件与目标class文件的区别仅在于java原程序中的方法体或称为代码逻辑部分对应的指令部分是否被加密,具体的,即class文件中的指令部分未被加密,而目标class文件中的指令部分则被加密。

其中,对指令部分进行加密,获得目标class文件的过程包括:

步骤一、对指令部分进行加密,获得加密指令;

步骤二、将class文件中的指令部分替换为加密指令,获得目标class文件。

为了便于描述,下面将上述两个步骤结合起来进行说明。

采用常见的加密算法对指令部分进行加密,如此便可获得加密指令。加密指令即为加密后的指令部分所对应的内容。将class文件中指令部分替换为加密指令,保留其他部分不变,获得目标class文件。另外,由于对指令部分的具体的加密方式不影响本发明实施例实现保护java程序以及兼顾兼容性的问题,因此,只要该加密方式可对指令部分进行加密,不易被破解接口。即本发明实施例中对加密中所使用的加密算法并不做限定。

s103、创建meta文件,并将指令部分在目标class文件中对应的位置信息写入meta文件。

其中,meta文件即为记录meta(元素)的文件,具体的,在本发明实施例中则为记录指令部分在目标class文件对应的位置信息的文件。

具体的,创建meta文件,并将指令部分在目标class文件中对应的位置信息写入meta文件,具体包括:

步骤一、将加密后的指令部分在目标class文件中的起始位置和长度确定为位置信息;

步骤二、创建meta文件,并在meta文件中记录位置信息。

为了便于描述,下面将上述两个步骤结合起来进行说明。

将加密后的指令部分在目标class文件中的起始位置和长度确定为位置信息,而后创建一个meta文件,并在该meta文件中记录位置信息,以便在使用运行或分析目标class文件时,可通过meta文件记录的加密后的指令部分在目标class文件中的具体的位置,将指令部分进行解密,以获得原class文件。

s104、建立目标class文件和meta文件的对应关系。

将位置信息保存在meta文件之后,可建立目标class文件与meta文件的对应关系,以便在对目标class文件进行解密时,可从meta文件所记录的位置信息,快速准确地得知需解密的部分。

优选地,在建立目标class文件和meta文件的对应关系时,可直接将meta文件存放在与目标class文件相同的路径下。如此,通过访问与目标class文件相同路径,便可获得meta文件。

s105、在使用运行目标class文件过程中,加载目标class文件时,读取与目标class文件具有对应关系的meta文件。

对于加密后得到的目标class文件,jvmti(jvmtoolinterface,是java虚拟机所提供的native编程接口,为本地代码接口)或简称jvm,会判定目标class文件存在格式错误,无法加载,因此必须在解密过后才可以被加载。即,因此在加载目标class文件的过程中,还需将目标class进行解密,如此jvm才能加载目标class文件。

其中,读取与目标class文件具有对应关系的meta文件,可具体为利用java本地接口调用加载目标class文件的classloader实时查找meta文件;查找到meta文件时,读取meta文件。若存在多个目标class文件时,在查找meta文件时,可一开始就把meta文件都找到,然后把里面的内容都记在内存中,目标class文件加载时,则可直接去内存中找相应的数据。

优选地,在加载目标class文件时,可利用c/c++编写的native的agent,并调用class文件加载函数加载目标class文件。由于jvmti是java虚拟机所提供的native编程接口,是一套本地代码接口。因此使用jvmti,可通过c/c++以及jni打交道。事实上,开发时一般采用建立一个agent的方式来使用jvmti,它使用jvmti函数,设置一些回调函数,并从java虚拟机中得到当前的运行态信息,并做出判断,最后还可能操作虚拟机的运行态。把agent编译成一个动态链接库之后,便可以在java程序启动的时候来加载它(启动加载模式),也可以在java5之后使用运行时加载(活动加载模式)。

其中,native指的是本地代码,本地代码是可以在具体机器上直接执行的代码,对比于java的字节码,字节码是不可以在具体的机器上直接执行的,需要经过jvm编译成对应平台的机器语言才能执行。native代码一般使用c/c++来写,并编译成一个可以被jvm加载的动态链接库。

s106、利用meta文件记录的位置信息,对目标class文件中的指令部分进行解密,获得class文件。

具体的,jvmti提供了对class加载的过程中设置回调函数,如hook函数,是jvm在加载class的过程中,如果注册了classfileloadhook这个hook函数,jvm就调用到这个函数,如此,便可在hook函数中进行解密操作。解密所使用的算法和加密时所使用的加密算法匹配即可,在此不再赘述具体的解密算法的具体解密过程。

应用本发明实施例所提供的方法,解析待加密的class文件,并确定code属性中的指令部分;对class文件的指令部分进行加密,获得目标class文件;创建meta文件,并将指令部分在目标class文件中对应的位置信息写入meta文件;建立目标class文件和meta文件的对应关系;在使用运行目标class文件过程中,加载目标class文件时,读取与目标class文件具有对应关系的meta文件;利用meta文件记录的位置信息,对目标class文件中的指令部分进行解密,获得class文件。

由于框架或容器扫描class文件,通常都没有具体扫描到指令部分,所以只加密指令部分,就可以兼容大部分场景。基于此,在设计开发阶段或公布包括class文件的应用之前,在对java程序编译后,即获得class文件时,可对class文件进行解析,并确定code属性中的指令部分进行加密,获得目标class文件。该目标class文件与class文件的区别仅在于文件中的code属性中的指令部分存在是否被加密,即class文件中的code属性中的指令部分未被加密,目标class文件中的code属性的指令部分已加密。其中,code属性中的指令部分即java程序中的java方法体内的代码转换而得,将该指令部分进行加密后,便可阻止非法人员对目标class文件进行反编译,进而获得java程序。对class文件中的code属性中的指令部分进行加密,获得目标class文件之后,创建meta文件,并将指令部分在目标class文件中对应的位置信息写入meta文件,然后,建立目标class文件和meta文件的对应关系。可在使用运行目标class文件时,通过meta文件所记载的位置信息,对目标class文件中加密后的指令部分进行解密,以便被正常加载。如此,便可在不影响class文件的兼容性的情况下,有效地阻止class文件被反编译,实现保护java程序的目的。

实施例二:

相应于上面的方法实施例,本发明实施例还提供了一种java程序保护装置,下文描述的java程序保护装置与上文描述的java程序保护方法可相互对应参照。

参见图2所示,该装置包括以下模块:

文件解析模块101,用于解析待加密的class文件,并确定code属性中的指令部分;

指令加密模块102,用于对class文件的指令部分进行加密,获得目标class文件;

meta文件记录模块103,用于创建meta文件,并将指令部分在目标class文件中对应的位置信息写入meta文件;

对应关系建立模块104,用于建立目标class文件和meta文件的对应关系;

加载解密模块105,用于在建立目标class文件和meta文件的对应关系之后,在使用运行目标class文件过程中,加载目标class文件时,读取与目标class文件具有对应关系的meta文件;利用meta文件记录的位置信息,对目标class文件中的指令部分进行解密,获得class文件。

应用本发明实施例所提供的装置,解析待加密的class文件,并确定code属性中的指令部分;对class文件的指令部分进行加密,获得目标class文件;创建meta文件,并将指令部分在目标class文件中对应的位置信息写入meta文件;建立目标class文件和meta文件的对应关系;在使用运行目标class文件过程中,加载目标class文件时,读取与目标class文件具有对应关系的meta文件;利用meta文件记录的位置信息,对目标class文件中的指令部分进行解密,获得class文件。

由于框架或容器扫描class文件,通常都没有具体扫描到指令部分,所以只加密指令部分,就可以兼容大部分场景。基于此,在设计开发阶段或公布包括class文件的应用之前,在对java程序编译后,即获得class文件时,可对class文件进行解析,并确定code属性中的指令部分进行加密,获得目标class文件。该目标class文件与class文件的区别仅在于文件中的code属性中的指令部分存在是否被加密,即class文件中的code属性中的指令部分未被加密,目标class文件中的code属性的指令部分已加密。其中,code属性中的指令部分即java程序中的java方法体内的代码转换而得,将该指令部分进行加密后,便可阻止非法人员对目标class文件进行反编译,进而获得java程序。对class文件中的code属性中的指令部分进行加密,获得目标class文件之后,创建meta文件,并将指令部分在目标class文件中对应的位置信息写入meta文件,然后,建立目标class文件和meta文件的对应关系。可在使用运行目标class文件时,通过meta文件所记载的位置信息,对目标class文件中加密后的指令部分进行解密,以便被正常加载。如此,便可在不影响class文件的兼容性的情况下,有效地阻止class文件被反编译,实现保护java程序的目的。

在本发明的一种具体实施方式中,加载解密模块105,具体用于利用c/c++编写的native的agent,并调用class文件加载函数加载目标class文件。

在本发明的一种具体实施方式中,加载解密模块105,具体用于利用java本地接口调用加载目标class文件的classloader实时查找meta文件;查找到meta文件时,读取meta文件。

在本发明的一种具体实施方式中,meta文件记录模块103,具体用于将加密后的指令部分在目标class文件中的起始位置和长度确定为位置信息;创建meta文件,并在meta文件中记录位置信息。

在本发明的一种具体实施方式中,对应关系建立模块104,具体用于将meta文件存放在与目标class文件相同的路径下。

在本发明的一种具体实施方式中,指令加密模块102,具体用于对指令部分进行加密,获得加密指令;将class文件中的指令部分替换为加密指令,获得目标class文件。

实施例三:

相应于上面的方法实施例,本发明实施例还提供了一种java程序保护设备,下文描述的一种java程序保护设备与上文描述的一种java程序保护方法可相互对应参照。

参见图3所示,该java程序保护设备包括:

存储器d1,用于存储计算机程序;

处理器d2,用于执行计算机程序时实现上述方法实施例的java程序保护方法的步骤。

具体的,请参考图4,为本实施例提供的一种java程序保护设备的具体结构示意图,该java程序保护设备可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上处理器(centralprocessingunits,cpu)322(例如,一个或一个以上处理器)和存储器332,一个或一个以上存储应用程序342或数据344的存储介质330(例如一个或一个以上海量存储设备)。其中,存储器332和存储介质330可以是短暂存储或持久存储。存储在存储介质330的程序可以包括一个或一个以上模块(图示没标出),每个模块可以包括对数据处理设备中的一系列指令操作。更进一步地,中央处理器322可以设置为与存储介质330通信,在java程序保护设备301上执行存储介质330中的一系列指令操作。

java程序保护设备301还可以包括一个或一个以上电源326,一个或一个以上有线或无线网络接口350,一个或一个以上输入输出接口358,和/或,一个或一个以上操作系统341。

上文所描述的java程序保护方法中的步骤可以由java程序保护设备的结构实现。

实施例四:

相应于上面的方法实施例,本发明实施例还提供了一种可读存储介质,下文描述的一种可读存储介质与上文描述的一种java程序保护方法可相互对应参照。

一种可读存储介质,可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述方法实施例的java程序保护方法的步骤。

该可读存储介质具体可以为u盘、移动硬盘、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、磁碟或者光盘等各种可存储程序代码的可读存储介质。

专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1