第一章 流行的加密方式简介
关于 JAVA 程序的加密方式,一直以来都是以 JAVA 模糊处理(Obfuscator)为主。这方面的研究结果也颇多,既有模糊器(如现在大名鼎鼎的 JODE),也有针对反编译器的"炸弹"(如针对反编译工具 Mocha 的 "炸弹" Crema 和 HoseMocha)。模糊器,从其字面上,我们就可以知道它是通过模糊处理 JAVA 代码,具体的说,就是更换变量名,函数名,甚至类名等方法使其反编译出来的代码变得不可理解。举个例子来说吧。
先将将下面源代码编译成 class 文件。
public class test
{
int sortway;
void sort(Vector a)
{
……
}
void setSortWay(int way)
{
……
}
void sort(Vector a, int way)
{
……
}
}
后通过 JODE 进行模糊处理后,反编译过来后, 可能变成下列代码。
public class OoOoooOo0Oo0O
{
int OoOo0oOo0Oo0O;
void OoO0ooOo0Oo0O (Vector OoOoo0Oo0OoOO)
{
……
}
void OoOo00oOoOo0O (int Oo0oooOo0Oo0O)
{
……
}
void OoO0ooOo0Oo0O (Vector OoOoo0Oo0OoOO, int Oo0oooOo0Oo0O)
{
OoOo00oOoOo0O (Oo0oooOo0Oo0O);
OoO0ooOo0Oo0O (OoOoo0Oo0OoOO);
}
}
其实这只是做到了视觉上的处理,其业务逻辑却依然不变,加以耐心,仍是可以攻破的,如果用在用户身份验证等目的上,完全可以找到身份验证算法而加以突破限制。
而所谓的"炸弹"是针对反编译工具本身的缺陷,这种方法对于特定的反编译工具是非常有效的,然而到目前为止,还没有一个全能型的,对每一种反编译工具皆有效,其局限性是明显的!
另一种方法是采用 ClassLoader 加密。JAVA 虚拟机通过一个称为 ClassLoader 的对象装来载类文件的字节码,而 ClassLoader 是可以由 JAVA 程序自己来定制的。ClassLoader 是如何装载类的呢? ClassLoader 根据类名在 jar 包中找到该类的文件,读取文件,并把它转换成一个 Class 对象。该方法的原