• android 代码混淆


    一个xxx.apk提交给测试、

    ok,去倒杯水,看看网页~~~~~

    呃,忽然觉得 是不是应该 给我的代码 提高点安全性,

    记得看过 apk直接可以 解压,然后很容易的就可以 反编译出 .java

    找了找,果然,这一切 只不过是 一分钟的事儿,

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

      解压出 classes.dex 文件,(这个就是 .jar 的前生--- 其实应该说 后世)

      win rar

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

      看名字也不难知道他是干嘛的了吧?(没错,就是 把 dex 还原 成  jar包 )

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

      (解压目录里 有 dex2jar.bat 文件,检查一下,没有的话 说明目录不对、再 找找)

      dex2jar

      cmd 命令行 ,目录切换到 dex2jar的目录下(linux 系统的话 执行那个 .sh文件)

      “ dex2jar.bat classes.dex”

      看到命令行  的 “Done” 之后, dex2jar 文件夹里 就会有“classes.dex.dex2jar.jar” 文件了,

      这个就是 传说中的 jar包了

      done

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

      下载你的系统对应的版本,解压,(我xp系统)你会看到一个 .exe文件,没错就是 单文件绿色版

      双击,选择 第二步 生成的 .jar, 好吧,你的项目是不是 完全还原了呢?(内部类的话 还原后的结构看着有点不喜欢)

    没错,这么简单 就能 让你的代码暴露了,心疼不?

    [这里我就不贴 图了,公司的项目]

    好了,接下来说说  怎么混淆吧,网络上好多介绍 proguard 混淆android 项目的文章,都是抄来贴去,

    好几个都是讲得没头没尾、我看了好半天  ,愣是没搞明白,……

    android sdk tools 目录下 看到 proguard 了没?

    androidtools

    新建一个 2.3.3的项目,你会看到 项目 文件里 有一个 proguard.cfg 文件?

    好吧,伟大的 google 已经帮我们做了这么多事儿了,可惜是从2.3开始的,

    那我 悲催的 项目(基于2.2的sdk) 该如何 是好?(非得 残忍的把 项目属性设置为 2.3的么?

    其实即使你该了,google 也不会为你把 proguard.cfg文件补上的)

    呵呵,其实不用,你只要 把 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 的变量名,方法名.

    这个我相信你自己也搞的头昏了吧?

    ok

    再看看 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 *;
    }
    复制代码

    这里是 google默认 不混淆 Activity 、Service ... 类的 子类, 正如上面的截图中看到的 所有 activity 的子类 名称是被保留的。

    想自定义 混淆细节 的话 就 琢磨琢磨这个配置文件吧

     

    -injars  androidtest.jar【jar包所在地址】 
    -outjars  out【输出地址】

    -libraryjars    'D:android-sdk-windowsplatformsandroid-9android.jar' 【引用的库的jar,用于解析injars所指定的jar类】

    -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 * extends android.app.backup.BackupAgentHelper
    -keep public class * extends android.preference.Preference
    -keep public class com.android.vending.licensing.ILicensingService

    -keep public abstract interface com.asqw.android.Listener{
    public protected <methods>;  【所有方法不进行混淆】
    }
    -keep public class com.asqw.android{
    public void Start(java.lang.String); 【对该方法不进行混淆】
    }

    -keepclasseswithmembernames class * { 【保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)】

    native <methods>;
    }

    -keepclasseswithmembers class * { 【保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。】
    public <init>(android.content.Context, android.util.AttributeSet);
    }

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

    -keepclassmembers class * extends android.app.Activity {【保护指定类的成员,如果此类受到保护他们会保护的更好 】
    public void *(android.view.View);
    }

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

    -keep class * implements android.os.Parcelable {【保护指定的类文件和类的成员】
    public static final android.os.Parcelable$Creator *;
    }

    参考:http://blog.csdn.net/vrix/article/details/7100841

    加入第三方jar包之后常出现的几个异常:

    proguard returned with error code 1.See console

    情况1:
    Proguard returned with error code 1. See console 
    Error: C:/Documents (系统找不到指定文件) 
    后来发现是因为将整个工程放到了桌面上,而桌面的目录是C:/Documents and Settings/Administrator/桌面,在这里面有空格,而proguard进行发编译的时候是不允许有空格的
    如果换了正确路径还不好用的话,直接删除proguard就好了

    注意:SDK和程序路径最好不要有空格符

    情况2:

    Proguard returned with error code 1. See console 
    异常:

    java.lang.ArrayIndexOutOfBoundsException

    解决办法:将proguard.cfg中的"-dontpreverify"改成“-dontoptimize

    参考文章:http://groups.google.com/group/android-developers/browse_thread/thread/eca3b0f5ce6ad00f

    我把项目中生成的proguard文件夹(此时文件夹是空的)删掉,然后再重新运行项目,就OK 了。

    情况3:

    [2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0] Proguard returned with error code 1. See console

    [2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0] java.io.IOException: Can't read [proguard.ClassPathEntry@106082] (No such file or directory)

    [2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]  at proguard.InputReader.readInput(InputReader.java:230)

    [2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]  at proguard.InputReader.readInput(InputReader.java:200)

    [2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]  at proguard.InputReader.readInput(InputReader.java:178)

    [2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]  at proguard.InputReader.execute(InputReader.java:100)

    [2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]  at proguard.ProGuard.readInput(ProGuard.java:195)

    [2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]  at proguard.ProGuard.execute(ProGuard.java:78)

    [2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]  at proguard.ProGuard.main(ProGuard.java:499)

    抛出这样的异常的原因是第三方jar的引用路径不对,没有找到这个需要忽略混淆的jar包。

    参考:http://stackoverflow.com/questions/4884456/android-proguard-java-io-ioexception-cant-read-proguard-classpathentry

     
  • 相关阅读:
    HTML表格的运用
    HTML常用元素
    CSS常用样式(四)之animation
    CSS常用样式(三)
    CSS学习总结(三)
    CSS常用样式(二)
    CSS常用样式(一)
    CSS学习总结(二)
    CSS学习总结(一)
    HTML标签的嵌套
  • 原文地址:https://www.cnblogs.com/leihupqrst/p/4025175.html
Copyright © 2020-2023  润新知