android 混淆(三)

这是一个不应该在开源社区出现的东西,但它的的确确是一个开源的项目,正像它的名字一样,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的服务对象,由于用到了反射机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值