移动端环境配置与抓包基础

要爬取 App 的数据,第一步就是看清 App 与服务器之间到底传输了什么。这离不开一套稳定好用的调试环境和抓包工具链。

本文会从环境选型 → 核心命令 → 抓包配置 → 反抓突破四个维度,带你一步一步搭建出自己的 App 抓包环境。


1. 移动端调试环境:模拟器还是真机?

选环境这件事其实不用纠结,两种方案各有明确的使用场景:

维度模拟器(推荐新手及基础开发)真机(特殊场景或生产适配)
成本免费(雷电、夜神、AVD 均可免费使用)需要物理设备,多机型测试成本高
权限多数模拟器默认 ROOT,随开随用新机型 ROOT 困难,部分金融 App 还会检测 ROOT
效率多开、克隆、重置极快,网络环境可控多设备切换慢,受运营商和物理网络限制
兼容性少数强校验 App(游戏/银行)会主动拦截完美适配真实用户环境

建议:日常开发、学习直接用模拟器,成本低、权限全,效率最高。

1.1 主流模拟器快速连接 ADB

选好模拟器后,第一步就是用 ADB 把 PC 和模拟器“绑”在一起:

# 先确认 ADB 版本(Android SDK Platform-Tools 已装好)
adb version

# 常用模拟器的默认端口(多开时端口会递增,例如雷电第二个实例为 5557)
adb connect 127.0.0.1:5555   # 雷电模拟器
adb connect 127.0.0.1:62001  # 夜神模拟器
adb connect 127.0.0.1:7555   # Mumu 模拟器

连接成功后,执行 adb devices 会看到设备状态:

List of devices attached
127.0.0.1:5555    device

2. ADB 常用命令:十个命令搞定日常开发

ADB 是 PC 与 Android 设备的通信桥梁。下面这些命令覆盖了 99% 的日常需求,不需要死记硬背,用到的时候回来查就行。

连接与状态

# 重启 ADB 服务,解决“找不到设备”的经典问题
adb kill-server && adb start-server
adb devices    # 确认设备状态:device=正常,offline=重连

应用管理

# 列出第三方应用包名,快速找到目标 App
adb shell pm list packages -3

# 安装与卸载
adb install -r <APK文件路>   # -r 表示覆盖安装
adb uninstall <>           # 想保留数据可以加 -k

文件传输

# 将证书、脚本等推送到手机的 /sdcard 目录(兼容性最好)
adb push <本地文> /sdcard/

# 从手机拉取文件到当前目录
adb pull /sdcard/<文件路> ./

常用调试技巧

# 一键截图并保存到本地
adb shell screencap /sdcard/tmp.png && adb pull /sdcard/tmp.png . && adb shell rm /sdcard/tmp.png

# 强制杀掉 App,抓包前清缓存
adb shell am force-stop <>

# 使用 monkey 命令启动指定 App
adb shell monkey -p <> -c android.intent.category.LAUNCHER 1

3. 主流抓包工具:三选一即可

所有抓包工具的核心原理都差不多:手机把 Wi-Fi 代理设为 PC → 工具拦截流量 → 工具用自己的 CA 证书“冒充”服务器与 App 通信,从而实现明文查看请求和响应。

根据操作系统和需求,可以这样选:

工具适用场景
FiddlerWindows 用户首选,界面直观,插件丰富
CharlesMac / Linux 用户或需要跨平台时首选
MitmproxyPython 开发者,需要自动化、脚本化抓包时首选

3.1 Mitmproxy:最适合 Python 抓包的工具

Mitmproxy 有三种启动方式,刚入手时可以先玩 Web 界面(mitmweb),熟悉后再用脚本模式进行自动化处理。

第一步:安装与启动

# 使用 pip 一键安装(需 Python 3.8+)
pip install mitmproxy

# 启动 Web 界面(代理端口 8080,Web 控制台端口 8081)
mitmweb -p 8080 --web-host 0.0.0.0

第二步:模拟器配置代理(以雷电为例)

  1. 打开模拟器 设置 → WLAN → 长按已连接的 WiFi → 修改网络
  2. 代理选择 手动,服务器填写 PC 的局域网 IP(Windows 用 ipconfig 查看,Mac / Linux 用 ifconfig
  3. 端口填 8080,保存后打开浏览器访问 mitm.it
  4. 根据提示下载并安装证书(Android 7.0+ 必须将证书安装在系统区,详见第 4 节)

第三步:编写脚本,自动保存 JSON 响应

很多 App API 返回的都是 JSON,我们可以用几行代码自动拦截并保存:

# save_json.py
from mitmproxy import http
import json
import os
from datetime import datetime

OUTPUT = "app_json_data"
os.makedirs(OUTPUT, exist_ok=True)

def response(flow: http.HTTPFlow):
    ct = flow.response.headers.get("Content-Type", "")
    if "application/json" not in ct:
        return

    try:
        ts = datetime.now().strftime("%Y%m%d_%H%M%S_%f")
        domain = flow.request.host.replace(".", "_")
        filename = f"{OUTPUT}/{ts}_{domain}.json"

        with open(filename, "w", encoding="utf-8") as f:
            json.dump({
                "url": flow.request.pretty_url,
                "method": flow.request.method,
                "response": json.loads(flow.response.text)
            }, f, ensure_ascii=False, indent=2)
    except Exception as e:
        print(f"保存失败: {e}")

启动脚本模式:

mitmdump -s save_json.py -p 8080

4. 反制抓包:证书锁定与绕过技巧

HTTPS 加密会给抓包带来两个门槛,好在每个都有现成的解决方案。

4.1 安装证书到系统区

Android 7.0(API 24)开始,App 默认只信任系统预装的 CA 证书,用户自己安装的证书会被忽略,所以必须把 Mitmproxy 的证书刷入系统区(需要 ROOT 权限)。

# 1. 进入 Mitmproxy 证书目录(Windows 对应 C:\Users\用户名\.mitmproxy)
cd ~/.mitmproxy

# 2. 获取 Android 系统要求的证书哈希值,并重命名
CERT_HASH=$(openssl x509 -inform PEM -subject_hash_old -in mitmproxy-ca-cert.pem | head -1)
mv mitmproxy-ca-cert.pem ${CERT_HASH}.0

# 3. 将证书推送到系统区并修改权限
adb root
adb remount   # 部分模拟器需要先解除 /system 只读挂载
adb push ${CERT_HASH}.0 /system/etc/security/cacerts/
adb shell chmod 644 /system/etc/security/cacerts/${CERT_HASH}.0
adb reboot    # 重启后生效

如果模拟器已经 ROOT,整个过程特别顺畅,这也是为什么前面推荐模拟器的原因之一。

4.2 绕过 SSL Pinning

装了系统证书后还是抓不到包,说明 App 启用了 SSL Pinning(证书锁定),它会主动校验服务器返回的证书是否与自己内置的证书一致,不一致就直接断开连接。

最快捷的绕过方法是 Frida + JustTrustMe

# PC 端安装 Frida
pip install frida frida-tools

# 下载对应架构的 frida-server 文件(如 x86_64 模拟器对应 x86_64 版本)
# 下载地址:https://github.com/frida/frida/releases

# 推送到手机并启动
adb push frida-server-* /data/local/tmp/
adb shell chmod 755 /data/local/tmp/frida-server-*
adb shell su -c /data/local/tmp/frida-server-* &   # 后台运行

# 下载 JustTrustMe.js(在 GitHub 搜索 “JustTrustMe frida”)
# 然后启动 App 并注入脚本
frida -U -f <目标App包> -l JustTrustMe.js --no-pause

这样,SSL Pinning 的校验逻辑就会被绕过,抓包工具又能正常解密 HTTPS 流量了。


5. 一次完整的实战流程

以抓取某读书 App 的 API 为例,把前面的知识串起来(仅限学习,勿违规使用):

  1. 打开雷电模拟器,确认已 ROOT
  2. 安装 Mitmproxy 系统证书
  3. 启动 mitmweb -p 8080
  4. 设置模拟器 Wi-Fi 代理
  5. 用 Frida + JustTrustMe 启动读书 App
  6. 翻几本书,浏览器打开 http://127.0.0.1:8081 就能看到实时 API 数据

整个过程从environment-setup到看到明文接口,十分钟内就能完成。


总结

本文的核心就四条:

  • 优先使用模拟器:ROOT 权限直接把障碍降到最低
  • ADB 命令会 10 条足够:覆盖应用管理、文件传输和简单调试
  • 抓包工具三选一:Python 开发者首选 Mitmproxy,方便脚本化
  • 突破反制两步走:系统区证书 + Frida+JustTrustMe 绕过 SSL Pinning

掌握了这些,你就有了一把“透视 App 数据流”的万能钥匙,为后续的协议分析和爬虫开发打下扎实基础。