这是一个不应该在开源社区出现的东西,但它的的确确是一个开源的项目,正像它的名字一样,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 搅混(三)
热度:31 发布时间:2016-05-01 17:07:27.0
相关解决方案
- android 读取byte[]中的元素解决方案
- android 标题栏兑现方式
- android 中Activity向BroadcastReceiver发送数据,该怎么解决
- Android 4.0 为什么模拟器老是提示小弟我谷歌拼音输入法已停止
- android:getSharedPreferences() 这是哪个类的方法解决思路
- android 怎么判断一个程序是否联网
- android 大量数据按周分组,该如何解决
- android RadioButton如何设置默认选中
- ksoap2-android-这个包,连接webService怎么设置超时
- android 怎么重新设置锚点
- android UI界面设计解决方案
- android 图片对象获取的有关问题
- android 怎么调用淘宝支付宝接口
- Android 沿袭InputMethodService自定义输入法
- android 关于服务连接的疑义
- android 两个activity如何通信
- android 怎么实现对view的放大和缩小
- android 教程解决方法
- android ID,该如何处理
- 准备复习2-3个月,看java+android,请问有经验者,怎么看效果最好》
- android UI线程与AsyncTask的有关问题
- android(java)中的java.net能不能和c#的system.net.sockets进行tcp通信,该如何解决
- android ListView 中的onItemClick Intent 没法跳转
- android(java) 中文乱码的有关问题
- c#c++,android,ios(iphone),php,java视屏课程 散分
- android Post文件到ASP.NET的有关问题,能收到参数收不到文件
- RIM 替 Android 开发者提供免费的 PlayBook!2月13日前
- android 动态设立控件高度
- Android test project 编译方法
- android -相机使用教程(1)解决方法