前期准备

已 root真机或者Android模拟器,我这边使用MuMu模拟器,具体设置如下:

MuMu 模拟器下载地址:

MuMu模拟器官网_安卓12模拟器_网易手游模拟器

下载安装完成后,设置一下模拟器的 root 权限模式:

Untitled

设置模拟器的网络代理:

长按无线连接弹出设置选项框,点击修改网络。

Untitled

设置网络抓包代理:

Untitled

安装Charles SSL信任证书:

Untitled

Frida 动态调试工具

Mac 端安装

1
2
3
4
5
pip install frida
pip install frida-tools

# 版本与 frida-server 需要对齐
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
# Mac版本:
https://dl.google.com/android/repository/platform-tools-latest-darwin.zip
# Windows版本:
https://dl.google.com/android/repository/platform-tools-latest-windows.zip
# Linux版本:
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连接mumu模拟器
adb connect 127.0.0.1:7555

# 启动
adb start-server

# 关闭
adb kill-server

# 查看链接的设备
adb devices

# 使用adb 把frida-server推送到模拟器里
adb push frida-server /data/local/tmp/

# adb shell 进入模拟器
adb shell
cd /data/local/tmp/
ls -l

# 给 frida-server 添加权限
chmod 777 frida-server

# 运行
frida-server

在电脑端查看模拟器的启动相关进程, 能看到淘宝App的进程ID,说明连接成功。

1
frida-ps -U

Untitled

逆向分析代码:

使用Charles、Fiddle等抓包工具对淘系App进行抓包时,会发现总是抓不到包,出现请求不走Charles代理的情况。

这是因为淘系App底层网络通信的协议并不是普通的http协议,而是自己实现的一套私有协议Spdy。

我们需要逆向分析一下App,看看有什么方法是关于这个 Spdy的。

首先需要准备一个需要分析的 APK 包,然后使用 Jadx 工具分析。

下载地址:

Untitled

解压后打开 jadx-gui

Untitled

打开需要分析的APK文件:

Untitled

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

Spdy 方式请求数据。

Untitled

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

# 进程 ID frida-ps -U 命令查看得到
session = frida.get_usb_device().attach(24233)
# 或者 BundleID
# session = frida.get_usb_device().attach('com.taobao.taobao')
print(session)

# 获取当前活动
# rdev = frida.get_remote_device()
# session = rdev.attach("com.taobao.taobao")
# print(rdev)

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。

运行刚才写好的脚本

1
python3 app.py

Untitled

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

功能页面截图:

淘宝逛逛详情页截图.jpg

网络请求数据:
Untitled 10