扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
很少有问题比程序员遇到不访问无法利用的源代码就无法解决的漏洞更令人沮丧的了。
你是否在通过一个在线开源库修补代码,或正在调用常用操作系统例行程序;你可能每周都要花时间处理不是由你编写,因而也无法访问其源代码的代码。
因为Java字节码包含许多和原始代码相同的信息,所以很容易对Java类文件执行逆向工程。另外,Java程度以其“一旦编写,随处运行”特性而闻名。虽然并非Java语言的专利,但代码反编译从未在Java开发者之中得到如此公开或普遍地利用。反编译的对立面即为迷惑。
何为代码迷惑?
由于解译工具可以方便地从编译代码中提取源代码,因而我们很难对代码和其中的重大机密加以保护。和Java解译工具一样,Java迷惑工具也得到广泛应用,它实际上对你的代码使用障眼法。
代码迷惑是当前保护Java代码免遭逆向工程的最佳办法。代码迷惑使得软件难以理解,但在功能上仍然等同于原始代码。它还使得程序更难以理解,因而提高对逆向工程的抵抗力。
在图A中,一组类文件P通过迷惑工具变为另一组类文件P’。其结果是P的代码和P’的代码并不相同, P’代码比P代码更加难以理解,但二者的功能一样。
我们以从源代码(src1.java.txt)中提取的一段简单Java代码为例:
class OriginalHello {
public OriginalHello() {
int number=1;
}
public String getHello(String helloname){
return helloname;
}
使用最简单的迷惑工具(如KlassMaster)对这段代码执行代码迷惑后,这个类中的所有名称都变得杂乱无章,而且行号也不再存在。以下是执行代码迷惑后得到的代码(dst1.java.txt):
class a {
public static boolean a;
public a() {
int a=1;
}
public String a(String b){
return b;
}
从上面的例子中可以看到,Hello类已被代码迷惑工具KlassMaster变为a类,它们的方法,getHello(java.lang.String)也变成a(java.lang.String)。方法名a()比getHello()更难以理解。将最初的字节码和代码迷惑后的字节码进行比较,你还可以发现,代码迷惑后的字节码中已经没有行号。这为逆向工程提供更少的信息。
这个非常简单的代码迷惑实例仅打乱了标识符,去掉由编译工具生成的行号。现代的商业迷惑工具能够彻底地打乱代码的内容,使代码极其难以破解;但是,在这个领域,还有许多研究仍在进行之中。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者