Reverse Engineering on APK

Author Avatar
Aaron Von 7月 06, 2017

前言: 最近处理了公司的 XX 产品的认证相关事宜。要能拿到产品在海外市场的认证,其中一项是便是需要通过 Google 的 GTS & CTS 测试用例。CTS 好说,毕竟开源的,遇到 Fail 可以直接去翻源码来追根溯源。但是这个丧心病狂的 GTS 是闭源的,多次找 Google 的要源码,真是差点把南墙撞穿。不过没关系,只是给咱增加了饭前(看源码)之前的一点小菜而已(Reverse Engineering)。– 请原谅我大言不惭地用了 Reverse Engineering 二字。

Prerequisites

他们的详细说明和指导都已经在官网说得很明白了,这儿就不再赘述。

Walkthrough

1. 使用 Apktool 提取到 APK 中的资源文件,也就是 res | drawable | layout 等。

$ apktool d GtsCallLogTestCases.apk

执行完毕之后就能得到如下的文件:

2. 使用 dex2jar 提取 classes.dex,然后用 .dex 文件生成 .jar 文件。

  1. 重命名 GtsCallLogTestCases.apk -> GtsCallLogTestCases.zip
  2. 解压 GtsCallLogTestCases.zip 得到 classes.dex
  3. 使用 dex2jar 生成 jar
$ sh d2j-dex2jar.sh -f classes.dex

就能得到我们垂涎已久的 classes.jar 文件了:

悲剧的是 dex2jar 貌似不支持 Android N 之后的 APK。至少我在基于 Android O 的 APK 没有提取成功。

3. 上面生成的 .jar 扔到 jd-gui 中就能看到其中的源码了。

不过反编译 APK 源码你是不会希望遇到有做代码混淆的应用的 🙂。

学会了这招,也差不多能解决基本的代码学习问题了,遇到有趣的应用就想看看它到底是咋实现的!

至于重新打包成 APK 就放到以后写了吧~

To be continued~