Files
MemRelay/projects/280dd2a0-d23d-4a71-91e1-dce4353163be/如何抓到 App 的 HTTPS 请求.md
T
memrelay fbcd116ca8 create: 如何抓到 App 的 HTTPS 请求
MemRelay-Operation: memory-save:rapt-capture-method-20260928
MemRelay-Resource: 88370fe7-bd1b-4184-8b84-afe72a7541e5
2026-09-28 02:37:21 +08:00

44 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 如何抓到 App 的 HTTPS 请求
type: experience
permalink: main/projects/280dd2a0-d23d-4a71-91e1-dce4353163be/如何抓到-app-的-https-请求
stable_id: 88370fe7-bd1b-4184-8b84-afe72a7541e5
scope: project
memory_type: experience
project_id: 280dd2a0-d23d-4a71-91e1-dce4353163be
usage_profile_id: 0c9feb46-d06e-43cd-9ef0-c5813c84a998
status: active
revision: 1
request_id: rapt-capture-method-20260928
created_at: '2026-09-27T18:37:19.908316+00:00'
updated_at: '2026-09-27T18:37:19.908316+00:00'
tags:
- capture
- api
- mitm
---
抓 App 的 HTTPS 要用已 root 的模拟器加系统证书,再把 CDN 的 443 转到本机 mitmproxy 反向代理。不要用浏览器游客登录。不要把 token、广告 ID 或账号写进记忆。
环境:模拟器 emulator-5556,机型 23113RKC6C,Android 12(SDK 32)。adb shell 已是 root,/system 可写。包名 com.leivideo.raptdrama。接口域名 apis.raptdrama.com,CNAME 到 Bunny CDN,出口 IP 会变(109.61.83.0/24、169.150.249.0/24、212.102.50.0/24 都出现过)。主机在模拟器里是 10.0.2.2。
为什么不用 Frida 直接读明文:已装过 Frida 16.5.9 的 android-x86_64 frida-server。libflutter.so 的 SSL 符号被剖掉,SSL_write 导不出来。扫堆只能扫到 SharedPreferences,扫不到 POST /app/ 这种完整请求行。Flutter 发行版不信任用户证书,也不走系统 HTTP 代理,所以不能只设 http_proxy。
成功做法:
1. 用本机已有的 mitmproxy CA(%USERPROFILE%\\.mitmproxy\\mitmproxy-ca-cert.pem)。openssl x509 -subject_hash_old 得到 c8750f0d,把 pem 推到模拟器 /system/etc/security/cacerts/c8750f0d.0,chmod 644。
2. adb shell stop 再 start,让 zygote 重新读系统证书。只放文件不重启框架,App 不信任这张证书。
3. 本机跑 mitmdump --listen-host 0.0.0.0 -p 8888 --mode reverse:https://apis.raptdrama.com,加一个脚本只打印方法、路径、头和正文键,apasstk、authorization、cookie、token、password、email 打成长度或占位。PYTHONUNBUFFERED=1,否则日志不刷出来。
4. 模拟器里 iptables -t nat -A OUTPUT,把上面三个 CDN 网段的 tcp dport 443 DNAT 到 10.0.2.2:8888。只 DNAT 单个 IP 会漏,因为任播 IP 会换。这台系统的 iptables 没有 owner 匹配,不能按 App 的 uid 过滤,所以用网段。反向代理会把这些连接都转到 apis.raptdrama.com,抓接口够用,不要长期开着。
5. 用 adb 操作界面:am start 打开 com.leivideo.raptdrama/.MainActivity,uiautomator dump 看坐标再 input tap。重装后第一次进首页才会重新请求 classifyv2;没重装时分类走本地缓存,网络上看不到。
6. 收尾必做:iptables -t nat -F OUTPUT,删掉 c8750f0d.0,停掉 mitmdump,再 stop/start 一次框架,否则证书仍在内存里受信任。frida-server 如果推过,一并杀掉并删除 /data/local/tmp/frida-server。
已核对的请求(头都一样,v2 和不带 v2 可共用):
- 设备头:User-Agent 为 RaptDrama/版本 (Android 系统; 型号; 品牌),x-device-* 、x-os-name=Android、x-os-version、x-app-version、x-app-build、accept-language 与 accept-language-custom 用原样语言,http_accept_language_custom 用小写。Accept-Encoding 为 gzip。登录后带 apasst。空 POST(游客登录、getUserInfo)正文为空,Content-Length 为 0,不是 {}。
- GET /app/open/classifyv2,无正文。重装后才抓到。
- GET /app/open/classify_video?type=分类id&page=页码,没有 limit。
- GET /app/open/orgin?class=new_releases 和 class=trending_now。以前说拿不到热门,是因为试的是不带参数或 type=trending,不是 class=trending_now。
- App 底部推薦页是 GET /app/open/foryou?page=1。桌面端清单的 Recommend 仍是 POST /app/open/recommend,正文 {page, limit},不要用热门替掉它,也不要接 foryou。
- POST /app/video/playlist 一次返回全部集;POST /app/video/playlistv2 每页 10 集,正文 {vid, page, before},第一页 before=1,后面为 0。桌面端先调不带 v2 的。
- 简介在 POST /app/video/videoinfo,正文 {vid},字段 video.desc。下载时写成剧目录下的简介.txt。
- fMP4 的 init.mp4 在 #EXT-X-MAP:URI 里,下载必须和分片一起存,否则 ffmpeg 报找不到 init.mp4。