一种Java代码的混淆方法、恢复方法及其装置与流程

文档序号:14713994发布日期:2018-06-16 00:58阅读:1113来源:国知局
一种Java代码的混淆方法、恢复方法及其装置与流程

本发明涉及计算机安全领域,具体来说,涉及一种Java代码的混淆方法、恢复方法及其装置。



背景技术:

源代码作为科技公司的核心资产应当被严格保护起来,以防他人窃取。虽然绝大多数公司都有一系列安全措施杜绝源代码泄露,但是Java程序由于其自身特点,存在源代码被泄露的风险。Java编译器将源代码编译后生成Java虚拟机可以执行的字节码,并以特定的文件格式和内容布局将字节码存储在Java类文件中。Java反编译工具可以读取Java类文件的内容,从而反向编译出Java程序的源代码。

对于做系统输出或者运营公有云服务的科技公司来说,Java程序是部署在客户的计算机环境,或者第三方公有云平台(例如,阿里云,腾讯云等)。因此,如何防止客户未经授权传播Java程序,或者黑客窃取Java程序,进而反编译Java类文件导致源代码细节泄露,是一个亟待解决的问题。

目前防止反编译的技术主要分为两种:命名混淆技术和Java类文件加密技术,具体地:

命名混淆技术是通过更改Java程序中的变量名、方法名等方式,降低代码可读性,增大阅读反编译后代码的难读。但本质上并没有解决问题,通过仔细阅读反编译后的代码,还是能够理解程序的实现细节;

类文件加密技术是通过使用加密算法,将Java类文件内容全部加密的方式来阻止反编译。该方法从本质上解决了反编译的问题,但同时带来其他问题。首先,加密后的类文件不符合Java类文件格式规范,不是一个合法的Java类文件。如果其他Java类在编译时期依赖这个类,Java编译器因无法解析加密后的Java类文件而报错,导致该方法不能用于Java类库的加密。其次,很多第三方框架和类库会在程序启动或者运行时动态地读取Java类文件。如果Java程序使用了这些第三方框架和类库,由于Java类文件被加密,导致运行时出错。

针对相关技术中的问题,目前尚未提出有效的解决方案。



技术实现要素:

针对相关技术中的问题,本发明提出一种Java代码的混淆方法、恢复方法及其装置,其可以灵活地配置混淆规则,从而决定哪些Java类需要混淆,混淆后的Java类文件依然能够参与编译,而且不会造成其他第三方框架和类库运行时的错误。

本发明的技术方案是这样实现的:

根据本发明的一个方面,提供了一种Java代码的混淆方法。

该Java代码的混淆方法包括:定义混淆规则,以及将混淆规则存储在混淆规则文件中;根据混淆规则,对Java类文件进行混淆,获得混淆的Java类文件;将混淆的Java类文件和混淆规则文件打包成JAR文件。

根据本发明的一个实施例,根据混淆规则,对Java类文件进行混淆,获得混淆的Java类文件包括:根据混淆规则,确定需混淆的Java类文件;将需混淆的Java类文件中类方法的代码段进行混淆,从而获得混淆的Java类文件。

根据本发明的另一方面,提供了一种Java代码的恢复方法。

该Java代码的恢复方法包括:将恢复算法写入动态库,将动态库植入到Java程序运行的操作系统中;以及调用指定的类加载器,以及通过指定的类加载器调用动态库中的恢复算法,从而恢复混淆的Java类文件。

根据本发明的一个实施例,通过指定的类加载器调用动态库中的恢复算法,从而恢复混淆的Java类文件包括:指定的类加载器读取JAR文件中的混淆规则文件中的混淆规则,判断Java类文件是否需要恢复;在判断Java类文件需要恢复的情况下,通过指定的类加载器调用动态库中的恢复算法,从而恢复混淆的Java类文件。

根据本发明的一个实施例,通过指定的类加载器调用动态库中的恢复算法,从而恢复混淆的Java类文件包括:将Java类文件中类方法的代码段发送至动态库进行恢复;动态库将恢复后的代码段返回。

根据本发明的另一方面,提供了一种Java代码的混淆装置。

该Java代码的混淆装置包括:定义存储模块,用于定义混淆规则,以及将混淆规则存储在混淆规则文件中;混淆模块,用于根据混淆规则,对Java类文件进行混淆,获得混淆的Java类文件;打包模块,用于将混淆的Java类文件和混淆规则文件打包成JAR文件。

根据本发明的一个实施例,混淆模块包括:确定模块,用于根据混淆规则,确定需混淆的Java类文件;混淆子模块,用于将需混淆的Java类文件中类方法的代码段进行混淆,从而获得混淆的Java类文件。

根据本发明的另一方面,提供了一种Java代码的恢复装置。

该Java代码的恢复装置包括:植入模块,用于将恢复算法写入动态库,将动态库植入到Java程序运行的操作系统中;以及调用恢复模块,用于调用指定的类加载器,以及通过指定的类加载器调用动态库中的恢复算法,从而恢复混淆的Java类文件。

根据本发明的一个实施例,调用恢复模块包括:判断模块,用于读取JAR文件中的混淆规则文件中的混淆规则,判断Java类文件是否需要恢复;恢复模块,用于在判断Java类文件需要恢复的情况下,通过指定的类加载器调用动态库中的恢复算法,从而恢复混淆的Java类文件。

根据本发明的一个实施例,恢复模块包括:发送模块,用于将Java类文件中类方法的代码段发送至动态库进行恢复;返回模块,用于将恢复后的代码段返回。

本发明的有益技术效果在于:

本发明通过定义混淆规则,灵活地配置哪些Java类文件需要混淆,此外,混淆的Java类文件还实现了混淆细节,从而防止被反编译,以及混淆后的Java类文件依然符合Java类文件格式规范,能够参与编译,而且不会造成Java程序依赖的其他第三方框架和类库运行时的错误。

附图说明

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

图1是根据本发明实施例的Java代码的混淆方法的流程图;

图2是根据本发明实施例的混淆过程的示意图;

图3是根据本发明实施例的Java代码的恢复方法的流程图;

图4是根据本发明实施例的恢复类文件过程的示意图;

图5是根据本发明实施例的Java代码的混淆装置的框图;

图6是根据本发明实施例的Java代码的恢复装置的框图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员所获得的所有其他实施例,都属于本发明保护的范围。

根据本发明的实施例,提供了一种Java代码的混淆方法、恢复方法及其装置。

如图1所示,根据本发明实施例的Java类文件的混淆方法包括:步骤S101,定义混淆规则,以及将混淆规则存储在混淆规则文件中,其中,该混淆规则定义了哪些Java类文件需要混淆;步骤S103,根据混淆规则,对Java类文件进行混淆,获得混淆的Java类文件;步骤S105,将混淆的Java类文件和混淆规则文件打包成JAR文件。

借助于本发明的上述技术方案,通过定义混淆规则,灵活地配置哪些Java类文件需要混淆,此外,混淆的Java类文件还实现了混淆细节,从而防止被反编译,以及混淆后的Java类文件依然符合Java类文件格式规范,能够参与编译,而且不会造成Java程序依赖的其他第三方框架和类库运行时的错误。为了更好的描述本发明的技术方案,下面通过具体的实施例对该混淆方法进行详细的描述。

根据本发明的一个实施例,根据混淆规则,对Java类文件进行混淆,获得混淆的Java类文件包括:根据混淆规则,确定需混淆的Java类文件;将需混淆的Java类文件中类方法的代码段进行混淆,从而获得混淆的Java类文件,从而混淆了实现细节,同时,混淆的Java类方法的代码段的大小没有发生改变,因此没有破坏Java类文件结构,此外,混淆的Java类文件仍然能够参与Java编译,而且也不会造成Java程序依赖的其他第三方框架和类库的运行时错误。

为了更好的描述本发明的技术方案,下面通过具体的实施例进行详细的描述。

如图2所示,首先,对Java源文件进行编译,获得类文件,其中,Java源文件指用Java语言写出来的代码保存为文件后的结果,源文件是相对目标文件和可执行文件而言的,而Java类文件则是利用Java编译器生成的编译文件,其是用来给Java虚拟机执行的机器语言。随后将混淆规则写入混淆规则文件或混淆规则文件(如Manifest文件)中,混淆规则定义了哪些Java类文件需要混淆。。随后,读取混淆规则文件中的混淆规则,判断Java类文件是否需要混淆,在Java类文件需要混淆的情况下,将Java类文件中类方法的代码段进行混淆,并重新写入Java类文件中。此外,在Java类文件不需要混淆的情况下,无需对该Java类文件进行混淆处理。最后,将混淆后的Java类文件和混淆规则文件打包成JAR文件,该JAR文件是将许多文件组合成的一个压缩文件。

此外,Java类文件格式是Sun公司开发设计的一种文件格式,其制定了编译器生成的Java类的字节码存储于文件的规范,例如,根据本发明的一个实施例,以上示出了类文件的格式。

另外,在上述代码段中的method_info部分存储了Java类的所有方法的信息,例如,根据本发明的一个实施例,以下出了method_info结构。

此外,在method_info的结构中,attributes存储了Java类方法的很多属性,其中一个属性为Code属性,也就是本发明中所述的Java类方法的代码段例如,根据本发明的一个实施例,以下出了Code结构。

另外,Code结构里code[code_length]是一个变长的数组,其存储了Java类方法的Java指令信息,也就是Java类方法的实现细节,从而通过混淆该数组,从而混淆实现细节,从而防止被反编译,进而避免了源代码被泄露造成经济损失的情况。

此外,以下还是出了将混淆的Java类文件和混淆规则文件打包成JAR文件的目录结构。

根据本发明的实施例,还提供了一种Java代码的恢复方法。

如图3所示,根据本发明实施例的Java代码的恢复方法包括:步骤S301,将恢复算法写入动态库,将动态库植入到Java程序运行的操作系统中;步骤S302,调用指定的类加载器,以及通过指定的类加载器调用动态库中的恢复算法,从而恢复混淆的Java类文件。

根据本发明的一个实施例,通过指定的类加载器调用动态库中的恢复算法,从而恢复混淆的Java类文件包括:指定的类加载器读取JAR文件中的混淆规则文件中的混淆规则,判断Java类文件是否需要恢复;在判断Java类文件需要恢复的情况下,通过指定的类加载器调用动态库中的恢复算法,从而恢复混淆的Java类文件。

根据本发明的一个实施例,通过指定的类加载器调用动态库中的恢复算法,从而恢复混淆的Java类文件包括:将Java类文件中类方法的代码段发送至动态库进行恢复;动态库将恢复后的代码段返回。

为了更好的描述本发明的技术方案,下面通过具体的实施例对该恢复方法进行详细的描述。

如图4所示,首先,JAR文件内包括:混淆后的Java类文件和混淆规则文件,通过读取JAR文件中的混淆规则文件中的混淆规则,判断该Java类文件是否需要恢复,如果不需要恢复,那么由Java默认类加载器完成加载;而如果需要恢复,调用指定的类加载器,以及通过指定的类加载器调用动态库中的恢复算法,随后读取Java类文件内容,将类方法的代码段读取出来,将Java类文件中类方法的代码段发送至动态库进行恢复,动态库恢复代码段后再将数据返回。例如,根据本发明的一个实施例,以下示出了混淆规则文件的文件格式。

为了更好的描述本发明的技术方案,下面通过具体的实施例对本发明的技术方案进行详细的描述。

1)、将混淆规则写入混淆规则文件中,例如,根据本发明的一个实施例,该混淆规则为:

Obfuscation:com.example.credential

Skip-Obfuscation:com.example.public

其中,该混淆规则指定com.example.credentail包下的所有Java类需要做混淆,而com.example.public包下的所有Java类不需做混淆。

2)、混淆类文件

读取Java编译器编译生成的Java类文件,参照混淆规则,如果该类文件需要做混淆,那么根据类文件格式规范,定位Java类文件里每一个方法的Code属性,将其内容混淆。

此外,可以灵活设计混淆规则,但混淆后的内容大小必须和混淆前一致,否则会破坏Java类文件结构。例如,根据本发明的一个实施例,假设该数组中的每个元素i,当前元素在整个数组中的位置为p,代码段大小值为n,计算出i1=i^p^n(^表示按位异或操作),用i1值替换原有的i值,从而实现混淆,最后将混淆后的内容重新写回Java类文件中。

3)、打包

将混淆后的Java类文件和混淆规则文件一起打包成JAR文件。

4)、类加载器

由于Java类文件经过混淆,Java内置的类加载器无法正常加载混淆后的类文件,所以需要使用特定的类加载器,通过继承Java默认类加载器,重新实现类加载过程,恢复被混淆的代码段。

当需要加载一个Java类文件的时候,加载器读取混淆规则文件,判断该Java类文件是否需要恢复,如果不需要恢复,那么由Java默认类加载器完成加载;如果需要恢复,那么通过Java本地方法调用,将混淆后的代码段传入负责恢复的动态库,得到恢复后的代码段。

5)、动态库

该动态库由C语言实现,植入运行时的操作系统。类加载器通过Java本地方法调用方式,将混淆后的代码段传入,在动态库内完成恢复,再返回给类加载器,此外,混淆和恢复算法是可以灵活地替换和升级的。

根据本发明的另一方面,提供了一种Java代码的混淆装置。

如图5所示,该Java代码的混淆装置包括:定义存储模块51,用于定义混淆规则,以及将混淆规则存储在混淆规则文件中;混淆模块52,用于根据混淆规则,对Java类文件进行混淆,获得混淆的Java类文件;打包模块,用于将混淆的Java类文件和混淆规则文件打包成JAR文件。

根据本发明的一个实施例,混淆模块52包括:确定模块(未示出),用于根据混淆规则,确定需混淆的Java类文件;混淆子模块(未示出),用于将需混淆的Java类文件中类方法的代码段进行混淆,从而获得混淆的Java类文件。

根据本发明的另一方面,提供了一种Java代码的恢复装置。

如图6所示,该Java代码的恢复装置包括:植入模块61,用于将恢复算法写入动态库,将动态库植入到Java程序运行的操作系统中;以及调用恢复模块62,用于调用指定的类加载器,以及通过指定的类加载器调用动态库中的恢复算法,从而恢复混淆的Java类文件。

根据本发明的一个实施例,调用恢复模块62包括:判断模块(未示出),用于读取JAR文件中的混淆规则文件中的混淆规则,判断Java类文件是否需要恢复;恢复模块(未示出),用于在判断Java类文件需要恢复的情况下,通过指定的类加载器调用动态库中的恢复算法,从而恢复混淆的Java类文件。

根据本发明的一个实施例,恢复模块包括:发送模块(未示出),用于将Java类文件中类方法的代码段发送至动态库进行恢复;返回模块(未示出),用于将恢复后的代码段返回。

综上所述,借助于本发明的上述技术方案,通过定义混淆规则,灵活地配置哪些Java类文件需要混淆,此外,混淆的Java类文件还实现了混淆细节,从而防止被反编译,以及混淆后的Java类文件依然符合Java类文件格式规范,能够参与编译,而且不会造成Java程序依赖的其他第三方框架和类库运行时的错误。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

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