移动端环境配置与抓包基础
作为App爬虫的前置必修课,我们首先得解决「怎么看到App到底和服务器聊了什么」的问题——这就需要搭建好调试环境、配好工具链。
本文会从环境选型→核心工具命令→主流抓包配置→反抓突破四个维度,用3000字内的篇幅讲透所有操作细节。
1. 移动端调试环境:选模拟器还是真机?
先做选择题:我们通常有两种环境,各有明确的适用场景,没必要非要纠结“哪个更好”。
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可以让同局域网其他设备看控制台
第二步:手机配置(以雷电模拟器为例)
- 打开模拟器
设置→WLAN→长按“AndroidWifi”→修改网络
- 代理设为
手动,服务器填PC的局域网IP(Windows用ipconfig找,Mac/Linux用ifconfig找),端口填8080
- 打开模拟器浏览器,访问
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
操作流程(仅用于学习,请勿违规使用):
- 打开雷电模拟器ROOT
- 装Mitmproxy系统证书
- 启动
mitmweb -p 8080
- 配模拟器WiFi代理
- 用Frida+JustTrustMe启动读书APP
- 浏览几本书,打开
http://127.0.0.1:8081就能看到API啦!
总结
本文的核心内容可以总结为:
- 环境选模拟器优先,ROOT权限省很多事
- ADB记住10个常用命令,足够应付开发
- 抓包工具3选1,Mitmproxy适合Python开发者
- 反抓两个门槛:系统区证书+Frida+JustTrustMe
掌握这些,你就能“看到”大部分APP的数据流,为后续的协议分析和爬虫开发打下基础。