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

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

**[plain]** [view plain](http://blog.csdn.net/shulianghan/article/details/41697821#)[copy](http://blog.csdn.net/shulianghan/article/details/41697821#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/541288)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/541288/fork)
  <div>
    <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1">
    </embed>
  </div>
</div>
- 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 命令;

执行结果 :

**[plain]** [view plain](http://blog.csdn.net/shulianghan/article/details/41697821#)[copy](http://blog.csdn.net/shulianghan/article/details/41697821#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/541288)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/541288/fork)
  <div>
    <embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_2">
    </embed>
  </div>
</div>
- 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 :

— 文件内容 :

**[plain]** [view plain](http://blog.csdn.net/shulianghan/article/details/41697821#)[copy](http://blog.csdn.net/shulianghan/article/details/41697821#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/541288)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/541288/fork)
  <div>
    <embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_3">
    </embed>
  </div>
</div>
- -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 配置混淆文件 :

**[plain]** [view plain](http://blog.csdn.net/shulianghan/article/details/41697821#)[copy](http://blog.csdn.net/shulianghan/article/details/41697821#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/541288)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/541288/fork)
  <div>
    <embed id="ZeroClipboardMovie_4" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_4">
    </embed>
  </div>
</div>
- target=android-19

- proguard.config=proguard.cfg

 

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

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 文件)

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

c. 输入别名密码 :

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

(4) 验证混淆效果

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

**[plain]** [view plain](http://blog.csdn.net/shulianghan/article/details/41697821#)[copy](http://blog.csdn.net/shulianghan/article/details/41697821#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/541288)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/541288/fork)
  <div>
    <embed id="ZeroClipboardMovie_5" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_5">
    </embed>
  </div>
</div>
- 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 ;

— 反编译过程 :

**[plain]** [view plain](http://blog.csdn.net/shulianghan/article/details/41697821#)[copy](http://blog.csdn.net/shulianghan/article/details/41697821#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/541288)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/541288/fork)
  <div>
    <embed id="ZeroClipboardMovie_6" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_6">
    </embed>
  </div>
</div>
- octopus@octopus:~/decompiler/linux/apktool$ ./apktool d WheelView.apk

- I: Baksmaling&#8230;

- I: Loading resource table&#8230;

- I: Loaded.

- I: Decoding AndroidManifest.xml with resources&#8230;

- I: Loading resource table from file: /home/octopus/apktool/framework/1.apk

- I: Loaded.

- I: Regular manifest package&#8230;

- I: Decoding file-resources&#8230;

- I: Decoding values */* XMLs&#8230;

- I: Done.

- I: Copying assets and libs&#8230;

- 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 文件;

**[plain]** [view plain](http://blog.csdn.net/shulianghan/article/details/41697821#)[copy](http://blog.csdn.net/shulianghan/article/details/41697821#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/541288)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/541288/fork)
  <div>
    <embed id="ZeroClipboardMovie_7" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_7">
    </embed>
  </div>
</div>
- 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&#8230;

- I: Smaling&#8230;

- I: Checking whether resources has changed&#8230;

- I: Building resources&#8230;

- I: Building apk file&#8230;

- octopus@octopus:~/decompiler/linux/apktool$ ls

- aapt  apktool  apktool.jar  WheelView  WheelView1.apk  WheelView.apk

 

💬 评论