• Android反编译与混淆


    来源于网络,仅用于学习!


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

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

      

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

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

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

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

      

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

      “ dex2jar.bat classes.dex”

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

      这个就是 传说中的 jar包了

      

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

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

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

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


    混淆:

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



    新建一个 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 的变量名,方法名.

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



    再看看 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 的子类 名称是被保留的。

    想自定义 混淆细节 的话 就 琢磨琢磨这个配置文件吧
  • 相关阅读:
    ZUCC2129 The Tree of Power(树形DP)
    ZUCC Flower Name(01字典树)
    JDBC 测试01
    CF1355E Restorer Distance(三分)
    CF1352E Special Permutation(桶排序+前缀和)
    CF1350E Orac and Game of Life(BFS)
    CF1350D Orac and Medians(找规律)
    Python机器学习(五十七)SciPy 积分
    Python机器学习(五十六)SciPy fftpack(傅里叶变换)
    Python机器学习(五十五)SciPy 常量
  • 原文地址:https://www.cnblogs.com/crane13/p/3150169.html
Copyright © 2020-2023  润新知