一种Java字节码保护技术的研究和实现
2012-07-25吴芳
吴 芳
(陕西省纺织科学研究所,西安710038)
1 引言
C/C++等编程语言开发的程序被编译成本机可执行的二进制代码。编译器用内存地址代替了程序中的变量名称、方法名称等信息。因此对这些本地二进制代码进行反编译从而得到源代码是非常困难,甚至是不可能的。
Java是一种跨平台的解释型语言。Java编译工具将Java源代码编译成为class文件(即Java字节码),由 Java 虚拟机(Java Virtual Machine,JVM)负责对class文件进行解释执行。与本地目标代码不同,class文件中仍然保留了方法名称、变量名称,并且通过这些名称来访问变量和方法,这些符号往往带有许多语义信息。因此,对class文件进行反编译就显得比较容易。目前,市场上有许多Java的反编译工具,有免费的,也有商用的,还有的是开放源代码的。这些工具都能够从class文件生成高质量源代码。所以,如何保护Java程序就变成了一个非常重要的挑战。
2 Java字节码保护技术的现状
目前主要有如下几种Java字节码保护技术:隔离Java程序、字节码混淆、转换本地代码、数字水印、自定义类加载器等。
隔离Java程序是指将关键的class文件放在服务器端,客户端通过访问服务器的相关接口来获得服务,而不是直接访问class文件。这样黑客就没有办法反编译 class文件[1]。HTTP、Web Service、RPC等标准和协议都能够支持通过接口提供服务。但是有很多应用都不适合这种保护方式,例如对于单机运行的程序就无法隔离Java程序。
字节码混淆主要是通过将定义的类、变量、方法和包的名字改为无意义的字符串、使用非法的字符代替变量符号和在软件中添加一些无关的指令或永远执行不到的指令[2]等手段来增加反编译和对反编译后源代码阅读的难度。……
