Mac反编译apk程序

APK,即Android应用程序包(Android application package),是Android操作系统使用的一种应用程序包文件格式,用于分发和安装移动应用及中间件。一个Android应用程序的代码想要在Android设备上运行,必须先进行编译,然后被打包成为一个被Android系统所能识别的文件才可以被运行,而这种能被Android系统识别并运行的文件格式便是APK。一个APK文件内包含被编译的代码文件(.dex 文件),文件资源(resources), assets,证书(certificates),和清单文件(manifest file)。

APK文件基于ZIP文件格式,它与JAR文件的构造方式相似。因而,直接解压APK文件可以得到一部分信息,如classes.dex等。如果要进行更详尽的分析,就需要用到反编译的工具了。

准备工作

下载最新的JDK

前往ORACLE官网,在底部找到Download Java for Developers,点击该链接,在打开的页面中找到JDK,选择Download,然后下载对应的版本即可。

配置JDK

下载完成后,打开dmg镜像进行安装。JDK会被安装到/Library/Java/JavaVirtualMachines目录下。为了能在终端正确运行最新的JDK,需要配置环境变量。在~/.bash_profile中增加以下内容:

1
2
3
4
5
6
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home
PATH=$JAVA_HOME/bin:$PATH:.
CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
export JAVA_HOME
export PATH
export CLASSPATH

其中,将jdk1.8.0_40.jdk换成你所安装的JDK对应的版本和目录。修改完成后,重开终端或使用

1
source ~/.bash_profile

使环境变量生效。

下载apk反编译组件

需要下载的程序包括:

一些论坛里会把它们称为『apk反编译三件套』。

进行反编译

运行Apktool

按照官网上的教程,将下载Apktool后得到的shell脚本和apktool.jar移动到/usr/local/bin,然后在终端执行apktool -h,如果能正确显示帮助信息,则安装正常。
Apktool的使用方法也很简单,准备好需要反编译的apk文件(例如example.apk),执行

1
apktool d path/to/example.apk

即可进行反编译,这时会生成一个名为example的目录,用于存储反编译出的文件。如果要回编译,执行

1
apktool b path/to/example

当然,仅通过回编译得到的apk是没有签名的。如果要在安卓手机上安装,还需要进行签名。步骤如下:

1
2
keytool -genkey -alias tmp.keystore -keyalg RSA -validity 20000 -keystore tmp.keystore
jarsigner -verbose -keystore tmp.keystore -signedjar path/to/example.apk path/to/example_signed.apk tmp.keystore

这会生成一个签名文件tmp.keystore和可供安装的example_signed.apk

用dex2jar将apk转成jar文件

下载dex2jar的releases版本后,解压进入文件夹,然后运行:

1
./d2j-dex2jar.sh path/to/example.apk

在dex2jar目录下将得到example-dex2jar.jar文件

查看源代码

打开JD-GUI.app,将example-dex2jar.jar拖进去就能看到源码了。
需要注意的是,如果你使用了JAVA9,打开JD-GUI时可能会出现问题,解决方法是修改JD-GUI.app/Contents/Info.plist,找到

1
2
<key>VMOptions</key>
<string>-Xms512m</string>

改为

1
2
<key>VMOptions</key>
<string>-Xms512m --add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens jdk.zipfs/jdk.nio.zipfs=ALL-UNNAMED</string>

即可正常启动。
通过看java源码对比smali文件,修改后回编译就ok了!


本教程以macOS 10.13为例。其它的版本的Mac可能在操作上略有差别。

参考文章:
MAC安装JDK及环境变量配置
MAC上反编译android apk—apktool, dex2jar, jd-jui安装使用(含手动签名)
apk反编译获取完整源码 及 apk反编译后的处理
Java 9 Compatibility

🍭支持一根棒棒糖!
0%