由于Java字节码的抽象级别较高,因此它们较容易被反编译。下面介绍了几种常用的方法,用于保护Java字节码不被反编译。通常,这些方法不能够绝对防止程序被反编译,而是加大反编译的难度而已,因为这些方法都有自己的使用环境和弱点。
1.隔离Java程序
最简单的方法就是让用户不能够访问到Java Class程序,这种方法是最根本的方法,具体实现有多种方式。例如,开发人员可以将关键的Java Class放在服务器端,客户端通过访问服务器的相关接口来获得服务,而不是直接访问Class文件。这样黑客就没有办法反编译Class文件。目前,通过接口提供服务的标准和协议也越来越多,例如 HTTP、Web Service、RPC等。但是有很多应用都不适合这种保护方式,例如对于单机运行的程序就无法隔离Java程序。
2.对Class文件进行加密
为了防止Class文件被直接反编译,许多开发人员将一些关键的Class文件进行加密,例如对注册码、序列号管理相关的类等。在使用这些被加密的类之前,程序首先需要对这些类进行解密,而后再将这些类装载到JVM当中。这些类的解密可以由硬件完成,也可以使用软件完成。
在实现时,开发人员往往通过自定义ClassLoader类来完成加密类的装载(注意由于安全性的原因,Applet不能够支持自定义的ClassLoader)。自定义的ClassLoader首先找到加密的类,而后进行解密,最后将解密后的类装载到JVM当中。在这种保护方式中,自定义的ClassLoader是非常关键的类。由于它本身不是被加密的,因此它可能成为黑客最先攻击的目标。如果相关的解密密钥和算法被攻克,那么被加密的类也很容易被解密。
3.转换成本地代码
将程序转换成本地代码也是一种防止反编译的有效方法。因为本地代码往往难以被反编译。开发人员可以选择将整个应用程序转换成本地代码,也可以选择关键模块转换。如果仅仅转换关键部分模块,Java程序在使用这些模块时,需要使用JNI技术进行调用。当然,在使用这种技术保护Java程序的同时,也牺牲了Java的跨平台特性。对于不同的平台,我们需要维护不同版本的本地代码,这将加重软件支持和维护的工作。不过对于一些关键的模块,有时这种方案往往是必要的。为了保证这些本地代码不被修改和替代,通常需要对这些代码进行数字签名。在使用这些本地代码之前,往往需要对这些本地代码进行认证,确保这些代码没有被黑客更改。如果签名检查通过,则调用相关JNI方法。
4.代码混淆
代码混淆是对Class文件进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能(语义)。但是混淆后的代码很难被反编译,即反编译后得出的代码是非常难懂、晦涩的,因此反编译人员很难得出程序的真正语义。从理论上来说,黑客如果有足够的时间,被混淆的代码仍然可能被破解,甚至目前有些人正在研制反混淆的工具。但是从实际情况来看,由于混淆技术的多元化发展,混淆理论的成熟,经过混淆的Java代码还是能够很好地防止反编译。下面我们会详细介绍混淆技术,因为混淆是一种保护Java程序的重要技术。
② 反编译出来的java文件有错误,请问怎么改
这个反编译的程序 相当于自己写的程序的 你这样包装改就对了try{File log = new File(System.getProperty("server.root"), file); fw = new FileWriter(log, true); bw = new BufferedWriter(fw); pw = new PrintWriter(bw, true); }catch(IOException){}return;}
③ java反编译工具 出了问题 该怎么办
可以将看不懂的.class文件转换成看得懂的.java文件,这样一来就能很方便的读懂别人编写的java代码。
java反编译工具有多种,推荐使用jd-gui
④ 为什么将class反编译为java后,java直接编译时有错误
midlet不存在? 如果你用的是Eclipse那你在配置环境时有问题 没关联EclipseMe 和关联WTK MIDletStateChangeException应该是有异常
反编译的软件一般都会使用如a b c之类的变量名 导致很多类的情况下容易重名导致变量混乱 最好改成自己习惯的变量名
至于环境变量的配置按这个来
右键点击我的电脑--->属性--->高级--->环境变量--->系统变量--->新建
path: C:\j2sdk1.4.2_05\bin
classpath: .;C:\j2sdk1.4.2_05\lib\dt.jar;C:\j2sdk1.4.2_05\lib\tools.jar 确定
改了还不行的话把代码贴出来看看 祝你走运~~~
⑤ java 代码反编译错误
换个软件试试。可能原代码已加密,你需要能解密的反编译软件去编译。
⑥ java 反编译中出现的问题,请高手虾米指教:
The class file version is 50.0 <only 45.3 and 46.0 are supported
对呀这句话不就说得很明白了吗, 你的class是50.0
而jad只支持45.3 到 46.0
⑦ 为什么Java反编译后带有汇编代码
那个不是汇编。。。是反编译工具无法识别的字节码(bytecodes,java中间代码),因为无法识别,自然只能直接把字节码打出来给你看了。
你多试几种反编译工具,并不是所有的都会出的,也不是所有的都在同一个地方出。这个取决于反编译工具的作者对字节码的理解。
⑧ JAVA的环境变量java_home,PATH, CLASSPATH,按要求设置了,apk反编译时但还是不行,求解决
确定都是32bit或者都是64bit。
使用javac -version来确定java版本。
删除之前的JDK之后需要删除相关的环境变量。
这个软件我没有过,可能是固有漏洞或者需要修改其配置文件。
⑨ java问题:为什么有些class文件反编译不了
private 的属性 方法不会被反编译出来的。
还有就是某些class是作者用自己的编译器编译的.你也反编译不出来
还有就是加密了.
⑩ Java反编译后得到的不是Java源代码。
估计你得到的是java虚拟机指令,因为.class文件与java源代码不是一一对应的,但与虚拟机指令却是一一对应的,就像exe文件中的机器指令与汇编指令是一一对应的,要看懂这些代码可以参考java虚拟机指令集