apk反编译详解

泡在网上的日子 / 文 发表于2015-04-16 11:12 第次阅读 反编译

这里的反编译的目的并不是修改别人的代码然后自己发布盗版apk,而且这种方法也做不到。这里的反编译只能查看作者的大致代码,目的是研究apk中某些效果的实现方法,知道大致的方法之后,具体代码还需自己写。

apk的反编译分为两部分,一是反编译classes.dex得到java代码,二是反编译资源文件以及xml布局文件,这两部分是分开的,并且使用的是不同的工具。

 

这些工具分别是apktool、dex2jar和jd-gui,其中apktool用于反编译xml文件;apktool用于反编译classes.dex,生成.jar文件,然后用jd-gui.exe查看这个jar文件中的java代码。

我用的apktool和dex2jar的版本分别是apktool1.5.2 和 dex2jar-0.0.9.15。

下载地址见文末。

一、反编译Apk得到Java源代码

先将apk文件的后缀名改成zip,然后解压这个zip文件,解压之后一般会得到包含如下文件的目录:

QQ图片20150420095243.png

这里只有classes.dex文件有用,将这个classes.dex拷贝到dex2jar的dex2jar.bat所在目录,然后在命令行下定位到dex2jar.bat所在目录,运行:

dex2jar.bat  classes.dex

 QQ图片20150420100440.png


然后在同一目录下就会生成classes_dex2jar.jar文件。

我们用jd-gui打开这个jar文件就可以看到java代码了。

QQ图片20150420100847.png

从反编译出的代码可以看出,这个apk的代码混淆做的比较好,不容易分析出其代码结构。



二、反编译apk的xml,图片等资源文件。

直接解压apk也能得到图片、xml等资源文件,但是得到的xml是乱码,而图片资源也也不是原封不动的,特别是.9图片,全都变成了一般的图片。

apktool专门用于反编译这些资源文件。

下载:apktool1.4.1.tar.bz2 和 apktool-install-windows-r04-brut1.tar.bz2(两个包都下载),将下载的两个包解压到同一个文件夹下,应该会有三个文件:aapt.exe,apktool.bat,apktool.jar。

如果不知道怎么做,或者无法下载,直接使用我在文章末尾给出的工具包就行了,我已经弄好了。

QQ图片20150420102332.png

首先定位到apktool所在的目录,然后执行:

apktool   d   souhushipin.apk   souhushipin

命令行解释:apktool   d   [apk文件 ]   [输出文件夹]

其中[apk文件 ]和[输出文件夹]都直接在apktool的根目录的话,就不需要写绝对路径了,直接写文件和目录名。

为了命令行书写方便我都是直接将apk文件放在同一目录下。如下:

QQ图片20150420103946.png


其中[输出文件夹]只需指定就好了,不要自己新建目录,他会自动生成。如上图,执行了

apktool   d   souhushipin.apk   souhushipin

之后,就会在同一目录下得到souhushipin文件夹。里面有这些东西:

QQ图片20150420104201.png

和dex2jar反编译出的java代码不同,apktool反编译出的资源文件都是可以直接使用的,不存在混淆的问题。

重新打包修改过的apk

apktool还可以将反编译完的文件重新打包成apk,很简单,输入apktool b [文件夹](你编译出来文件夹)即可,命令如下:

apktool   d   b  souhushipin

QQ图片20150420105823.png

运行之后会在souhushipin目录下生成

build

dist

两个文件夹。

QQ图片20150420110111.png

其中,打包生成的souhushipin.apk,在上面的dist文件夹下。

想想这种方法是不是可以用于apk的汉化呢。。。。


最后我把所有用到的工具都放在一个包中,而且apktool的两个东西我都已经弄在一起了,解压后就可以直接使用。

下载地址: 反编译工具集

收藏 赞 (4) 踩 (1)
上一篇:【Android进阶学习】监听EditText的变化
【Android进阶学习】监听EditText的变化
下一篇:Kotlin for Android (III) 扩展函数与默认值
原文链接 : Kotlin for Android (III): Extension functions and default values 译者 : Lollypo 校对者: Mr.Simple 译文链接: github 现在你已经了解 Kotlin基础 与 如何配置你的项目 ,是时候谈论Kotlin能为我们做哪些Java做不到的有趣的事情了.请记住,如