Android 逆向

pkTool 工具下载:
https://github.com/iBotPeaches/Apktool/releases/tag/v2.7.0
下载完 jar 后,找一个你想要反编译的 apk,然后输入以下命令即可
1
| java -jar apktool_2.7.0.jar d com.taobao.taobao-10.24.20-441-2754.apk
|

然后我们看到 test 目录就生成了以下这些文件

那么 apktool 生成这些文件和目录分别是什么呢?
1 2 3 4 5 6 7
| - original 目录:保存了原始的 AndroidManifest.xml 和签名信息 - res 目录:应用程序的资源文件目录,包含了应用程序的布局文件、字符串资源、图片资源等。 - smali 目录:应用程序的 Smali 代码目录,包含了应用程序的所有 Smali 代码文件(Smali 就是字节码) - assets 目录:应用程序的 assets 目录,包含了应用程序需要使用的各种资源文件,例如音频、视频、图片、配置文件等。 - lib 目录:应用程序的库目录,包含了应用程序需要使用的库文件,例如 so 文件等。 - AndroidManifest.xml:应用程序的清单文件,包含应用程序的名称、包名、版本号、权限等信息。 - apktool.yml:是 APKTool 工具使用的配置文件,用于指定反编译和打包 APK 文件时的各种参数和选项。
|
输入以下命令进行回编译
1
| java -jar apktool_2.7.0.jar b taobao-10.24.20 -o taobao.apk
|

1 2 3 4 5 6
| Java.perform(function () { var SwitchConfig = Java.use('mtopsdk.mtop.global.SwitchConfig'); SwitchConfig.isGlobalSpdySslSwitchOpen.overload().implementation = function () { return false; } });
|
然后使用如下命令启动App进行抓包。抓包效果如下,可以看到已经能抓到了。
1
| frida -U -l hook.js -f com.taobao.taobao
|
使用模拟器来进行逆向
已 root真机或者Android模拟器,我这边使用MuMu模拟器,具体设置如下:
MuMu 模拟器下载地址:
MuMu模拟器官网_安卓12模拟器_网易手游模拟器
下载安装完成后,设置一下模拟器的 root 权限模式:

设置模拟器的网络代理:
长按无线连接弹出设置选项框,点击修改网络。

设置网络抓包代理:

安装Charles SSL信任证书:

Frida 动态调试工具
Mac 端安装
1 2 3 4 5
| pip install frida pip install frida-tools
frida --version
|
frida-server 模拟器或者真机服务端程序下载:(需要根据具体的架构版本下载对应的包,本教程是X86 intel 版本的Mac 所以选择 frida-server-16.0.19-android-x86_64.xz)
https://github.com/frida/frida/releases
下载完成之后需要使用 Android ADB 工具安装到对应的模拟器或者真机子上。
ADB工具下载地址:(已安装 Android Studio 自带)
1 2 3 4 5 6
| https://dl.google.com/android/repository/platform-tools-latest-darwin.zip
https://dl.google.com/android/repository/platform-tools-latest-windows.zip
https://dl.google.com/android/repository/platform-tools-latest-linux.zip
|
命令执行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| adb connect 127.0.0.1:7555
adb start-server
adb kill-server
adb devices
adb push frida-server /data/local/tmp/
adb shell cd /data/local/tmp/ ls -l
chmod 777 frida-server
frida-server
|
在电脑端查看模拟器的启动相关进程, 能看到淘宝App的进程ID,说明连接成功。

逆向分析代码:
使用Charles、Fiddle等抓包工具对淘系App进行抓包时,会发现总是抓不到包,出现请求不走Charles代理的情况。
这是因为淘系App底层网络通信的协议并不是普通的http协议,而是自己实现的一套私有协议Spdy。
我们需要逆向分析一下App,看看有什么方法是关于这个 Spdy的。
首先需要准备一个需要分析的 APK 包,然后使用 Jadx 工具分析。
下载地址:

解压后打开 jadx-gui :

打开需要分析的APK文件:

通过分析以及查找相关的字段,获取到比较关键的方法:isGlobalSpdySwitchOpen 这个方法返回 True 的话就回执行淘宝请求的私有协议,我们需要Hook这个方法,让它直接返回 False 不需要使用
Spdy 方式请求数据。

Frida 脚本编写
这边使用 Python 编写,也可以使用 JS 编写。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| import sys import frida
session = frida.get_usb_device().attach(24233)
print(session)
scr = """ Java.perform(function () { var SwitchConfig = Java.use('mtopsdk.mtop.global.SwitchConfig'); SwitchConfig.isGlobalSpdySwitchOpen.overload().implementation = function(){ var ret = this.isGlobalSpdySwitchOpen.apply(this, arguments); console.log("isGlobalSpdySwitchOpenl " + ret) return false } }) """ script = session.create_script(scr)
def on_message(message, data): print('msg: ' + message) if message['type'] == 'send': print("[*] {0}".format(message['payload'])) else: print(message)
script.on("message", on_message) script.load() sys.stdin.read()
|
Frida 正式抓包
打开 Charles 以及 SSL代理设置,模拟器打开淘宝APP。
运行刚才写好的脚本

如果 hook 相关函数成功会有日志输出,显示原来的方法调用返回信息,这样就可以抓到了淘宝的请求包了。
功能页面截图:

网络请求数据:
