0%

反编译 Android 程序小记

使用 QQ 这么多年,管理的群越来越多。现在每天被入群申请搞得烦不胜烦,于是萌生了写一个 QQ 机器人的想法。

要想实现一个 QQ 机器人,首先是要在程序里模拟登录。经过整理,可用的思路有两个:

  • 使用 WebQQ 的方式登录,模拟浏览器的行为;
  • 使用 Android QQ 的方式登录,模拟 Android 客户端的行为。

二者各有利弊。使用 WebQQ 方式登录协议相对简单,网络上也有相关分析;但是 WebQQ 不能与电脑上的 QQ 共存:登录 WebQQ 就会将电脑上的登录踢下线。使用 Android QQ 的方式登录,由于没有现成的资料可供查询,实现起来十分复杂;但是 Android QQ 是手机端 QQ,可以与电脑端 QQ 共存。

「要做就做好」。思前想后,我还是决定使用 Android QQ 的方式登录。于是问题来了,怎样去抓取 Android QQ 的行为呢?

  1. 在 Android QQ 外围进行抓包分析,然后让程序伪装成 Android QQ 向腾讯的服务器发包;
  2. 直接读 Android QQ 的源代码,然后仿照着相关内容重新实现。

方案 1 是常规方法,若能顺利实施,无非是不断重复抓包 - 分析 - 伪造的步骤。不过 QQ 的通信信息是加密处理过的,抓包分析比较费劲。因此,我决定尝试反编译 Android 程序,直接阅读源代码。

这里我介绍反编译安卓程序,得到 Java 代码的详细方法。

请尊重他人劳动成果,勿将此方法用于恶意活动。

解包 .apk

APK 是 Application Package File 的缩写。.apk 文件的实质是一个 .zip 压缩包,包含 Android 运行 APP 所需以下内容:

  • 编译好的代码文件 .dex
  • assets 目录
  • 证书
  • 文件资源(resources.arsc
  • 文件清单(AndroidManifest.xml

想要得到源码,首先需要解包 .apk 文件。我们只需要将后缀名从 .apk 改为 .zip,然后按照常规方式解压即可

处理 AndroidManifest.xml

AndroidManifest.xml 是一个传统的Android清单文件,用于描述该应用程序的名字、版本号、所需权限、注册的服务、链接的其他应用程序。为了搞清楚程序到底做了什么,我们有必要知道这个文件的具体内容。

如果用文本编辑器打开 AndroidManifest.xml,我们会发现其中是一堆乱码。

AndroidManifest.xml 乱码

实际上,AndroidManifest.xml 已经被处理成二进制格式,我们用文本模式打开它乱码是理所应当的。为了正确读取其中内容,我们需要用 AXMLPrinter2 这个工具对它进行处理,将它还原成文本格式。

之后我们需要运行

1
java -jar AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest.txt

将二进制格式的 AndroidManifest.xml 转换为文本格式,并保存在 AndroidManifest.txt 之中。这样我们就能阅读其中信息了。

处理 .dex 文件

.dex 文件是 Java 标准的 classes 文件通过 DEX 编译后的文件格式,是用于在 Dalvik 虚拟机上运行的主要代码部分。显而易见,这是我们需要处理的重头戏。

处理 .dex 文件就是要将其还原为 Java 标准的 .jar 文件。为此我们需要用到 dex2jar 这个工具。

解压后,我们在命令行中运行

1
/path/to/dex-tools/d2j-dex2jar.sh *.dex

Windows 用户运行

1
\path\to\dex-tools\d2j-dex2jar.bat *.dex

就能得到 classes.dex 相应的 classes-dex2jar.jar 文件。

处理 .jar 文件,得到 Java 源码

.jar 文件是 .class 文件的封装。jd-gui 这个小工具可以以图形化的界面查看 .jar 当中 .class 文件对应的 Java 源码。所得结果可读性非常高。

下载地址:

使用 jd-gui 打开上一步得到的 .jar 文件,就能看到 .class 对应的 Java 源码了。

使用 jd-gui 查看 Java 源码

按下快捷键 Command + Option + S 保存源码就好啦。

俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。