这是一个不应该在开源社区出现的东西,但它的的确确是一个开源的项目,正像它的名字一样,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混淆打包不混淆第三方jar包Android 混淆打包不混淆第三方jar包
在 android studio 使用自定义混淆字典进行混淆,增加app被反编译后阅读的难度, 内容为16位由0,o,O,3个字符生产的如OoO0oOoOoO0O0oO0这样的不重复字符串,使用方式:将下载的dictoO0.txt放在proguard-rules.pro同级...
Android Studio默认集成了ProGuard工具,它是Android混淆的核心。ProGuard不仅可以混淆代码,还能优化、压缩和删除未使用的类和方法。 标题提到的“android 混淆 去除第三方jar”,意味着我们需要处理包含在项目中...
Android混淆工具就是用来提升应用程序安全性的一种手段,它能够有效地保护代码不被逆向工程分析,降低恶意攻击的风险。本篇将详细介绍Android混淆工具,尤其是其中的经典工具ProGuard。 Android混淆工具的主要功能...
本文将详细介绍如何在Android Studio中将多个Module混淆并打包成一个Jar文件。 1. **创建Module** 首先,确保你已经拥有多个独立的Android Studio Module。每个Module代表一个独立的功能或库。在Android Studio中,...
现在,让我们来看看这个名为"资源混淆工具"的第三方工具。这个工具可能提供以下功能: 1. 自动化资源重命名:工具能够自动扫描并重命名应用中的所有资源文件,使用随机生成的字母数字组合,使得资源名称变得难以...
Android混淆技术是Android应用开发者用于提升应用安全性的重要手段,主要目的是为了防止应用被反编译。在移动应用领域,反编译是一个常见的问题,特别是在应用包含敏感数据或者进行商业运营时,防止代码泄露变得尤为...
本文将详细解析Android混淆配置的相关知识点,包括混淆的目的、配置原理、常用配置指令以及注意事项。 混淆的目的: 1. **保护代码安全**:混淆可以将源代码中的类名、方法名和变量名转化为无意义的简短名称,使得...
在Android SO文件保护中,混淆主要涉及以下几个方面: 1. **JNI方法名混淆**:JNI(Java Native Interface)是Java与原生代码交互的桥梁。在描述中提到的"JNI方法名混淆",就是将原本易于理解的JNI方法名改写为无...
在这个"Android混淆编译Demo"中,我们将深入探讨如何在Android Studio 3.1.2环境下进行混淆配置和编译。 首先,混淆是通过ProGuard工具实现的,它是一个Java字节码混淆器、优化器和裁剪器。在Android Studio中,...
Android JAR 包混淆详解 Android JAR 包混淆是一种保护 Java 代码的方式,它可以将 JAR 包中的代码混淆,使得攻击者无法轻易地反编译和盗用代码。混淆过程中,需要使用 ProGuard 工具,该工具可以将 JAR 包中的代码...
直接复制这个到Android项目中即可使用,只需要添加项目中用到的第三方的混淆规则即可,如果有自己的需要最好修改一下,不修改也无大碍
在Android开发过程中,为了保护应用的安全性和代码的私密性,开发者通常会使用混淆工具(如ProGuard或R8)对APK进行混淆,混淆后的代码难以阅读和理解,但这也给调试和后期维护带来了困难。当我们需要查看混淆后的...
### Android签名混淆打包详解 #### 一、签名与混淆打包的重要性 在Android应用开发过程中,签名与混淆打包是非常重要的步骤。签名确保了应用的身份唯一性和后续版本更新的一致性,而混淆则增强了应用的安全性,保护...
在Android开发中,打包混淆是一个重要的步骤,它通过修改应用代码的方式来使得应用代码难以理解,从而达到保护应用的目的。混淆不仅可以防止恶意用户轻易地阅读和理解应用的源代码,还可以减小应用的体积,并且可以...
在Android应用开发中,为了提高应用的安全性和优化代码体积,开发者常常会进行代码混淆和打包。ProGuard是一款强大的Java字节码混淆、优化、预校验和分析工具,它可以为我们的Android项目提供必要的保护,防止恶意...
在Android开发过程中,为了保护应用的安全性和防止反编译,开发者常常会进行代码混淆这一重要步骤。本文将深入探讨Android代码混淆的前因后果、原理以及如何实施。 首先,我们来理解什么是代码混淆。代码混淆是将源...
#### 三、代码混淆步骤详解 根据提供的内容,我们将详细介绍如何进行Android项目的代码混淆设置。 ##### 1. 修改Android.mk文件 - **路径定位**:首先定位到需要混淆的模块目录。例如,在短信应用模块,路径为`...
在Android开发中,Gson库是一个非常常用的工具,...参考博文:[链接](https://ujs-lifazhu.iteye.com/blog/1750820)提供了更多关于在Android项目中处理Gson混淆问题的详细步骤和示例,建议详细阅读以获取更深入的理解。
在Android开发中,代码混淆是一项重要的安全措施,用于保护应用源码不被轻易逆向工程解析。本篇文章将深入探讨Android代码混淆配置的细节,帮助开发者理解如何有效地使用这一技术。 混淆是通过重命名类、方法和变量...