Android APK 反编译学习

相关博客:
Android 逆向系列(一):反编译 APK 技术完全解析 - 掘金

Mac电脑安装apktool工具包_apktool mac-CSDN博客

apktool:

作用:

反编译 APK 中的资源,可以看到 AndroidManifest.xml 文件和 activity_main.xml 文件中的代码;

例如:AndroidManifest.xml 反编译前后对比;(当然也可以直接拖到 Android studio 中查看)

安装

下载链接:Install Guide | Apktool

参考下载页面中的描述进行操作,我的电脑是 Mac ,所以就记录 Mac 的安装方式;

  1. 点击 wrapper script,复制其中的内容到文本编辑器中,然后重新命名为 apktool (记住不要后缀.sh,点击看这个文件的简介中 名称与扩展名中也不要设置.sh 后缀)
  2. 点击 latest version 下载最新的 apktool2.jar 包,下载完成后修改文件名为 apktool.jar
  3. 然后将上面两个文件,拖进/usr/local/bin 目录中
  4. 给这两个文件添加可执行权限,命令chmod a+x filePath。
    打开命令输入chmod a+x 后直接将文件拖拽至命令中
  5. 然后终端输入 apktool,如果出现一些版本信息,那就说明成功了

使用

apktool d -f apk_path -o flod_path

其他命令

-f :如果目标文件夹已存在,则强制删除现有文件夹(默认如果目标文件夹已存在,则解码失败)

-o :指定解码目标文件夹的名称(默认使用 APK 文件的名字来命名目标文件夹)

-s :不反编译dex文件,也就是说 classes.dex 文件会被保留(默认会将 dex 文件解码成 smali 文件)

-r :不反编译资源文件,也就是说 resources.arsc 文件会被保留(默认会将 resources.arsc 解码成具体的资源文件)

反编译完成后的文件夹说明:

  • AndroidManifest.xml:经过反编译还原后的 manifest 文件
  • original 文件夹:存放了未经反编译过、原始的 AndroidManifest.xml 文件
  • res 文件夹:存放了反编译出来的所有资源
  • smali 文件夹:存放了反编译出来的所有代码,只不过格式都是.smali类型的

dex2jar

作用

作用:将 dex 文件转换成 jar 文件

安装

下载链接:dex2jar - Browse Files at SourceForge.net

使用

  1. 将 APK 改成 zip 格式的,然后将其中的 dex 文件放到 上面下载的 dex2jar-2.0 文件夹中;
  2. 然后执行

cd dex2jar-2.0 #进入 dex2jar-2.0 文件夹下

sh d2j-dex2jar.sh classes.dex # 执行 sh 脚本

如果出现 Permission denied 报错提示,就执行下面命令

chmod 777 d2j_invoke.sh

然后再执行 sh 脚本;

执行成功就会看到 dex2jar-2.0 文件夹中多出一个 classes-dex2jar.jar 文件;

其中 dex 文件中的代码就都是在这个 jar 文件中,接下来就需要使用 jd-gui 去查看 jar 包下的内容;

jd-gui

作用

作用:查看 jar 包里面的具体内容

安装

下载地址:Java Decompiler

  1. 下载 Mac 版本,然后解压;

  1. 双击打开 JD-GUI,会出现如下图的报错提示;

这是因为 universalJavaApplicationStub.sh 脚本在 Mac Big Sur 及以上版本有兼容性问题,我们需要对这个脚本的内容进行替换。

解决步骤:

  1. 双击 JD-GUI 显示包内容

  1. 根据截图找到 universalJavaApplicationStub.sh

  1. 将此文件内容替换为 universalJavaApplicationStub 这个链接中的内容;

注意:安装之前你要保证系统已经安装了 JDK 1.8 及以上版本

然后可以再双击 JD-GUI,发现可以打开了;

接着将需要打开的 jar 包给拖进去,就可以查看代码了;

阶段性小结:

1、如果要反编译 app 的代码,就使用 dex2jar + jd-gui

2、如果要反编译 app 的资源,就使用 apktool (这个我觉得直接拖到 A android studio 更方便)