目标:在**办(梆梆企业版加固)正常联网的前提下,用 Burp 看到明文 HTTP 报文。
真机环境:小米9 / MIUI(Android 11)/ 自研内核 root(ShadowCore)
电脑环境:Windows + Burp Suite Pro 2022.2.3
最后验证:2026-11-03 10:50,App 首页/服务/我的全部正常,Burp 持续有流量
系统代理关掉(检测天然过)→ iptables 把 App 的 443 在内核层改道到本地 8080 → adb reverse 送到电脑 Burp。
两条都要命:
开系统代理后,启动即弹原生 Dialog:
当前 Activity 直接暴露检测模块:
检测实现(hook 日志实锤)—— 逐个查 System.getProperty:
就算绕过检测,Burp 也一条流量都没有。ss 实锤 App 是直连:
它走自己的 native 网络栈。所以必须在更底层(iptables)动手。
为什么之前 v0.5/v0.6 能抓到 URL?那是 WebView/Weex 加载静态资源
(index.js / 图片),走的是 Chromium 自己的代理逻辑,会读系统代理。
真正的业务 API 一直是直连。
App 包名与 uid:
Android 7+ 用户证书不再被 App 信任,必须装进 system 证书目录。
做法是 bind mount(不 remount、不碰 dm-verity)。
实测 Burp 2022.2.3 的 hash 是 9a5ba575(不同 Burp 版本/CA 会变)。
cert_setup.sh 做的事:把原系统 139 张证书拷进 /data/adb/cacerts,
再放入我们的 1 张 → mount -o bind /data/adb/cacerts /system/etc/security/cacerts。
必须拷全系统证书,否则 App 里所有正常 HTTPS 全炸。
注意:burp_proxy.py 走的是系统代理路线,只适合验证链路。
真正抓苏服办要用第 4 节的透明代理。
为什么用 reverse 而不是同 Wi-Fi:
验证手机侧确实有监听:
默认是 0。不开的话 REDIRECT 到 127.0.0.1 的包会被内核静默丢弃 ——
规则看着加了、计数也在涨,但连接永远建立不起来。
用 -I OUTPUT 1 插到最前面,确保优先于系统的 wmsctrl_nat_OUTPUT 链。
系统代理关着 → ProxyAlertActivity 的检测天然通过,不需要任何 hook。
Proxy → Options → Proxy Listeners → 选中 127.0.0.1:8080 → Edit
→ Request handling 标签 → 勾选 "Support invisible proxying (enable only if needed)" → OK
不开会怎样:Burp 把 TLS ClientHello 当成 HTTP 请求解析,一直等完整
请求头 → 连接挂死 → 表现为 App 卡在闪屏、8080 上一堆 ESTABLISHED 不释放。
验证 Burp 是否已开(不需要手机):
返回证书长度 → 已开;超时 → 没开。
期望(pkts 会持续增长):
期望有 ESTABLISHED + TIME_WAIT。
直接操作 App(点登录、进服务、搜索),Burp 的 HTTP history 就会出现
ydzt.jszwfw.gov.cn 的明文请求。
证书可以留着(bind mount 重启后就没了,不影响日常)。
如果 pinning 实在绕不过,可以完全放弃 TLS 层,直接在 App 进程里
拿加解密后的明文:
优点:确定性最高,pinning 完全不影响。
缺点:看不到原始 HTTP 报文格式(Header、状态码、Cookie 顺序)。
即使 TLS 通了,App 的部分业务数据还有第二层 AES 加密。
下面这些是 v0.5/v0.6 通过 hook SecretKeySpec / Cipher 拿到的:
解密示例(Python):
实测明文(埋点上报):
KEY-2 解出来是 java.util.HashMap 的序列化字节(sr java.util...loadFactor...threshold)。
安全警告
检测到系统代理开启,出于安全考虑请关闭代理后重新启动应用
[退出] 4秒后自动关闭
com.hanweb.android.product.utils.proxy.ProxyAlertActivity
http.proxyHost http.proxyPort
https.proxyHost https.proxyPort
socksProxyHost socksProxyPort
jszwfw.activity 192.168.137.60:46580 -> 124.236.19.250:443
jszwfw.activity 192.168.137.60:42808 -> 124.236.19.250:443
jszwfw.activity 192.168.137.60:42822 -> 124.236.19.250:443
jszwfw.activity 192.168.137.60:46580 -> 123.183.232.33:443
jszwfw.activity 192.168.137.60:49918 -> 49.77.204.17:443
# 包名
com.hanweb.android.jszwfw.activity
# uid(实测 10264,换机/重装可能变,脚本会自动查)
adb shell dumpsys package com.hanweb.android.jszwfw.activity | grep userId=
curl -s -o certs/burp_ca.der 4c7K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5J5y4#2)9J5k6e0m8Q4x3X3f1H3i4K6u0W2x3g2)9K6b7e0R3H3z5o6m8Q4x3V1k6U0k6i4u0@1
cd certs
openssl x509 -inform DER -in burp_ca.der -out burp_ca.pem
H=$(openssl x509 -in burp_ca.pem -subject_hash_old -noout | head -1)
cp burp_ca.pem "$H.0"
echo "证书名: $H.0"