Java代码加密与反编译(一):利用混淆器工具proGuard对jar包加密

Java 代码编译后生成的 .class 中包含有源代码中的所有信息(不包括注释),尤其是在其中保存有调试信息的时候。所以一个按照正常方式编译的 Java .class 文件可以非常轻易地被反编译。通常情况下,反编译可以利用现有的工具jd-gui.exe或者jad.exe。

   有些情况下,为了保护java源码不被别人看到,通常会使用加密手段对java源码进行加密,加密的方式可以利用加密工具(比如java代码混淆工具)、使用加密算法(如DES算法)修改classloader对编译好的.class文件进行加密。

(注:这里推荐一款java代码混淆器,可以混淆函数变量、类、方法名以实现代码加密:proGuard:

一、用java混淆器工具proGuard实现加密

这里使用proGuard对jar包进行加密。

1. 解压下载的proguard,解压后进入lib文件把proguard.jar拷贝到自己新建的文件夹里如图:

image

2. 把需要混淆的jar和jar所依赖的包也放到新建的文件夹,都放在一起,如下图。

image

3. 写一个配置文件,名称自己定,例如”a”文件,举个简单配置文件例子(那个proguard.map是过后自己生成的),内容如下,其中-injars:是你需要混淆的jar,-outjars:是你混淆后输出的jar,-libraryjars:是你混淆的jar需要所依赖的jar包,后面的不在一一说明,可以参考proguard文档,配置文件可以参考文档来对自己混淆的需求来写配置文件。

-injars TheFirstDesktopApplication1.jar

-outjars TheFirstDesktopApplication1_out.jar

-libraryjars <java.home>/lib/rt.jar

-libraryjars appframework-1.0.3.jar

-libraryjarsswing-worker-1.1.jar

-printmappingproguard.map

-overloadaggressively

-defaultpackage ''

-allowaccessmodification

-dontoptimize

-keep public class*

{

public protected *;

}

-keep public classorg.**

-keep public classit.**

4. 把配置文件保存到你建的文件夹下,如下图。

image

5.点击开始,运行,输入cmd,进入你建的文件夹下,如下图。

image
  1. 然后输入命令语句:java -jarproguard.Jar @a 然后回车,如下图。
image
  1. 混淆成功,在产生TheFirstDesktopApplication1_out.jar如下图。
image
  1. 混淆器后,利用反编译器jad对没TheFirstDesktopApplication1_out.jar反编译,多了好多a,b,c之类的类文件,对反编译的java文件是很难编译的,即说明混淆成功。

用上面方法试了一下,发现其实混淆效果并不好,使用jd-gui反编译工具就可以轻易看到源码。总结一下,网上找了几个代码混淆工具效果都不好,其实现成工具看来也并不是那么好用。

然后想想,就换了一种方式,直接使用加密算法对java代码进行解密。在下篇文章里再写。

ProGuard是一个免费的java类文件压缩,优化,混淆器.它探测并删除没有使用的类,字段,方法和属性.它删除没有用的说明并使用字节码得到最大优化.它使用无意义的名字来重命名类,字段和方法.

ProGuard的作用:

1.创建紧凑的代码文档是为了更快的网络传输,快速装载和更小的内存占用.
2.创建的程序和程序库很难使用反向工程.
3.所以它能删除来自源文件中的没有调用的代码
4.充分利用java6的快速加载的优点来提前检测和返回java6中存在的类文件.

**参数: **

  1. -include {filename} 从给定的文件中读取配置参数
  2. -basedirectory {directoryname} 指定基础目录为以后相对的档案名称
  3. -injars {class_path} 指定要处理的应用程序jar,war,ear和目录
  4. -outjars {class_path} 指定处理完后要输出的jar,war,ear和目录的名称
  5. -libraryjars {classpath} 指定要处理的应用程序jar,war,ear和目录所需要的程序库文件
  6. -dontskipnonpubliclibraryclasses 指定不去忽略非公共的库类。
  7. -dontskipnonpubliclibraryclassmembers 指定不去忽略包可见的库类的成员。

**保留选项 **

  1. -keep {Modifier} {class_specification} 保护指定的类文件和类的成员
  2. -keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好
  3. -keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。
  4. -keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)
  5. -keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除)
  6. -keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)
  7. -printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件

**压缩 **

  1. -dontshrink 不压缩输入的类文件
  2. -printusage {filename}
  3. -whyareyoukeeping {class_specification}

**优化 **

  1. -dontoptimize 不优化输入的类文件
  2. -assumenosideeffects {class_specification} 优化时假设指定的方法,没有任何副作用
  3. -allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员

**混淆 **

  1. -dontobfuscate 不混淆输入的类文件
  2. -printmapping {filename}
  3. -applymapping {filename} 重用映射增加混淆
  4. -obfuscationdictionary {filename} 使用给定文件中的关键字作为要混淆方法的名称
  5. -overloadaggressively 混淆时应用侵入式重载
  6. -useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆
  7. -flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中
  8. -repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中
  9. -dontusemixedcaseclassnames 混淆时不会产生形形色色的类名
  10. -keepattributes {attribute_name,...} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.
  11. -renamesourcefileattribute {string} 设置源文件中给定的字符串常量

Ant Example:

 < !-- This Ant build file illustrates how to process applications,  
      by including ProGuard-style configuration options.  
      Usage: ant -f applications2.xml -->  
   
<project name="Applications" default="obfuscate" basedir="../..">  
   
< target name="obfuscate">  
   <taskdef resource="proguard/ant/task.properties"  
            classpath="lib/proguard.jar" />  
   
  <proguard>  
   
    <!-- Specify the input jars, output jars, and library jars. -->  
   
    -injars  in.jar  
     -outjars out.jar  
   
    -libraryjars ${java.home}/lib/rt.jar  
     <!-- -libraryjars junit.jar    -->  
     <!-- -libraryjars servlet.jar  -->  
     <!-- -libraryjars jai_core.jar -->  
     <!-- ...                       -->  
   
    <!-- Save the obfuscation mapping to a file, and preserve line numbers. -->  
   
    -printmapping out.map  
     -renamesourcefileattribute SourceFile  
     -keepattributes SourceFile,LineNumberTable  
   
    <!-- Preserve all annotations. -->  
   
    -keepattributes *Annotation*  
   
    <!-- Preserve all public applications. -->  
   
    -keepclasseswithmembers public class * {  
         public static void main(java.lang.String[]);  
     }  
   
    <!-- Preserve all native method names and the names of their classes. -->  
   
    -keepclasseswithmembernames class * {  
         native <methods>;  
     }  
   
    <!-- Preserve the methods that are required in all enumeration classes. -->  
   
    -keepclassmembers class * extends java.lang.Enum {  
         public static **[] values();  
         public static ** valueOf(java.lang.String);  
     }  
   
    <!-- Explicitly preserve all serialization members. The Serializable  
          interface is only a marker interface, so it wouldn't save them.  
          You can comment this out if your library doesn't use serialization.  
          If your code contains serializable classes that have to be backward  
          compatible, please refer to the manual. -->  
   
    -keepclassmembers class * implements java.io.Serializable {  
         static final long serialVersionUID;  
         static final java.io.ObjectStreamField[] serialPersistentFields;  
         private void writeObject(java.io.ObjectOutputStream);  
         private void readObject(java.io.ObjectInputStream);  
         java.lang.Object writeReplace();  
         java.lang.Object readResolve();  
     }  
   
    <!-- Your application may contain more items that need to be preserved;  
          typically classes that are dynamically created using Class.forName -->  
   
  </proguard>  
 < /target>  
   
< /project> 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • 混淆规则 因为Android是使用Java开发的,所以开发者可以使用ProGuard对代码进行混淆。SDK已经集成...
    CarlosLynn阅读 1,510评论 0 0
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,693评论 0 3
  • 最近抽空研究了下android 加壳技术,发现关于加壳的源代码特别少,即使有也不能做到版本兼容,问题又特别多,对a...
    悠悠我思阅读 1,619评论 0 3
  • 声明 这篇文章更多的是做一个整理,内容来自于ProGuard官方文档以及各种博客等,相关文章的链接在参考目录里,感...
    夷陵小祖阅读 3,675评论 0 23
  • 最近发生了一些事,让我对宗教信仰和人的信仰这两方面得到一些新的认知,首先学佛的人不一定良善,她们有的人只是...
    新月和飞鸟阅读 560评论 0 0