java的源代码隐藏
下面这段话摘自《Java手机/PDA编程入门》一书,可以作为混淆器性能的概观:
我没有用过DashO,所以无法对它进行个人评价。所以我现在只说明我用过的产品。从作者个人角度来说,ZKM是最好的,JAX居中,RetroGuard和ProGuard最差,一分钱一分货是永恒的真理。如果说ZKM和JAX在功能性方面都不错的话,然而JAX是IBM开发的产品,所以它也继承了大部分IBM产品的最大特点,就是“超级功能,但是不好用”。仅仅阅读JAX的配置文件可能是一个大问题。
下面介绍几种有代表性的混淆器,并对它们的产品性能进行比较。我们使用不同的混淆器对同一个java代码进行混淆,分别列出混淆后代码反编译的结果,并给出一些直接的使用体验。
原始java代码:
公共类SimpleBean实现Serializable {
private String[] name = {"name0 "," name1 "," name2 "," name 3 " };
个人分发名单myList = null
public void SimpleBean() {
my list = new ArrayList(4);
}
public void init_public() {
my list . add(" name ");
for(int I = 1;我& lt4;i++){
init _ private(I);
}
}
private void init_private(int j) {
my list . add(name[j]);
}
私有void writeObject(Java . io . object output stream out)
引发IOException {
}
}
一. ProGuard 4.5.1
ProGuard是一个免费的Java类文件压缩器、优化器和混淆器。它可以找到并删除无用类、字段、方法和属性。它还可以优化字节码,删除无用的指令。最后,它用简单无意义的名字给你的类名、字段名、方法名重新命名。经过以上操作,jar文件会变小,很难逆向工程。Eclipse集成了Proguard。它支持脚本控制,GUI界面,未加密字符串和J2ME。
具有类似功能的开源混淆器:
逆向守卫伊瓜德(逆向守卫的升级版)JODE
Jad反编译从混淆类获得的代码:
公共类SimpleBean
实现可序列化
{
公共SimpleBean()
{
a _ java _ util _ List _ fld = null
}
public void SimpleBean()
{
a _ Java _ util _ List _ fld = new ArrayList(4);
}
public void init_public()
{
a _ Java _ util _ List _ fld . add(" name ");
for(int I = 1;我& lt4;i++)
{
int j = I;
SimpleBean simplebean = this
a _ Java _ util _ List _ fld . add(simple bean . a _ Java _ lang _ String _ array 1d _ fld[j]);
}
}
私有字符串a _ Java _ lang _ String _ array 1d _ fld[]= {
"名称0 ","名称1 ","名称2 ","名称3 "
};
私有列表a _ java _ util _ List _ fld
}
优势:
1,内部私有方法调用内联,但基本达不到混淆效果;
2.文档使用详细,有很多混淆选项配置文件的例子;
3.混淆选项的粒度很细,GUI界面可以用来支持本地方法的保护。
4.支持j2me,可以集成到Eclipse中;;
5.开源。
缺点:
1,符号混淆名称有提示性,字符串不加密,没有其他混淆措施;
2.混淆主要针对Xlet、Midlet等应用,库文件混淆时配置文件会很复杂。
第二,诙谐
JOCky是金蝶中间件(原名Joc)技术负责人袁红岗先生的个人作品。本来是方便开发Apusic应用服务器,现在开放给大家免费使用。Jocky混淆编译器是在Sun JDK提供的Java编译器(javac)的基础上完成的。修改代码生成过程,对编译器生成的中间代码进行混淆,最后生成类文件,这样编译和混淆只需一步完成。换句话说,它直接从源代码上做文章,这是Jocky与其他令人困惑的编译器的最大区别。此外,可以在源程序中插入符号保留指令来控制需要保留哪些符号,混淆过程可以与开发过程集成,而不需要单独的混淆选项配置文件。Jocky的上述特点更适合java类库的混乱。
Jad反编译从混淆类获得的代码:
公共类SimpleBean
实现可序列化
{
公共SimpleBean()
{
这个;
String as[]= new String[4];
as;
as[0]= " name 0 ";
as;
JVM INSTR交换;
1;
”name 1”;
JVM INSTR aastore
JVM指令dup
JVM INSTR交换;
2;
”名称2”;
JVM INSTR aastore
JVM指令dup
JVM INSTR交换;
3;
”名称3”;
JVM INSTR aastore
_$2;
_ $ 1 = null;
返回;
}
public void SimpleBean()
{
这个;
JVM INSTR new # 9 & lt类数组列表& gt;
JVM指令dup
JVM INSTR交换;
4;
ArrayList();
_$1;
}
public void init_public()
{
_ $ 1 . add(" name ");
for(int I = 1;我& lt4;i++)
_ $ 1㈠;
}
私有void _$1(int i)
{
_ $ 1 . add(_ $ 2[I]);
}
私有void writeObject(object output stream object output stream)
抛出IOException
{
}
私有字符串_ $ 2[];
私信列表_ $ 1;
}
优势:
1,除了符号混淆,还增加了数据混淆(字符数组初始化);
2.有些语句只能通过反编译得到字节码指令;
3.在孙JDK提供的Java编译器(javac)基础上完成,编译和混淆一次完成,不需要生成一个类文件再混淆;
4.提供了一个Eclipse的插件,可以在Eclipse中直接使用Jocky。
缺点:
1,混淆选项粒度较粗,可能需要在具体代码中添加@preserve指令才能实现,工作量较大;
2.没有控制流混淆。
三。阿拉托里3.1 _演示
阿拉托里属于第二代混淆器,有能力全方位保护你的知识产权。Allatori有以下保护方法:命名混淆、流混淆、调试信息混淆、字符串编码和水印技术。这个混淆器是免费的教育和非商业项目。版本2.1支持war和ear文件格式,并允许向需要混乱代码的应用程序添加生效日期。
Jad反编译从混淆类获得的代码:
公共类SimpleBean
实现可序列化
{
public void init_public()
{
d . add(c . k(" { u { 0 "));
int I = 1;
goto _L1
_L3:
h(一);
++ I;
_L1:
4;
JVM INSTR icmplt 21;
去L2 L3
_L2:
}
public void SimpleBean()
{
d =新数组列表(4);
}
私有void H(int a)
{
d . add(c[a]);
}
公共SimpleBean()
{
d =空;
}
私有void H(object output stream object output stream)
抛出IOException
{
}
私有字符串c[] = {
c.k("\177q\177te "),c.k("\177q\177td "),c.k("\177q\177tg "),c.k("\177q\177tf ")
};
私人名单d;
}
注意:c.k是C类的一个静态方法,是为字符串加密额外生成的。
优势:
1,设计考虑了库文件混淆的使用场景;
2.文档使用详细,有很多混淆选项配置文件的例子;
3.除了符号混淆,还使用了两种高级混淆方法:控制混淆(为循环重写)和字符串加密(字符串数组初始化);
4.混淆选项的粒度很细,支持局部方法的保护。
5.支持水印技术,允许在需要混淆的代码中添加生效日期;
6.支持j2me;
缺点:
1,商业软件(价格附后),教育和非商业用途免费(网址链接为/price.html)。
附:价格情况
单一开发者许可证
1许可证290美元
2-5个许可证260美元
6-10许可证230美元
11+许可证200美元
网站许可证3750美元
营业执照4850美元
年度支持更新45美元
第四,泽利克斯·克拉斯马斯特(ZKM)
Zelix KlassMaster是来自Zelix Pty Ltd的商业混淆器,在官方文档中很少介绍它的混淆功能。其保护功能非常强大,可以进行符号混淆和控制混淆,支持字符串、堆栈混淆、异常重构、增量混淆和J2ME的复杂加密保护。Zelix KlassMaster提供了一个试用版,可以从。
动词 (verb的缩写)DashO Pro
DashO Pro是由Preemptive Solutions开发的商业混淆器。可以下载免费的评估版。DashO Pro代码保护强大易用,方便灵活(商业软件,非开源)。这个Java混淆器是Sun的选择。对于企业应用程序,作为其Java开发包的一部分,Sun Microsystems使用DashO Pro来混淆其加密库。Dashoporo可以重命名ID,使其成为无意义的字符;混乱的元数据;改变控制流等。,所有这些操作都让java代码混乱难懂。产品特性包括:
领先的Java源代码保护机制;
使用获得专利的重载诱导技术重命名包/类/方法/域;
先进的过程控制混淆机制;
字符串加密技术;
阻止反编译器生成有用的输出;
水印软件;
提高Java源代码的效率;
不带类/方法/域完全删除常量存储库;
在类/方法级别优化以提高JIT效果;
动态加载检测到的类;
全面高效的Java源代码扩展和部署;
支持包括1.5在内的所有JDK版本(JSE、J2EE、J2ME等);
自动堆栈跟踪转换;
指定路径中的包或javajars
支持任何打包的Java内容——程序、库、小应用程序、小服务器程序、EJB等。支持J2ME CLDC架构,包括MIDP和iAppli;
CLDC预检图书馆支持类;
可以从指定的路径、Zip压缩包或jars中提取;
支持导出100%纯Java,并提供验证;
命令行界面适合集成到构建环境中;
基于XML的配置文件,简单易用;
全面准确的PDF格式用户指南。