zoukankan      html  css  js  c++  java
  • 【Android 应用开发】 Android APK 反编译 混淆 反编译后重编译



    反编译工具 : 总结了一下 linux, windows, mac 上的版本, 一起放到 CSDN 上下载;

    -- CSDN 下载地址http://download.csdn.net/detail/han1202012/8221787

    octopus@octopus:~/decompiler$ tree -L 2
    .
    ├── linux
    │   ├── apktool
    │   ├── dex2jar-0.0.9.15
    │   └── jd-gui
    ├── mac
    │   ├── apktool
    │   ├── dex2jar-0.0.9.15
    │   └── jd-gui-0.3.5.osx.i686.dmg
    ├── windows
    │   ├── apkTool
    │   ├── dex2jar-0.0.9.15
    │   └── jd-gui.exe
    └── 源码
        └── apktool-source.zip
    
    10 directories, 4 files





    一. 反编译 至 Java 源码 



    1. 工具介绍


    dex2jar 简介 : 将 .dex 或者 .class 后缀文件转换成 .jar 文件;

    -- 最新版本 : 目前最新版本 0.0.9.15;

    -- 官方地址 (需要翻墙)http://code.google.com/p/dex2jar/ ;

    -- 下载地址 (需要翻墙)http://code.google.com/p/dex2jar/downloads/list;


    jd-gui 简介 : 使用该工具可以查看 .jar 中的 java 代码;

    -- 官网地址 : http://jd.benow.ca/ ;



    2. 反编译过程 



    (1) Ubuntu 系统反编译


    a. 获取 .dex 后缀文件 : 修改 apk 文件后缀, 获取 class.dex 文件;


    b. 执行反编译 : 将 classes.dex 拷贝到 dex2jar 目录下, 执行 ./d2j-dex2jar.sh classes.dex 命令;

    -- 执行结果

    octopus@octopus:~/decompiler/linux/dex2jar-0.0.9.15$ ./d2j-dex2jar.sh classes.dex 
    dex2jar classes.dex -> classes-dex2jar.jar

    c. jd-gui 中查看源码 : 将 classes-dex2jar.jar 文件拖入 jd-gui 中, 查看源码;




    3. 混淆代码


    注意 : 如果不使用签名文件进行打包的话, 直接从 eclipse 中拷贝的文件是无法混淆的;


    (1) 配置混淆文件 


    编辑 progard.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 * extends android.app.backup.BackupAgentHelper
    -keep public class * extends android.preference.Preference
    -keep public class com.android.vending.licensing.ILicensingService
    
    # 所有类中的 native 方法不混淆
    -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);
    }
    
    # 保留 Activity 子类
    -keepclassmembers class * extends android.app.Activity {
       public void *(android.view.View);
    }
    
    # 对枚举类型enum的全部类的下面指定方法的方法名不进行混淆
    -keepclassmembers enum * {
        public static **[] values();
        public static ** valueOf(java.lang.String);
    }
    
    # 实现了 Parcelable 序列化接口的类不混淆
    -keep class * implements android.os.Parcelable {
      public static final android.os.Parcelable$Creator *;
    }
    


    -- project.properties 配置混淆文件

    target=android-19
    proguard.config=proguard.cfg



    (2) 打包 apk 文件 (创建新的 keystore)


    a. 设置打包项目 : 右键点击工程 选择 Android Tools --> Export Signed Application Package 选项, 弹出以下对话框, 选择要打包的程序, 设置好后点击 Next;



    b. 创建 keystore : 选择 Create new keystore, 选择一个文件, 然后设置 keystore 的用户名 和 密码;

    -- Location : keystore 文件;

    -- Password : 密码;

    -- Confirm : 确认密码, 重新输入密码;


    c. 输入 keystore 详细信息

    -- Alias : 别名;

    -- Password : 别名密码;

    -- Confirm : 确认密码;

    -- Validity(years) : 有效期限, 推荐 25 年;

    -- First and Last Name : 开发者姓名;

    下面的参数可以不填写

    -- Orgnizational Unit : 组织名称;

    -- Orgnization : 组织;

    -- City or Location : 城市;

    -- State or Provience : 省 或者 州;

    -- Country Code : 国家;


    d. 选择 apk 文件并打包 : 点击 finish 按钮后打包完毕;



    (3) 打包 apk 文件 (使用现有的 keystore 文件)


    a. 选择打包的工程 : 右键点击工程, 选择 Android Tools --> Export Signed Application Package 选项;



    b. 选择签名文件 : 输入签名文件密码;



    c. 输入别名密码



    d. 打包 apk : 选择要打包的 apk 文件




    (4) 验证混淆效果 


    反编译 : 将 apk 文件后缀改为 .zip, 之后取出 classes.dex 文件 到 dex2jar 根目录中, 执行 ./d2j-dex2jar.sh classes.dex 命令;

    octopus@octopus:~/decompiler/linux/dex2jar-0.0.9.15$ ./d2j-dex2jar.sh classes.dex 
    dex2jar classes.dex -> classes-dex2jar.jar
    

    在 jd-gui 中查看 Java 代码





    二. Apktools 反编译 



    1. Apktools 介绍


    Apktools 简介

    -- 最新版本 : 2.0.0 ;

    -- 官方网站 (需要翻墙) https://code.google.com/p/android-apktool/ ;

    -- 新版本下载地址https://bitbucket.org/iBotPeaches/apktool/downloads ;

    -- 老版本下载地址 (需要翻墙)https://code.google.com/p/android-apktool/downloads/list ;


    需要下载的文件

    -- apktool jar 包apktool1.5.2.tar.bz2

    -- apktool 引导工具 (Linux)apktool-install-linux-r05-ibot.tar.bz2

    -- apktool 引导工具 (mac) : apktool-install-macosx-r05-ibot.tar.bz2

    -- apktool 引导工具 (wondows) : apktool-install-windows-r05-ibot.tar.bz2



    2. 反编译


    将下载的文件放到一个文件中



    反编译 : 将 apk 文件放入上面的目录, 执行命令 ./apktool d WheelView.apk ;

    -- 反编译过程 : 

    octopus@octopus:~/decompiler/linux/apktool$ ./apktool d WheelView.apk 
    I: Baksmaling...
    I: Loading resource table...
    I: Loaded.
    I: Decoding AndroidManifest.xml with resources...
    I: Loading resource table from file: /home/octopus/apktool/framework/1.apk
    I: Loaded.
    I: Regular manifest package...
    I: Decoding file-resources...
    I: Decoding values */* XMLs...
    I: Done.
    I: Copying assets and libs...
    octopus@octopus:~/decompiler/linux/apktool$ ls
    aapt  apktool  apktool.jar  WheelView  WheelView.apk
    

    -- 反编译结果 : 反编译结果都在 WheelView 目录中, res 中是相关资源文件, smali 中是 smali 汇编文件;




    3. 重新编译 


    重新编译命令格式 : ./apktool b apk源目录 apk文件名称;

    -- 执行命令 : ./apktool b WheelView WheelView1.apk , 可以生成 WheelView1.apk 文件;

    octopus@octopus:~/decompiler/linux/apktool$ ls
    aapt  apktool  apktool.jar  WheelView  WheelView.apk
    octopus@octopus:~/decompiler/linux/apktool$ ./apktool b WheelView WheelView1.apk
    I: Checking whether sources has changed...
    I: Smaling...
    I: Checking whether resources has changed...
    I: Building resources...
    I: Building apk file...
    octopus@octopus:~/decompiler/linux/apktool$ ls
    aapt  apktool  apktool.jar  WheelView  WheelView1.apk  WheelView.apk
    


  • 相关阅读:
    服务器操作nginx相关操作命令
    git使用命令
    超出隐藏显示
    微信小程序清除默认样式
    程序员提升之排查bug的能力
    call和apply的基本用法与区别
    vuejs 插件开发并发布到npm--(3)vue组件开发并发布
    vuejs 插件开发并发布到npm--(2)js插件开发
    vuejs 插件开发并发布到npm--(1)为什么要进行插件开发管理
    双机热备份和负载均衡的区别
  • 原文地址:https://www.cnblogs.com/hanshuliang/p/4215382.html
Copyright © 2011-2022 走看看