一种防止Java程序被反编译的方法技术

技术编号:5537014 阅读:292 留言:0更新日期:2012-04-11 18:40
本发明专利技术涉及一种防止Java程序被反编译的方法,包括以下步骤:1)对要发布的Java字节码文件进行加密;2)用Java虚拟机工具接口监听它初始化事件;3)为Java虚拟机初始化事件指定Hook函数;4)Java虚拟机初始化完成时自动调用Hook函数,并在的Hook函数中使用Java本地接口将Java虚拟机在生成类对象时调用的函数注册为自定义的代理函数;5)Java虚拟机在生成某个类对象时调用自定义的代理函数,在自定义的代理函数中对加密过的Java字节码文件进行解密处理;6)将解密后的Java字节码文件生成相应的类对象后返回给Java虚拟机。本发明专利技术解决了现有的技术中阻止对Java字节码文件进行反编译的方法应用范围局限的技术问题,本发明专利技术保持了Java程序的跨平台特性、保持了Java虚拟机的通用性。

【技术实现步骤摘要】

本专利技术是用于阻止对Java字节码文件进行反编译以获取Java程序源代码,即用 于Java程序的保护。
技术介绍
Java是一种跨平台的、解释型语言。Java编译工具将Java源代码被编译成为Java 字节码文件,由Java虚拟机负责对Java字节码文件进行解释执行。与本地目标代码不同, Java字节码文件中仍然保留了方法名称、变量名称,并且通过这些名称来访问变量和方法, 这些符号往往带有许多语义信息。因此,对Java字节码文件进行反编译就显得比较容易。 有许多Java的反编译工具都能够从Java字节码文件生成高质量的源代码。为阻止对Java 字节码文件进行反编译,目前主要采用的有以下几种方法(1)隔离Java程序是指将关键的Java字节码文件放在服务器端,客户端通过访 问服务器的相关接口来获得服务,而不是直接访问Java字节码文件。这样黑客就无法反编 译Java字节码文件。但是对于单机运行的程序是无法采用这种方法进行隔离的。(2)字节码混淆主要是通过将定义的类、变量、方法和包的名字改为无意义的字 符串、使用非法的字符代替变量符号和在软件中添加一些无关的指令或永远执行不到的指 令等手段来增加反编译和对反编译后源代码阅读的难度。但这种方法并不能真正阻止反编 译,而且混淆都有一定的规律可循,如果掌握这些规律,在反编译时仍然可以得到一定质量 的源代码。(3)转换本地代码即将Java程序像C/C++程序一样编译成本机可执行的二进制 代码。但是这样做使得Java程序失去其跨平台的特性,而且这种技术目前并不十分成熟, 因此不适用于大型应用程序。(4)自定义类加载器是指首先将Java字节码文件进行加密处理,然后自已编写 一个Java类装载器在Java字节码文件装载时再进行解密处理。这种方法的缺点在于虽然 经过加密的Java字节码文件无法被反编译,但自定义的类加载器本身却不能防止被反编 译。因此,加密过的Java字节码文件仍然是不安全的。
技术实现思路
为了解决现有的技术中阻止对Java字节码文件进行反编译的方法应用范围局 限、不能从根本上杜绝Java字节码文件被反编译的技术问题,本专利技术提供一种防止Java程 序被反编译的方法。本专利技术的技术解决方案 ,其特殊之处在于包括以下步骤1采用加密算法对要发布的Java字节码文件进行加密;2采用Java虚拟机工具接口监听Java虚拟机初始化事件;3采用Java虚拟机工具接口为步骤2中Java虚拟机监听到的Java虚拟机初始化事件指定Hook函数;4IJava虚拟机初始化完成时自动调用相应的Hook函数,并在的Hook函数中使用 Java本地接口将Java虚拟机在生成类对象时调用的函数注册为自定义的代理函数;5Java虚拟机在生成某个类对象时调用相应的自定义的代理函数,在自定义的代 理函数中对在步骤1中加密过的Java字节码文件进行解密处理;6将解密后的Java字节码文件生成相应的类对象后返回给Java虚拟机。上述步骤4中所述Java虚拟机在生成类对象时调用的函数是函数java. lang. ClassLoader. defineclassl0本专利技术所具有的优点1、保持了 Java程序的跨平台特性Java虚拟机工具接口和Java本地接口是Java 虚拟机提供的机制,在所有支持Java虚拟机的平台上都可以应用本方法。2、保持了 Java虚拟机的通用性不需要修改源代码重新生成Java虚拟机。3、解密过程对用户透明解密过程被嵌入到了 Java虚拟机的类装载过程中,不保 存解密后的Java字节码文件。4、保证了解密过程的安全性使用Java虚拟机工具接口和Java本地接口编写的 程序(包括解密程序)全部编译为本机可执行的二进制代码。附图说明图1为本专利技术中与java虚拟机工具接口进行交互的时序图2为Java虚拟机的初始化过程其中图a为现有的Java虚拟机的初始化过程;图b为使用本专利技术方法时Java虚 拟机的初始化过程;图3为Java虚拟机加载Java字节码的过程其中图a为不使用本专利技术方法时Java虚拟机加载Java字节码的过程;图b为使 用本专利技术方法后Java虚拟机加载Java字节码的过程;图4是Java反编译软件对Java字节码文件的处理结果其中图a为Java反编译软件对没有经过本专利技术方法加密的Java字节码文件的处 理结果;图b为Java反编译软件对经本分明方法加密的Java字节码文件的处理结果。具体实施方式本专利技术的目的是提供一种在保持Java跨平台特性和不修改Java虚拟机基础上的 能够将解密过程嵌入到Java虚拟机的类装载过程中的方法。这种方法使解密过程对Java 软件的使用者完全透明,且Java程序的使用者无法得到解密后的Java字节码文件。本方 法的目的是通过下述的步骤实现的1使用加密算法对要发布的Java字节码文件进行加密。2使用Java虚拟机工具接口监听Java虚拟机初始化事件。3使用Java虚拟机工具接口为第1步中监听到的Java虚拟机初始化事件指定 Hook函数。这样在Java虚拟机初始化完成时会自动调用该Hook函数。4在第3步指定的Hook函数中使用Java本地接口将Java虚拟机在生成类对象时必然会调用的函数注册为自定义的一个代理函数,当Java虚拟机在生成某个类的对象 时,它会调用自定义的代理函数。5在第4步中注册的代理函数中对在第1步中加密过的Java字节码文件进行解 密处理。6将解密后的Java字节码文件生成相应的类对象后返回给Java虚拟机。本方法的关键点是第4步中如何确定Java虚拟机在生成类对象时必然会 调用的函数。通过对Java虚拟机源代码的分析可知加载用户自定义类的加载器为 AppClassLoader, AppClassLoader 继 7承于 URLClassLoader, URLClassLoader 继 7承于 SecureClassLoader, SecureClassLoader ^lI T^i ClassLoader0 · ClassLoader 中 类对象的函数中除defineclassO和define class2外其他都必须调用defineclassl,经 大量测试(即向Java虚拟机输入大量的Java字节码文件,然后分别在这三个函数中读取 这些Java字节码文件)表明在defineclassO中无法得到任何的Java字节码文件;在 defineclass2中能够得到极少数,只有在defineclassl中能够得到所有输入的Java字节 码文件。综合对源代码的分析及测试数据可以得出结论defineclassl是Java虚拟机在 生成类对象时必然会调用的函数。实施例在保持Java跨平台特性和不修改Java虚拟机基础上的能够将解密过程嵌入到 Java虚拟机的类装载过程中的方法。(1)创建一个动态链接库项目。(2)将Java虚拟机提供的Java虚拟机工具接口和Java本地接口相关的支持头文 件引入到第1步中建立的项目里。(3)在第1步中建立的项目里创建名为AgentJtaLoad的函数,在该函数中通过 GetEnv函数获取Java虚拟机工具接口环境。(4)通过jvmti接口函数向Java虚拟机预定VMInit事件的通知,并本文档来自技高网
...

【技术保护点】
一种防止Java程序被反编译的方法,其特征在于:包括以下步骤:1】采用加密算法对要发布的Java字节码文件进行加密;2】采用Java虚拟机工具接口监听Java虚拟机初始化事件;3】采用Java虚拟机工具接口为步骤2】中Java虚拟机监听到的Java虚拟机初始化事件指定Hook函数;4】Java虚拟机初始化完成时自动调用相应的Hook函数,并在的Hook函数中使用Java本地接口将Java虚拟机在生成类对象时调用的函数注册为自定义的代理函数;5】Java虚拟机在生成某个类对象时调用相应的自定义的代理函数,在自定义的代理函数中对在步骤1】中加密过的Java字节码文件进行解密处理;6】将解密后的Java字节码文件生成相应的类对象后返回给Java虚拟机。

【技术特征摘要】

【专利技术属性】
技术研发人员:张旻胡林平田丹贾璐
申请(专利权)人:中国航空工业集团公司第六三一研究所
类型:发明
国别省市:87[中国|西安]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1