Java应用软件加密保护的方法

文档序号:6439340阅读:1657来源:国知局
专利名称:Java应用软件加密保护的方法
技术领域
本发明涉及Java应用软件加密保护的方法。
背景技术
目前大量的企业级应用软件及互联网应用软件都是通过Java编写的。由于Java 通过虚拟机方式运行,所有采用Java编写的应用软件源程序代码经过Java编译器编译后, 并不生成二进制原生本机机器代码,而是生成Java字节码。Java字节码独立于计算机硬件及操作系统,在运行时由Java虚拟机负责解释并即时生成本机机器代码而执行。Java 字节码非常容易被各类反编译工具分析并反编译还原为Java源程序代码,这就导致了各类Java应用软件在版权保护、防止盗版破解等方面的能力变得异常薄弱。虽然随后出现了 Java混淆器可以将Java字节码进行扰乱混淆,以便使反编译工具在反编译还原操作后生成的Java源程序代码晦涩难懂,增加了阅读理解难度,但仍然无法从本质上阻止反编译工具对Java字节码的反向工程。因此,如何彻底解决Java应用软件的加密保护,继而防止对其进行反向工程就成为一个亟待解决的问题。由于Java字节码始终是由Java虚拟机来解释的,因此任何对Java字节码的加密保护都需要提供一个字节码执行入口,该入口却不能被加密,否则Java虚拟机仍然无法解释执行。但该入口的存在又会导致理论上被反编译器跟踪进而完全被反向工程的可能性,因此,必须寻找到一个在Java虚拟机启动时提前加载并执行字节码的方式,并能够彻底接管虚拟机后续字节码类加载操作,并将字节码加解密以C/C++实现,并通过Java Native Interface或Java Native Access方式由虚拟机调用,对后续即将载入的真正的应用程序被加密过的字节码进行解密还原,以供虚拟机解释执行,从而达到软件加密保护的目的。

发明内容
本发明所要解决的技术问题是提供一种Java应用软件加密保护的方法,克服现有Java应用软件难以加密保护的缺陷。为解决上述技术问题,本发明提供一种Java应用软件加密保护的方法,其特征在于,包括以下步骤
步骤1、利用Java开发实现加密工具程序,对应用程序的正常类文件或JAR软件包进行加密处理及重新打包;并将加密过程中产生的公私钥作为软件许可证颁发给授权用户; 步骤2、编写一个代理类加载器; 步骤3、开发本机机器代码解密函数库;
步骤4、所述代理类加载器在JVM启动提前加载,并接管虚拟机后续所有类加载操作; 步骤5、所述代理类加载器通过Java Native Interface或Java Native Access方式调用所述本机机器代码解密函数库,对虚拟机试图加载的每一个Java类进行分析识别,如果是应用程序已加密过的字节码数据,则在计算机内存中解码还原为正常字节码数据并提交虚拟机运行。
所述代理类加载器通过继承并修改通用类加载器实现。所述修改通用类加载器的方式包括自定义类加载器的字节码生成方法。所述加密工具程序采用DES算法对字节码进行加密解密。所述本机机器代码解密函数库为C/C++开发实现的二进制本机机器代码解密函数库。由于本发明的加密解密算法的实现代码全部由二进制原生机器代码实现,目标 Java应用软件字节码则完全被事先按照自定义规则进行了编码,使得目前所有的Java字节码反编译器均无法正常工作,无法反编译出Java源代码,从而起到了保护了 Java应用软件不被反向工程破解的目的,具有目前所有Java混淆器都无法比拟的优点。这种方法解决了长久以来采用Java编写的应用软件由于字节码能够被反编译还原为源程序代码而无法保护防止破解盗版的问题,解决了 Java混淆器只能对代码进行混淆,降低反编译生成的源代码可读性但无法彻底防止反编译的问题。该方法可广泛适用于任何基于Java SE/Java EE标准开发的应用软件保护,支持Windows/Linux/Unix操作系统环境,可极大地提高Java 应用软件的版权保护能力。


下面结合附图和具体实施方式
对本发明的技术方案作进一步具体说明。图1为本发明的加密流程图。图2为本发明的JVM解密流程图。
具体实施例方式如图1所示,本发明的加密方法,包括步骤读取原始的Java程序类文件,利用 DES标准算法实现可逆加密,产生公私钥,将加密后的字节码重新组装为Java软件包。将加密过程中产生的公私钥作为软件许可证颁发给授权用户。针对上述加密方法,采用C/C++开发实现解密函数库,并编译为二进制本机机器代码解密函数库,如Windows平台的DLL文件,或Linux/Unix平台的so文件。本发明的核心在于解密方法。在解密之前,通过继承并修改Java通用类加载器 ClassLoader,自定义其字节码生成方法,生成一个代理类加载器。此后,具体在JVM上的解密过程如图2所示,包括步骤
Java虚拟机启动时,率先加载该代理类加载器,常驻虚拟机内存,然后代理类加载器全面接管虚拟机上后续所有的类字节码数据加载。代理类加载器进行拦截扫描后续加载的每一个类,并分析识别是否为应用软件加密类。如果判断不是应用程序加密过的字节码而是普通未加密的其他应用程序字节码,则立即交由虚拟机执行;如果判断是目标应用程序加密过的字节码,则继续检查是否具有基于公私钥的软件许可证,如果没有发现有效的基于公私钥的软件许可证,则不允许解密并直接结束;如果存在有效的软件许可证,则通过JNI/JNA调用由C/C++开发实现的解密函数库完成对加密字节码数据在内存中的解密,将解密后的正常字节码交由虚拟机执行,从而完成整个解密运行过程。由于解密的具体操作由C/C++生成的二进制机器代码实现,采用常规反编译手段是无法得到源程序代码的,而加密过的字节码也无法反编译得到源程序代码,而修改的类加载器字节码虽然是未被加密的,但反编译后的源程序代码只能看到JNI/JNA调用,没有任何意义,所以彻底实现了对Java应用软件的保护。 最后所应说明的是,以上具体实施方式
仅用以说明本发明的技术方案而非限制, 尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。
权利要求
1.一种Java应用软件加密保护的方法,其特征在于,包括以下步骤步骤1、利用Java开发实现加密工具程序,对应用程序的正常类文件或JAR软件包进行加密处理及重新打包;并将加密过程中产生的公私钥作为软件许可证颁发给授权用户;步骤2、编写一个代理类加载器;步骤3、开发本机机器代码解密函数库;步骤4、所述代理类加载器在JVM启动提前加载,并接管虚拟机后续所有类加载操作;步骤5、所述代理类加载器通过Java Native Interface或Java Native Access方式调用所述本机机器代码解密函数库,对虚拟机试图加载的每一个Java类进行分析识别,如果是应用程序已加密过的字节码数据,则在计算机内存中解码还原为正常字节码数据并提交虚拟机运行。
2.根据权利要求1所述的Java应用软件加密保护的方法,其特征在于,所述代理类加载器通过继承并修改通用类加载器实现。
3.根据权利要求2所述的Java应用软件加密保护的方法,其特征在于,所述修改通用类加载器的方式包括自定义类加载器的字节码生成方法。
4.根据权利要求1-3之一所述的Java应用软件加密保护的方法,其特征在于,所述加密工具程序采用DES算法对字节码进行加密解密。
5.根据权利要求4所述的Java应用软件加密保护的方法,其特征在于,所述本机机器代码解密函数库为C/C++开发实现的二进制本机机器代码解密函数库。
全文摘要
本发明公开了一种通过代理类加载器封装实现的较为严密可靠的Java应用软件加密保护方法,准确地说,是利用修改Java虚拟机启动时所执行的特殊代理类通过JavaNativeInterface或JavaNativeAccess方式加载自定义的二进制加密解密原生代码库,实现对目标Java应用软件字节码进行任意自定义规则的加密及解密操作。本发明解决了长久以来采用Java编写的应用软件由于字节码能够被反编译还原为源程序代码而无法保护防止破解盗版的问题,解决了Java混淆器只能对代码进行混淆,降低反编译生成的源代码可读性但无法彻底防止反编译的问题。该方法可广泛适用于任何基于JavaSE/JavaEE标准开发的应用软件保护,支持Windows/Linux/Unix操作系统环境,可极大地提高Java应用软件的版权保护能力。
文档编号G06F21/22GK102346834SQ201110383418
公开日2012年2月8日 申请日期2011年11月25日 优先权日2011年11月25日
发明者张新 申请人:武汉钢铁(集团)公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1