Android 反编译
Android程序打完包之后是一个apk程序,可以安装到Android手机上。我们反编译其实也就是对这个APK文件进行反编译。Android的反编译主要又分为两个部分,一个是对代码的反编译,一个是对资源的反编译,我们马上来逐个学习一下。
一、反编译
本人自己写了一个程序来进行反编译,毕竟反编译别人的程序不是特别好的事情。这里我的代码很简单就是一个按钮点击弹出一个Toast来提示“反编译例子”。
这是我们的APP例子:Android反编译.apk
下面让我们用此APP为例来开始学习!
1、我们需要先准备Android反编译的三个工具
- apkTool 谷歌提供的 APK 编译工具,可以反编译和回编译。[apkTool下载地址]
- dex2jar:将 dex 文件转换成 jar 包。 [dex2jar下载地址]
- jd-gui:用来查看 jar 包里面的代码的一种工具。 [jd-gui下载地址]
2、对资源进行反编译
1. 这里我们需要用到apkTool
2. 接下来的工作就很简单了,我们将Android反编译.apk拷贝到和这两个文件同样的目录当中,然后cmd也进入到这个目录下,并在cmd中执行如下命令:
apktool d Android反编译.apk
其中d是decode的意思,表示我们要对Android反编译.apk这个文件进行解码。那除了这个基本用法之外,我们还可以再加上一些附加参数来控制decode的更多行为:
-f 如果目标文件夹已存在,则强制删除现有文件夹(默认如果目标文件夹已存在,则解码失败)。
-o 指定解码目标文件夹的名称(默认使用APK文件的名字来命名目标文件夹)。
-s 不反编译dex文件,也就是说classes.dex文件会被保留(默认会将dex文件解码成smali文件)。
-r 不反编译资源文件,也就是说resources.arsc文件会被保留(默认会将resources.arsc解码成具体的资源文件)。
常用用法就这么多了,那么上述命令的执行结果如下图所示(下图为成功案例):
3、对代码进行反编译
1. 这里我们用到dex2jar工具
解压dex2jar压缩包后,如下图
这里面我们用到的是d2j-dex2jar.bat文件。
2. 我们先对Android反编译.apk进行更改为Android反编译.zip我们更改apk为zip就行,然后用解压软件打开。解压之后你会发现里面有一个classes.dex文件,如下图所示:
这个classes.dex文件就是存放所有java代码的地方了,我们将它拷贝到dex2jar解压后的目录下。
3. 在cmd中也进入到同样的目录,然后执行:( dex2jar 为文件夹名称,一般cmd要到此文件夹下 。 d2j-dex2jar 与classes.dex 为文件夹内部的文件!!!)
d2j-dex2jar classes.dex
那么上述命令的执行结果如下图所示(下图为成功案例):
这样我们的目录下就会多出两个文件
可以看到,classes-dex2jar.jar这个文件就是我们借助工具之后成功转换出来的jar文件了。但是对于我们而言,jar文件也不是可读的,因此这里还需要再借助一下jd-gui这个工具来将jar文件转换成java代码。
4. 下面我们就要用到我们的第三个工具了 jd-gui
直接运行jd-gui.exe打开classes-dex2jar.jar后就可以了。结果如下图所示:
OK,由此可见,我们的代码反编译工作已经成功了,MainActivity中的代码非常清晰,基本已经做到了90%以上的还原工作。但是如果想要做到100%的代码还原还是非常有难度的,因为像setContentView()方法传入的参数,其实就是一个资源的id值而已,那么这里反编译也就只能将相应的id值进行还原,而无法变成像R.layout.activity_main这样直观的代码展示。