--- 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: 2 request_id: rapt-capture-method-fix-apasstk-20260928 created_at: '2026-09-27T18:37:19.908316+00:00' updated_at: '2026-09-27T18:37:33.657969+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,扫不到完整的 HTTP 请求行。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。登录后带 apasstk。空 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 里,下载必须和分片一起存,否则转 MP4 报找不到 init.mp4。