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

作为App爬虫的前置必修课,我们首先得解决「怎么看到App到底和服务器聊了什么」的问题——这就需要搭建好调试环境、配好工具链。

本文会从环境选型→核心工具命令→主流抓包配置→反抓突破四个维度,用3000字内的篇幅讲透所有操作细节。


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

先做选择题:我们通常有两种环境,各有明确的适用场景,没必要非要纠结“哪个更好”。

维度模拟器(首推新手/基础开发)真机(特殊/生产级适配用)
成本免费(雷电/夜神/AVD都可免费使用)需要物理设备,测试多机型成本高
权限雷电/夜神默认ROOT,AVD可开关ROOT大部分新机ROOT困难,部分金融类APP禁用ROOT
效率多开/克隆/一键重置极快,网络可控多设备切换慢,部分受运营商/物理网络限制
兼容性少数强校验APP(游戏/银行)会拦截完全适配真实用户环境

1.1 主流模拟器快速连接ADB

选好模拟器后,第一步是用ADB把PC和模拟器“绑定”

# 先检查ADB是否正常(先装Android Studio SDK Platform-Tools,雷电/夜神自带也可用)
adb version

# 常用模拟器默认端口(多开需递增端口,比如雷电2是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就能看到设备ID了👇

List of devices attached
127.0.0.1:5555    device

2. ADB工具:10个命令覆盖99%爬虫场景

ADB(Android Debug Bridge)是PC和Android设备的「通信管道」,掌握以下命令组合即可,不用记太多零散的参数:

# 【连接类】解决找不到设备的“万能重启”
adb kill-server && adb start-server  # 先杀再开服务
adb devices                          # 确认设备状态(device=正常,offline=重连)

# 【应用类】找包名、装应用、一键启动
adb shell pm list packages -3        # 只看第三方应用(过滤系统自带,快速找包名)
adb install -r <本地APK路>          # -r=覆盖安装旧版本
adb uninstall <>                  # 保留数据加 -k
adb shell monkey -p <> -c android.intent.category.LAUNCHER 1  # 一键启动APP

# 【文件类】传证书、抓日志文件
adb push <本地文> /sdcard/          # 传文件到设备(临时目录用/sdcard最稳)
adb pull /sdcard/<设备文> ./        # 拉文件到PC当前目录

# 【调试类】一键截图、抓包前清后台
adb shell screencap /sdcard/tmp.png && adb pull /sdcard/tmp.png . && adb shell rm /sdcard/tmp.png  # 截屏3步合并成1
adb shell am force-stop <>         # 强制杀掉APP(抓包前必做,避免缓存干扰)

3. 主流抓包工具:3款选1个就行

抓包工具的核心逻辑全一样:手机WiFi设PC为代理→工具拦截流量→工具用自己的CA证书“冒充”服务器和手机通信。

我们根据操作系统和需求选工具:

  • Windows用户:首选 Fiddler Classic(免费、界面直观、插件多)
  • Mac/Linux/跨平台:首选 Charles(界面简洁、稳定)
  • 需要自动化/脚本化抓包:首选 Mitmproxy(Python生态完美适配)

3.1 Mitmproxy:Python开发者的本命工具

Mitmproxy有3种启动模式,新手先玩Web界面(mitmweb),熟了再用脚本模式:

第一步:安装与启动

# 用pip一键安装(Python3.8+就行)
pip install mitmproxy

# 启动Web界面(默认8080代理,8081是Web控制台端口)
mitmweb -p 8080 --web-host 0.0.0.0  # 加--web-host可以让同局域网其他设备看控制台

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

  1. 打开模拟器设置→WLAN→长按“AndroidWifi”→修改网络
  2. 代理设为手动,服务器填PC的局域网IP(Windows用ipconfig找,Mac/Linux用ifconfig找),端口填8080
  3. 打开模拟器浏览器,访问mitm.it,下载并安装证书(Android 7+必须安装到系统区,见第4章)

第三步:快速脚本化(抓JSON响应并保存)

很多APP的API返回都是JSON,我们可以写个10行左右的脚本自动保存👇

# 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):
    # 只抓JSON格式的响应
    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证书与SSL Pinning绕过

大部分APP现在都用HTTPS加密,这里有两个必过的门槛

4.1 Android 7+:必须把证书装到系统区

Android 7.0(API 24)之后,APP默认只信任系统预装的CA证书,我们自己装的“用户区证书”没用。

一键安装脚本(需要ROOT)

假设你已经用Mitmproxy生成了证书(mitmproxy首次启动会自动生成在~/.mitmproxy/目录),按以下步骤操作:

# 第一步:进入证书目录(Windows改成本地路径,比如C:\Users\你的用户名\.mitmproxy)
cd ~/.mitmproxy

# 第二步:获取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

# 第三步:推送到系统区并修改权限
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  # 重启生效

4.2 SSL Pinning:简单绕过用Frida+JustTrustMe

如果装了系统区证书还是抓不到,说明APP用了SSL Pinning(证书/公钥锁定)——它会检查服务器的证书是不是自己“内置的那一张”,不是的话直接断开连接。

最简单的绕过方法是用Frida动态Hook,配合现成的JustTrustMe.js脚本:

# 第一步:PC端安装Frida工具
pip install frida frida-tools

# 第二步:手机端下载对应CPU架构的frida-server(比如x86_64模拟器下frida-server-16.4.1-android-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并Hook
frida -U -f <你的APP包> -l JustTrustMe.js --no-pause

5. 快速实践:抓某读书APP的API

操作流程(仅用于学习,请勿违规使用):

  1. 打开雷电模拟器ROOT
  2. 装Mitmproxy系统证书
  3. 启动mitmweb -p 8080
  4. 配模拟器WiFi代理
  5. 用Frida+JustTrustMe启动读书APP
  6. 浏览几本书,打开http://127.0.0.1:8081就能看到API啦!

总结

本文的核心内容可以总结为:

  • 环境选模拟器优先,ROOT权限省很多事
  • ADB记住10个常用命令,足够应付开发
  • 抓包工具3选1,Mitmproxy适合Python开发者
  • 反抓两个门槛:系统区证书+Frida+JustTrustMe

掌握这些,你就能“看到”大部分APP的数据流,为后续的协议分析和爬虫开发打下基础。