关于如何对Android代码进行混淆的教程

移动开发 Android
对apk进行反编译,可以很容易的得到java代码,导致辛辛苦苦编写的程序代码泄露,我想这是程序员不愿意看到的结果,这里分享如何对Android代码进行混淆的教程,希望对你有所帮助。

apk直接可以 解压,然后很容易的就可以反编译出.java,找了找,果然,这一切只不过是 一分钟的事儿:

1、得到classes.dex文件;直接用你机器上的解压软件打开.apk 文件,解压出 classes.dex 文件。

2、还原.jar文件;这一步需要用到一个工具 dex2jar (谷歌的代码库里有 http://code.google.com/p/dex2jar/)

下载完了,解压,然后把***步的 产物(即那个classes.dex文件)放到 dex2jar的解压目录里。

cmd命令行,目录切换到dex2jar的目录下:

“ dex2jar.bat classes.dex”

看到命令行的 “Done” 之后, dex2jar文件夹里 就会有“classes.dex.dex2jar.jar” 文件了,这个就是传说中的jar包了。

3、查看.jar文件;这一步就是传统的反编译了,需要工具辅助,我这里用到的工具是jd-gui(http://java.decompiler.free.fr/?q=jdgui)

下载你的系统对应的版本、解压,你会看到一个.exe文件,双击,选择第二步生成的.jar, 好吧,你的项目是不是完全还原了呢?

非常简单的步骤就能让代码暴露。

那么,如何对我们的代码混淆呢?

新建一个 2.3.3的项目,你会看到项目文件里有一个proguard.cfg 文件,google已经帮我们做了这么多事,可惜是从2.3开始的,那我 悲催的项目(基于2.2的sdk) 该如何是好?

呵呵,其实不用,你只要 把 proguard.cfg 文件 拷贝到 你的 旧项目里就好了。

当然这样还不够,因为 google是默认不混淆项目的:

To enable ProGuard so that it runs as part of an Ant or Eclipse build,  set the proguard.config property in the <project_root>/default.properties file.  The path can be an absolute path or a path relative to the project's root.  

google 告诉我们 还要 配置 default.properties.

嗯,把 proguard.config=proguard.cfg 加上,好了,再次生成 新的  .apk文件,然后用上面的方法 反编译你的 项目,你会看到 aa bb cc 的包、aa bb cc 的类 和 aa bb cc 的变量名,方法名.

再看看 proguard.cfg 文件

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 
  
-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class com.android.vending.licensing.ILicensingService 
  
-keepclasseswithmembernames class * { 
    native <methods>; 

  
-keepclasseswithmembernames class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 

  
-keepclasseswithmembernames class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 

  
-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 

  
-keep class * implements android.os.Parcelable { 
  public static final android.os.Parcelable$Creator *; 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.

这里是 google默认不混淆 Activity 、Service类的子类, 正如上面的截图中看到的 所有activity的子类名称是被保留的。想自定义混淆细节的话就琢磨琢磨这个配置文件吧!~

责任编辑:徐川 来源: eoeAndroid
相关推荐

2024-07-30 08:11:16

2023-01-03 10:46:29

2014-05-14 00:50:18

JoyentNode

2017-03-02 13:05:10

Android代码混淆

2024-03-01 08:23:39

2017-12-12 13:17:36

机器学习代码单元测试

2010-02-22 10:18:29

Python代码

2017-07-24 13:00:52

2010-01-13 18:47:53

C++教程

2010-02-02 14:11:14

Python 进行编程

2021-11-04 05:43:38

GoKartGo代码静态安全分析

2016-01-12 10:38:58

Angular.js代码调试

2017-03-07 08:45:24

AndroidCPU锁频

2023-08-04 17:52:22

2010-03-03 14:51:02

Android手机

2023-01-30 08:30:09

Tomcat性能优化

2011-01-20 10:33:30

Postfix

2011-08-24 15:42:38

LUA源代码

2011-09-07 13:42:36

Android Wid实例

2011-09-14 10:37:43

Android 2.3StrictMode
点赞
收藏

51CTO技术栈公众号