爬虫工程师分享:三步就搞定 Android 逆向

本文源于我近期的一次公司内部分享,经过逆向某款 APP 来介绍逆向过程。因为仅做为学习用途,APP 的相关信息会被遮盖,敬请理解。前端

关于逆向

逆向——包括但不限于经过反编译、Hook 等手段,来解析一些功能的实现过程。算法

逆向在不少领域都有应用,好比现在爬虫技术已经遍地走,甚至不用写代码均可以爬取数据,致使前端开发的反爬意识也逐步提高。所以 JS、Android 等领域的逆向,已经成为爬虫开发者必备的技能之一。编程

本文介绍的是最典型常见的传参加密,在不少应用接口都能见到,若是咱们逆向解析出加密过程,就能够模拟出相同的密文,获得后端接口的“承认”。后端

逆向的准备

这里介绍下关于 Android 的逆向准备:安全

  • Android 真机或模拟器(最好是真机)
  • 安装 Android 5.0 或 6.0 版本
  • Fiddler、Charles 等抓包工具
  • Jadx、ApkTool 等反编译工具
  • dumpDex、FDex2 等脱壳工具
  • Java、Android 开发基础知识
  • Xposed 框架开发基础知识

逆向步骤

介绍一下本文逆向的步骤:微信

固然,用三步归纳,看上去像“把大象塞进冰箱分为几步”。逆向做为一项与应用开发者对抗的网络安全技术,其手段花样多端,有时甚至不须要代码也能够完成逆向,因此这个归纳仅对应文中的遇到状况。网络

定位目标

本次逆向是针对某款 APP 的订单接口,首先咱们使用抓包工具捕获订单列表请求,下图为 Charles 界面:框架

能够看到参数里的 data 字段是密文,咱们就使用这个 API 做为目标切入点。工具

反编译 APK

这里使用的反编译工具是 Jadx,它能够将 APK 直接反编译成 Java 代码,而且具备 GUI 界面方便操做,以下图所示:学习

经过包名和一些代码分析,肯定是被 360 加固后,接下来须要尝试脱壳。

脱壳使用的是 FDex2,这是一款基于 Xposed 框架的 Hook 插件,对 360 加固比较有效。它的原理是 Hook ClassLoader,而后经过反射调用 getDex 方法获取 Dex 对象并导出,这里的 Dex 就是 APP 真正执行的部分。固然并非全部加固均可以被 Hook 到,更多脱壳手段还须要进阶研究。

FDex2 使用方式很简单,在 Xposed 框架里激活后,选择目标 APP,而后从新打开 APP 后,被捕获的 Dex 文件会被保存下来,以下图所示:

Dex 是什么?简单地说,在 APK 构建过程当中,Java 代码编译后产生的 class 文件,须要再转化成 Dex 文件,才能被 Android 虚拟机运行。

所以咱们获得的 Dex 文件,就能够再次反编译成 Java 代码,咱们仍是使用 Jadx,它一样支持 Dex 格式。

因为 Dex 有体积限制,会被分包,如上图咱们导出了不止一个文件,能够依次加载它们,经过搜索目标 API 的关键词,来找到目标代码块,以下图所示:

代码通常都会被反混淆,变量和方法名都是 a b c d 这样,而后搜索一个方法名,会发现有一万个同名的变量。还好 Jadx 内置了反混淆,开启后变量和方法被重命名为惟一编号,这样搜索时就不会有重名的状况了。

以后咱们经过 Jadx 将代码导出成 Gradle 项目,借助 IDEA 的强大功能开始进行代码分析。

分析代码

因为大部分方法都是被重命名的,致使可读性严重降低,没法推测每一个方法究竟是什么功能,以下图这些代码:

第一眼你除了知道它是 Google 开发包以外,没法再得到更多信息。

因此分析代码这个步骤,彻底是考验你的 Java 基本功 + 耐心,两者缺一不可。

不过不要退缩,咱们只要遵循一些技巧,就能够大幅减小工做量。因为分析过程比较繁琐,这里就不结合具体代码了,只作一些理论总结:

  1. 从目标 API 开始入手,跟踪执行流程: 好比咱们刚才已经搜索到关键词代码,那就从那一行开始,经过 IDEA 查看方法功能,能够一路向下点击。
  2. 只分析涉及代码块,缩小分析范围: 请求过程一般会构建 Request 对象,那参数加密必定就在构建对象以前,咱们只要找到构建 Request 对象的代码,而后查看加密参数被传入以前都通过了怎样的处理,其余代码所有无视。
  3. 将部分代码块复制出来进行执行: 虽然反编译的项目代码没法被总体执行,但对于冗长难懂的方法代码,咱们能够连同相关代码一块儿复制到一个新项目中,进行编译执行,方便咱们调试。
  4. 尝试搜索一些关键词: 代码并不会全部都被混淆,能够尝试全局搜索一些关键词。好比 Java 经常使用的加密算法,咱们能够搜索 RSA、AES、MD五、Encrypt、public_*key 这些关键词和正则匹配,能搜到再好不过了。

当你找到了加密方法,那么能够复制出来独立执行,而后本身构建参数传入加密,经过模拟请求,看接口是否正常返回。

须要注意,若是不能正常请求,并不必定是你找错了地方,也有可能代码自己有误,反编译的代码是有概率会出现这种状况的,致使你执行的和 APK 执行的结果不一样。遇到这种状况,只能经过其余手段来修正代码,如阅读 Smali 代码、经过 Hook 等手段,这种状况比较复杂,后续会有文章单独介绍。

逆向以后

完成代码分析后,恭喜你已经成功完成一次逆向,接下来就能够实现一些功能,好比模拟登陆请求。建议直接使用 Java 代码,由于大部分加密用的是 Java 内置的 RSA / AES 加密算法,其余语言的第三方库实现并不充分。


至此本次逆向分享结束,逆向是一个大课题,本文因为篇幅缘由,也只能将常见套路的大体流程介绍一下,后续必定追加更多细节部分的文章。

本文首发自个人微信公众号:面向人生编程

关注后回复如下信息获取更多资源 回复【资料】获取 Python / Java 等学习资源 回复【插件】获取爬虫经常使用的 Chrome 插件 回复【知乎】获取最新知乎模拟登陆
相关文章
相关标签/搜索