Android反编译工具使用

目录

  • 目录
  • 前言
  • 工具
  • 流程图
  • 获取classesdex
    • apk
    • jar
    • odex
      • baksmail
      • smail
  • classesdex - classes-dex2jarjar
  • jd-gui
  • 查看资源文件和xml
    • apk安装
    • 解包Apk
    • 打包Apk

前言

为什么需要反编译?

  1. 反编译apk。例如市面上有很多优秀的apk,实现了一些很优秀的功能,而这些功能无法轻易google到的时候,我们可以通过反编译apk来查看一下这些优秀功能的实现。(好像有点无耻,但是本着一些技术的心,而不是为了盈利,我觉得可以接受)。
  2. 反编译jar包。例如我现在的工作是系统移植,经常会遇到由于编译系统造成的奇怪问题,这个时候有能力反编译framework目录下的jar包是很有用处的。

需要声明的是

本篇文章只讲述Android反编译工具的使用,不涉及原理的讲解。(ps:主要是因为很多原理性的东西我也搞不清楚,不想误人子弟!)

工具

俗话说“工欲善其事,必先利其器”,想反编译Android,我们需要下面四个强大的工具(ps:这几个工具均可以跨平台):

  1. dex2jar
  2. jd-gui
  3. baksmali
  4. smali

流程图

在Android开发中,一般会遇到apk、jar包和odex文件需要进行反编译。我先用一张流程图描述一下反编译流程和其中需要使用到的反编译工具。

Android反编译工具使用_第1张图片

获取classes.dex

根据流程图,我们先来看一下apk、jar、odex等文件如何获取classes.dex文件。

apk

我们需要使用unzip解压apk。具体命令如下:

unzip test.apk -d /tmp/test

解压完成后,我们就能在解压目录(ps:上面是/tmp/test)下找到classes.dex文件了。

jar

jar也是java文件的集合,我们可以使用jar -xf命令进行解压。在反编译Android的/system/framework目录下的jar文件时,我们经常会用到这个命令。

jar -xf classes.jar

解压完成后,一般就能看到classes.dex文件了。

odex

想从odex文件中获取classes.dex相比apk、jar包会麻烦一些,中间需要一些转换。

odex文件首先需要使用baksmail工具转成smail文件集合,然后在通过smail工具将smail文件集合打包成classes.dex文件。

下面以/system/framework目录下的telephony-common.odex文件为例,介绍如何使用baksamil和smail工具。

baksmail

使用baksmail.jar文件将odex文件进行分解,具体命令如下:

java -jar baksmali-2.0.6.jar -x telephony-common.odex

成功的话,会在当前目录下生成一个out目录,里面都是一些以”.smail”为后缀名的文件。

更多关于baksmail的使用,可以在命令行直接运行:

java -jar baksmali-2.0.6.jar

执行结果部分截图如下:

smail

接下来就是用smail工具将上面生成的out目录打包成classes.dex文件。具体命令如下:

java -Xmx1024M -jar smali-2.0.3.jar out -o classes.dex

如果过程没报错,这个时候,我们就已经将odex文件转换为dex文件了。

classes.dex -> classes-dex2jar.jar

接下来,使用这个神器将classes.dex文件转换为classes-dex2jar.jar文件。具体命令如下:

bash -x d2j-dex2jar.sh classes.dex

注意,需要给d2j-dex2jar.sh和d2j_invoke.sh两个脚本可执行权限。

jd-gui

像我的Ubuntu 13.10的64位版本使用jd-gui的时候,可能会遇到如下的错误:

./jd-gui: error while loading shared libraries:...

主要是缺少32位的库,如下安装命令可以解决这些问题:

sudo apt-get install libgtk2.0-0:i386 libxxf86vm1:i386 libsm6:i386 lib32stdc++6

然后,直接用jd-gui打开刚才dex2jar.sh生成的classes-dex2jar.jar即可看到反编译的源码。如下图:

但是,如上图所示,目前基本大部分市场发布的apk都会做代码混淆。

查看资源文件和xml

使用dex2jar和jd-gui等只能看到程序的源码,没法看到资源文件和xml布局文件。想查看apk的资源文件和xml就需要用另外一个神器了:apktool。

apk安装

由于我是Ubuntu13.10的系统,所以我只讲解Ubuntu环境下如何安装apktool。

  1. 首先,需要下载apktool的执行脚本。打开apktool脚本网址,右键保存为apktool.sh脚本文件即可。
  2. 其次,下载apktool.jar,下载地址为:apktool.jar,选择最新的v2.0.0版本即可。
  3. 最后,将apktool.sh和apktool.jar放在同一目录即可。

解包Apk

解包apk的命令如下:

./apktool.sh d test.apk

打包Apk

打包apk的命令如下:

./apktool.sh b test

你可能感兴趣的:(android,编译)