java字节码加密_深⼊Java字节码加密
问:
如果我把我的class⽂件加密,在运⾏时⽤指定的类加载器(class loader)装⼊并解密它,这样⼦能防⽌被反编译吗?
答:
防⽌JAVA字节码反编译这个问题在java语⾔雏形期就有了,尽管市⾯上存在⼀些反编译的⼯具可以利⽤,但是JAVA程序员还是不断的努⼒寻新的更有效的⽅法来保护他们的智慧结晶。在此,我将详细给⼤家解释这⼀直来在论坛上有争议的话题。
Class⽂件能被很轻松的重构⽣成JAVA源⽂件与最初JAVA字节码的设计⽬的和商业交易有紧密地联系。另外,JAVA字节码被设计成简洁、平台独⽴性、⽹络灵活性,并且易于被字节码解释器和JIT (just-in-time)/HotSpot 编译器所分析。可以清楚地了解程序员的⽬的, Class⽂件要⽐JAVA源⽂件更易于分析。
如果不能阻⽌被反编译的话,⾄少可以通过⼀些⽅法来增加它的困难性。例如: 在⼀个分步编译⾥,你可以打乱Class⽂件的数据以使其难读或者难以被反编译成正确的JAVA源⽂件,前者可以采⽤极端函数重载,后者⽤操作控制流建⽴控制结构使其难以恢复正常次序。有更多成功的商业困惑者采⽤这些或其他
的技术来保护⾃⼰的代码。
不幸的是,哪种⽅法都必须改变JVM运⾏的代码,并且许多⽤户害怕这种转化会给他们的程序带来新的Bug。⽽且,⽅法和字段重命名会调⽤反射从⽽使程序停⽌⼯作,改变类和包的名字会破坏其他的JAVA APIS(JNDI, URL providers, etc),除了改变名字,如果字节码偏移量和源代码⾏数之间的关系改变了,在恢复这有异常的堆栈将很困难。
于是就有了⼀些打乱JAVA源代码的选项,但是这将从本质上导致⼀系列问题的产⽣。
加密⽽不打乱
或许上述可能会使你问,假如我把字节码加密⽽不是处理字节码,并且JVM运⾏时⾃动将它解密并装⼊类加载器,然后JVM运⾏解密后的字节码⽂件,这样就不会被反编译了对吗?
考虑到你是第⼀个提出这种想法的并且它⼜能正常运⾏,我表⽰遗憾和不幸,这种想法是错误的。java源代码加密
下⾯是⼀个简单的类编码器:
为了阐明这种思想,我采⽤了⼀个实例和⼀个很通⽤的类加载器来运⾏它,该程序包括两个类:
public class Main
{
public static void main (final String [] args)
{
System.out.println ("secret result = " + SecretAlgorithm ());
}
} // End of class
package de;
import java.util.Random;
public class MySecretClass
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论