参考博文:https://blog.youkuaiyun.com/dongheli/article/details/91952121 (多种环境反编译)
https://blog.youkuaiyun.com/aa464971/article/details/83346953
https://blog.youkuaiyun.com/qq_40606798/article/details/88815361
https://blog.youkuaiyun.com/qq_35070105/article/details/82753656
本文基于window环境
常用工具优快云下载:https://download.youkuaiyun.com/download/qq_21480607/11457311
一、原理
学习反编译之前,建议先学习一下Apk打包的过程,明白打包完成后的Apk里面都有什么文件,各种文件都是怎么生成的。
博文地址:https://blog.youkuaiyun.com/qq_21480607/article/details/97912928
Apk技术也有非常多的技术可以学习,主要都是围绕着如何减小体积,如何提高打包速度展开,这里先不多说了。下面是一张基本的Apk文件结构图。

Apk文件本质上其实是一个zip包。直接拿解压工具解压就可以看到其中包含了什么。下面简单介绍一下Apk文件的结构。
AndroidManifest.xml:应用的全局配置文件
assets文件夹:原始资源文件夹,对应着Android工程的assets文件夹,一般用于存放原始的网页、音频等等,与res文件夹的区别这里不再赘述,可以参考上面介绍的两篇文章。
classes.dex:源代码编译成class后,转成jar,再压缩成dex文件,dex是可以直接在Android虚拟机上运行的文件。
lib文件夹:引用的第三方sdk的so文件。
META-INF文件夹:Apk签名文件。
res文件夹:资源文件,包括了布局、图片等等。
resources.arsc:记录资源文件和资源id的映射关系。
上面的截图中每个文件都是一个最基本的Apk
文件应该包含在内的。但是直接把Apk当做zip解压后的这些文件是没法直接阅读的,毕竟他们都是经过了build-tools打包工具处理过的。我们直接用文本编辑器打开这里面的Manifest文件看看。

反编译Apk的目的就是Apk拆成我们可以阅读的文件。通过反编译,我们一般想要得到里面的AndroidManifest.xml文件、res文件和java代码。
二、常用工具
Apktool
https://github.com/iBotPeaches/Apktool
可以反编译apk,也可以重新打包apk
下载地址:https://github.com/iBotPeaches/Apktool/releases
brew安装:brew install apktool
文档:https://ibotpeaches.github.io/Apktool/documentation
apktool d test.apk
dex2jar
https://github.com/pxb1988/dex2jar
可以将.dex文件反编译成.class文件并打包成jar
下载地址:https://github.com/pxb1988/dex2jar/releases
brew安装:brew install dex2jar
文档:https://github.com/pxb1988/dex2jar/wiki
d2j-dex2jar classes.dex
jd-gui
https://github.com/java-decompiler/jd-gui
可以查看.class文件,用来查看dex2jar反编译出的jar
下载地址:https://github.com/java-decompiler/jd-gui/releases
brew安装:brew install jd-gui
jadx-gui
https://github.com/skylot/jadx
可以直接浏览反编译后的apk
下载地址:https://github.com/skylot/jadx/releases

uber-apk-signer
https://github.com/patrickfav/uber-apk-signer
可以对apk签名,支持V1、V2
下载地址:https://github.com/patrickfav/uber-apk-signer/releases
文档:https://github.com/patrickfav/uber-apk-signer/blob/master/README.md
java -jar uber-apk-signer.jar -a [apk路径] --ks [keystore路径] --ksAlias [alias名称]
java2smali
https://github.com/ollide/intellij-java2smali
IntelliJ IDEA和Android Studio的插件,可以将Java和Kotlin文件编译为smali
下载地址:https://github.com/ollide/intellij-java2smali/releases

三、教程
方法一:
apktool:作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看。
dex2jar:作用:将apk反编译成java源码(classes.dex转化成jar文件)。
jd-gui:作用:查看APK中classes.dex转化成出的jar文件,即源码文件。
1.使用apktool反编译apk得到图片、XML配置、语言资源等文件
进入CMD命令行并切换到工具的所在目录
使用如下的命令运行apktool_2.0.1.jar反编译MMTS-release-1.0.2.apk
java -jar apktool_2.0.1.jar d -f E:\AndroidDevelopTool\Android反编译工具包\测试apk\MMTS-release-1.0.2.apk -o MMTS
这个命令是启动apktool_2.0.1.jar将位于【E:\AndroidDevelopTool\Android反编译工具包\测试apk\】目录下的"MMTS-release-1.0.2.apk"这个apk反编译,然后将反编译生成的文件存放到当前目录(apktool_2.0.1.jar所在的目录,也就是"E:\AndroidDevelopTool\Android反编译工具包"目录)下的一个【MMTS】文件夹中。这个文件夹的名字是可以随便取的,喜欢叫啥都行。


2.拿到.apk文件。将.apk文件,后缀改为 .zip 格式,解压.zip文件,获取图片、icon、等等文件

将下载好的反编译工具,解压。将dex文件拷贝到 反编译工具\lib\dex2jar 目录下
在这个文件打开 cmd 控制台 .在控制台 输入 d2j-dex2jar.bat classes.dex 当执行完我们就可以在当前文件下看到classes-dex2jar.jar 文件

3.打开我们的 反编译工具\lib\jd-gui.exe 工具 将我们刚刚生成的calsses-dex2jar.bat 文件拖进gui.exe就可以看代码了

方法二、
1.同上
2.1、将.apk 文件直接拖进逆向助手 。选择 提取dex 点击操作,执行完生成dex 文件

2、将提取好的dex 文件 再次拖进逆向助手,选择 dex转jar 点击操作、当执行完就会自动帮我们打开了

方法三:
二、自动化工具汇总(一键反编译Apk)
1.谷歌提供的工具:android-classyshark
下载地址:https://github.com/google/android-classyshark/releases,下载下来之后是一个可执行的jar文件,win下或者mac下都只要双击即可运行。
功能:带有界面,一键反编译Apk工具,直接打开Apk文件,就可以看到Apk中所有的文件结构,甚至还集成了dex文件查看,java代码查看,方法数分析、导入混淆mapping文件等一系列工具。谷歌推出这个工具的目的是为了让我们开发者更清楚的了解自己的Apk中都有什么文件、混淆前后有什么变化,并方便我们进一步优化自己的Apk打包实现。

本文详细介绍Apk文件结构及反编译流程,涵盖Apktool、dex2jar、jd-gui等工具使用,实现资源文件与源码的提取。
1143

被折叠的 条评论
为什么被折叠?



