当前位置: 代码迷 >> Android >> android 搅混(三)
  详细解决方案

android 搅混(三)

热度:31   发布时间:2016-05-01 17:07:27.0
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的服务对象,由于用到了反射机制。

  相关解决方案