反编译工具 : 总结了一下 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;

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

-- 下载地址 (需要FQ) : 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 ;

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

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

-- 老版本下载地址 (需要FQ) : 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

【Android 应用开发】 Android APK 反编译 混淆 反编译后重编译的更多相关文章

  1. 关于T-SQL重编译那点事,WITH RECOMPILE和OPTION(RECOMPILE)区别仅仅是存储过程级重编译和SQL语句级重编译吗

    本文出处:http://www.cnblogs.com/wy123/p/6262800.html   在考虑重编译T-SQL(或者存储过程)的时候,有两种方式可以实现强制重编译(前提是忽略导致重编译的 ...

  2. WITH RECOMPILE和OPTION(RECOMPILE)区别仅仅是存储过程级重编译和SQL语句级重编译吗

    在考虑重编译T-SQL(或者存储过程)的时候,有两种方式可以实现强制重编译(前提是忽略导致重编译的其他因素的情况下,比如重建索引,更新统计信息等等), 一是基于WITH RECOMPILE的存储过程级 ...

  3. android studio 开发android app 真机调试

    大家都知道开发android app 的时候可以有2种调试方式, 一种是Android Virtual Device(虚拟模拟器) ,另一种就是真机调试. 这里要说的是真机调试的一些安装步骤: 1. ...

  4. 码农人生——从未学过Android如何开发Android App 案例讲解-第002期案例

    标题有点晃眼,本次分享是002期博文的实践故事,不会有任何代码.也不会教别人android 如何开发,类似博文已经有大批大批,而且还会有陆陆续续的人写,我写的文章,主要是经验之谈,希望总结出的一些方法 ...

  5. Android Studio开发Android应用如何签名

    1.使用jdk自带的工具生成keystore 使用cmd命令行进入到jdk的bin目录(比如:C:\Program Files\Java\jdk1.7.0_01\bin) 运行如下命令: C:\Pro ...

  6. 用Android Studio 开发Android应用

    目前AndroidStudio已经到了1.2版本了,我用了下,觉得还蛮好的,有些自动生成的资源,它会自动帮你管理.下面开始列一下,我的开发环境搭配.在开始前,你得有个VPN,可者代理.嗯.不然你下不了 ...

  7. [Hybrid App]--Android混合开发,Android、Js的交互

    AndroidJs通信 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !imp ...

  8. Android BLE开发——Android手机与BLE终端通信初识

    蓝牙BLE官方Demo下载地址:   http://download.csdn.net/detail/lqw770737185/8116019参考博客地址:    http://www.eoeandr ...

  9. Android多媒体开发-- android中OpenMax的实现整体框架

    1.android中用openmax来干啥? android中的AwesomePlayer就 是用openmax来做(code)编解码,其实在openmax接口设计中,他不光能用来当编解码.通过他的组 ...

随机推荐

  1. Go 实现 NumberFormat 函数

    [转] http://www.syyong.com/Go/Go-implements-the-NumberFormat-algorithm.html NumberFormat - 以千位分隔符方式格式 ...

  2. 清空dataset中的某行某列的数据

    string tempSFZH = ""; foreach (DataRow rs in ds.Tables[0].Rows) {     tempSFZH = rs[ht[&qu ...

  3. python显示中文出错以及抛出UnicodeDecodeError的处理办法

    程序开头粘贴如下代码即可: # -*- coding:utf-8 -*- import sys default_encoding = 'utf-8' if sys.getdefaultencoding ...

  4. 41. First Missing Positive(困难, 用到 counting sort 方法)

    Given an unsorted integer array, find the first missing positive integer. For example, Given [1,2,0] ...

  5. Wcf host

    Uri baseAddress = new Uri(uri);//var binding = new WebHttpBinding(WebHttpSecurityMode.None); var bas ...

  6. EF实体的部分更新

    实现实体的部分更新假设实体InfoHotel如下: public class InfoHotel { public int Id{get;set;} public string Name{get;se ...

  7. JAVA反射之Class类的练习

    package zhang; /** * JAVA反射之CLass类的练习 * * 在面向对象的语言里,万事万物皆对象,那么类是谁的对象呢? * 类的类型是CLass * * */ class Tes ...

  8. js数组排序,支持正反排序以及多维度排序

    工作中遇到js数组排序问题,数组中存储的都是对象,于是就百度了下,利用别人的代码进行修改,最终完成可以倒序.反序,可以进行多维度排序的功能源码如下: /** * js数组排序 支持数字和字符串 * @ ...

  9. 关于Allele(等位基因)的理解

    高中学生物的时候关于遗传学的部分,记得当时的教材上为了简化处理一般将基因型定义为AA, Aa, aa.其实这种抽象的理解对应付高考是很有用的,但是实际应用中如果还这样理解那么便会产生一些疑问.之所以会 ...

  10. Node.js JXcore 打包

    Node.js 是一个开放源代码.跨平台的.用于服务器端和网络应用的运行环境. JXcore 是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线 ...