这是一个不应该在开源社区出现的东西,但它的的确确是一个开源的项目,正像它的名字一样,Proguard,即Program Guard(程序卫士),它代表了开源的相对面--代码保护。
作为JAVA这样的高级语言,编译的产物只是相对源代码的一个概念而已,字节码虽然不像源代码那样易懂,但绝不是不可能进行反编译的,针对JAVA的反编译产品很多,如CAVAJ,JAD等等。面对反编译产品的不断出现,将代码视为财富的那些开发者,又何去何从。
混淆器正是在这种背景下应运而生,既然不可能完全地将拒绝反编译,那就让他们去反编译吧,只要反编译的结果别人不能直接使用不就行了吗?只要将代码搞混,让别人拿到了反编译的结果也看不懂,甚至不能编译。
混淆的方法有很多,主要是以下几方面。
更名,将私有类,私有的成员,方法体内部的变量名改名,改成a,b,c等等,甚至1,2,3(代码中不允许不等于成果物中不允许)
改变逻辑的流向,如将if条件取反,if/else对换
等价代码,如将循环改成GOTO
无效代码,插入不可及的无用代码
Proguard是一个非常优秀的开源的JAVA混淆器,可以在http://proguard.sourceforge.net/下载到,现在就让我一起来看一下Proguard.
以3.2版为例,释放压缩包,我们看到,作为开源项目就有docs,lib,src,sample文件夹,在此就不一一介绍了。
进入lib目录,内有proguard.jar,如果要自己有混淆器的外壳,或作ANT插件的话,会用到它,详细情况可以参考Proguard的文档。
我们要看的是proguardgui.jar,这是Proguard的图形界面,我们使用JDK打开,注意是JDK,不是JRE。
点选Input/Output标签,选择要混淆的JAR包(注意是JAR包),输出JAR包,以及用到的所有类库。
点选Obfuscation标签,选中不需要混淆的类(要被反射的类绝对不能被混淆)
点选Process标签,Process按钮,等着看结果吧。
Proguard中还包括了代码优化和代码整理的功能,不是本文讨论范围,有兴趣的就自己研究吧)
只混淆方面的选项
使用此种方式,如果a-z使用过,会转向aa.class,如下图配置界面
1,4,6,9,10,11,12
源代码
package org.zwm.pub;
public class Bru {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(showMsg());
}
public static String showMsg() {
return "You are my sun";
}
}
反编译后的代码
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
package org.zwm.pub;
import java.io.PrintStream;
public class Bru
{
public Bru()
{
}
public static void main(String args[])
{
System.out.println(PK0304140008000800fZ());
}
public static String PK0304140008000800fZ()
{
return "You are my sun";
}
}
类名不变化,方法名混淆。
另一个例子,希望对大家有帮助:
命令行下,运行ProGuard指令: java -jar proguard.jar @proguard.pro 其中proguard.pro文件中是指定的混淆信息。
例:一个swing应用:
-injars gimt.jar
-outjars gimt_out.jar
-libraryjars lib/rt.jar
-libraryjars lib/antlr/antlr-2.7.5H3.jar
-libraryjars lib/cglib/cglib-full-2.0.2.jar
-libraryjars lib/db2-connector/db2jcc_license_cu.jar
-libraryjars lib/dom4j/dom4j-1.5.2.jar
-libraryjars lib/encache/ehcache-1.1.jar
-libraryjars lib/hibernate/hibernate3.jar
-libraryjars lib/jakarta-common/commons-beanutils.jar
-libraryjars lib/log4j/log4j-1.2.9.jar
-libraryjars lib/mysql-connector/mysql-connector-java-3.0.17-ga-bin.jar
-libraryjars lib/spring/spring.jar
-libraryjars lib/db2-connector/db2jcc.jar
-libraryjars lib/jakarta-common/commons-collections-2.1.1.jar
-libraryjars lib/jakarta-common/commons-dbcp-1.2.1.jar
-libraryjars lib/jakarta-common/commons-lang-2.0.jar
-libraryjars lib/jakarta-common/commons-logging-1.0.4.jar
-libraryjars lib/jakarta-common/commons-pool-1.2.jar
-libraryjars lib/spring/spring-mock.jar
-libraryjars lib/j2ee/jta.jar
-libraryjars lib/db2-connector/db2java.zip
-printmapping proguard.map
-overloadaggressively
-defaultpackage ''
-allowaccessmodification
-dontoptimize
-keep public class com.wisdom.tool.MainFrame {
public static void main(java.lang.String[]);
}
-keep class * extends javax.swing.plaf.ComponentUI {
public static javax.swing.plaf.ComponentUI createUI(javax.swing.JComponent);
}
-keep public class com.wisdom.model.user.* {
*;
}
-keep public class com.wisdom.service.* {
*;
}
-keep public class com.wisdom.service.impl.MenuServiceImpl
一点说明:
1. 开始没有加-dontoptimize选项,有时可能会出问题,上面已经提到。
2. 列出了所有依赖的.jar包。
3. keep选项告诉proguard,那些不必混淆。
a. 对于swing应用,整个程序的入口,不能混淆。
b. 对于继承自ComponentUI的类,createUI不能混淆。
c. 利用hibernate的领域对象 spring的服务对象,由于用到了反射机制。
android 混淆(三)
最新推荐文章于 2024-08-22 13:57:01 发布