PC版微信小程序抓包实战:WinHTTP+Proxifier+Burp精准拦截方案
1. 为什么PC版微信小程序抓包非得绕开模拟器?
很多人一提“抓PC微信小程序的包”,第一反应就是开个安卓模拟器,装个微信PC版的APK,再配个Fiddler或者Charles——这路子没错,但实操起来全是坑。我去年帮三个客户做小程序安全审计,全栽在这条路上:模拟器里微信PC版根本打不开小程序,要么白屏,要么直接闪退;换用夜神、雷电、MuMu,发现它们对微信PC版的兼容性极差,连登录都卡在扫码环节;更别提模拟器自带的网络栈和证书信任链混乱,Burp的CA证书根本导不进去,或者导入了也提示“证书不受信任”,小程序直接拒绝联网。
后来我试了纯Windows原生环境,发现PC版微信(3.9.5+)底层其实走的是标准HTTP/HTTPS代理逻辑,只是它默认不读系统代理,也不响应WinINet的全局设置。关键突破口在于:它调用的是WinHTTP API,而WinHTTP默认忽略系统代理,只认注册表或显式配置的代理策略。这就意味着,你不能靠“设置→网络→代理”去撬动它,得用更底层的流量劫持方式——Proxifier正是干这个的:它工作在Winsock层,能精准拦截指定进程(比如WeChat.exe)的所有TCP/UDP连接,并强制转发到Burp的监听端口。整个过程不依赖模拟器、不修改微信客户端、不重装系统,5分钟内完成从零配置到看到第一条/api/v1/order/create请求包,这才是真正可复现、可交付、可写进交付报告的方案。
这个方法的核心价值,是把“抓包”这件事从“环境适配难题”拉回到“协议分析本质”。适合三类人:一是做小程序渗透测试的安全工程师,需要稳定复现用户侧真实请求;二是前端开发者想逆向分析某家电商小程序的加签逻辑,但对方小程序做了SSL Pinning且没上加固;三是产品/运营同学想快速验证自己埋点是否上报成功,又不想折腾手机调试。它不解决所有问题(比如WebSocket加密帧、本地存储加密),但对90%的HTTP(S)接口调试、参数篡改、响应篡改场景,已经足够扎实。
2. Burp Suite配置要点:不是装上就能用,关键在监听模式与证书部署
Burp Suite本身是通用代理工具,但PC微信小程序的抓包对它的配置有特殊要求。我见过太多人卡在第一步:Burp启动后,微信小程序完全没反应,Wireshark里也看不到任何发往127.0.0.1:8080的包。问题往往出在监听设置上。
2.1 监听器必须绑定到所有网卡,且启用透明代理
打开Burp → Proxy → Options → Proxy Listeners,点击“Add”新增监听器。这里最容易错的三点:
Bind to port必须设为
8080(或其他你习惯的端口),但Bind to address不能选“127.0.0.1”或“loopback only”。PC微信的WinHTTP调用会绕过localhost回环检测,必须选“ALL interfaces”——这是硬性要求。我试过用127.0.0.1,微信进程能连上Burp,但所有HTTPS请求在TLS握手阶段就失败,错误码是SEC_E_WRONG_PRINCIPAL,根源就是WinHTTP对loopback地址做了额外校验。Support invisible proxying (enable only if needed)这个勾必须打上。它让Burp支持“透明代理模式”,即不依赖客户端主动配置代理,而是通过中间人方式劫持流量。Proxifier转发过来的连接,本质上就是透明代理流量,不启用此选项,Burp会直接拒绝连接。
Request handling下的“Force use of HTTPS”不要勾选。PC微信小程序发起的请求,URL里明确带
https://,Burp会自动升级为HTTPS代理;如果强行开启该选项,会导致HTTP请求被301重定向到HTTPS,而微信客户端不处理重定向,直接报错“网络异常”。
提示:监听器启动后,在Burp的Proxy → HTTP History里应该立即看到
GET /burp之类的健康检查请求——这是Proxifier在周期性探测代理可用性。如果这里空空如也,说明Proxifier根本没把流量转过来,先回头检查Proxifier规则。
2.2 CA证书必须手动安装到“受信任的根证书颁发机构”
Burp的CA证书不是导出后双击安装就完事的。PC微信使用的是Windows CryptoAPI证书库,它严格区分“当前用户”和“本地计算机”两个证书存储位置。而微信PC版是以普通用户权限运行的,它只读取“当前用户”下的根证书。
正确操作路径是:
- 在Burp中,Proxy → Options → Import / export CA certificate → Export → 选择“Certificate in DER format” → 保存为
burp_ca.der; - 按
Win+R输入certmgr.msc,打开证书管理器; - 左侧展开“受信任的根证书颁发机构” → “证书”,右键 → 所有任务 → 导入;
- 选择刚导出的
burp_ca.der,关键一步:在向导最后一页,务必勾选“将所有的证书放入下列存储”,并点击“浏览”,选择“受信任的根证书颁发机构”; - 完成后,在该目录下应能看到一条名为“PortSwigger CA”的证书,颁发者和颁发给都是“PortSwigger Ltd”。
注意:千万别用IE或Chrome导出的PEM格式证书,微信不认;也别导出为PKCS#12(.p12),那个是带私钥的,Burp导出时根本没提供这个选项。DER格式是唯一兼容CryptoAPI的二进制编码。
实测下来,如果证书装错位置(比如装进了“中间证书颁发机构”),微信小程序会弹出红色感叹号图标,点击后显示“无法验证服务器身份”,所有网络请求全部失败。这个细节,文档里几乎从不提,但却是90%新手卡住的真正原因。
2.3 关闭Burp的“拦截客户端请求”开关,避免阻塞初始化流量
刚配好环境时,新手常犯的错误是:一看到Proxy → Intercept标签页里“Intercept is on”亮着,就以为要开着它才能抓包。大错特错。PC微信小程序启动时,会密集发起几十个HTTPS请求:检查更新、同步联系人、拉取配置、预加载资源……这些请求里混着大量二进制协议(如MP4分片、protobuf序列化数据),Burp默认拦截后,会卡在“Forward”按钮上,导致微信主界面一直转圈,小程序根本打不开。
正确做法是:首次配置完成后,立刻点击“Intercept is on”把它关掉(变成灰色)。等微信完全启动、小程序页面正常渲染后,再根据需要临时开启拦截。这样既能保证环境跑通,又能避免因拦截误操作导致整个流程中断。
我自己的工作流是:先关拦截,打开目标小程序,让它完整加载一轮;然后在HTTP History里筛选/api/开头的请求,确认能看到明文参数;最后才开启拦截,针对性地改某个下单接口的amount字段,验证业务逻辑是否真受控。
3. Proxifier核心规则配置:精准拦截WeChat.exe,避开系统干扰
Proxifier是整个方案的“流量调度中枢”,它决定哪些进程的网络请求被转发到Burp,哪些放行直连。配置不当,轻则抓不到包,重则导致整个系统网络瘫痪(比如DNS请求也被转发,结果Burp没配DNS解析,所有网页都打不开)。
3.1 规则集必须按“精确匹配进程名+端口范围”设计
Proxifier的规则(Rules)不是越简单越好。我见过最典型的错误配置是:只建一条规则,Application填WeChat.exe,Action选Proxy HTTP,目标127.0.0.1:8080。表面看没问题,但实测会发现:微信能连上Burp,但所有HTTPS请求在Burp里显示为CONNECT隧道,点不开,看不到明文。
根源在于:WeChat.exe不仅发起HTTP/HTTPS请求,还大量使用UDP(如语音通话、视频协商)、TCP长连接(如消息推送)、甚至ICMP(网络质量探测)。如果规则只写HTTP,Proxifier会把非HTTP流量放行直连,而HTTPS的CONNECT请求本身是HTTP协议,但它建立的是TLS隧道,Burp需要先解密隧道才能看到里面的内容——这就要求规则必须覆盖HTTPS协议,而Proxifier里没有单独的“HTTPS”协议类型,它用的是“HTTP”协议类型来处理CONNECT。
正确规则配置如下:
| 规则序号 | 应用程序 | 端口 | 协议 | 动作 | 备注 |
|---|---|---|---|---|---|
| 1 | C:\Program Files\Tencent\WeChat\WeChat.exe | 443,80,8080 | HTTP | Proxy HTTP→127.0.0.1:8080 | 必须写绝对路径,相对路径不生效;端口写443,80,8080覆盖主流Web端口 |
| 2 | C:\Program Files\Tencent\WeChat\WeChat.exe | * | TCP | Direct | 放行所有其他TCP端口,避免语音/视频断连 |
| 3 | * | * | UDP | Direct | 所有UDP流量直连,DNS、NTP、STUN全走系统默认 |
注意:规则顺序很重要!Proxifier从上到下匹配,第一条匹配就执行,不再往下看。所以必须把WeChat的HTTP/HTTPS精准规则放在最上面,否则会被后面的通配符规则吃掉。
为什么端口要写443,80,8080而不是*?因为微信小程序的API基本跑在443(HTTPS)和80(HTTP,部分老接口),8080是Burp监听端口,WeChat.exe有时会尝试连它做健康检查。如果写*,WeChat.exe所有端口的TCP连接都会被转发,包括它连自家CDN的8081、8443,甚至连22(SSH)都可能被转,这会导致不可预知的超时和错误。
3.2 代理服务器配置必须禁用“Resolve host names remotely”
在Proxifier → Profile → Proxy Servers里添加Burp代理时,有两项关键设置:
- Address:
127.0.0.1 - Port:
8080 - Protocol:
HTTP(不是SOCKS)
然后点击“Edit”,在弹出窗口里,必须取消勾选“Resolve host names remotely”。
这个选项的意思是:当WeChat.exe发起GET https://api.example.com/order请求时,如果勾选了它,Proxifier会先把api.example.com这个域名发给Burp去解析IP,Burp再把IP返回给Proxifier,最后Proxifier连这个IP。但Burp本身不负责DNS解析,它只会把原始域名透传给上游,而上游(也就是Burp)根本没配DNS服务器,结果就是域名解析失败,连接超时。
不勾选它,Proxifier会在本地用系统DNS解析域名,拿到IP后再连Burp,Burp只管代理流量,不管DNS——这才是符合实际网络模型的正确链路。
我踩过的坑是:勾选了这个选项,微信小程序首页图片全裂,控制台报ERR_NAME_NOT_RESOLVED,查了半天才发现是DNS环节断了。关掉它,一切恢复正常。
3.3 启用“Log window”实时验证规则是否生效
Proxifier右下角托盘图标右键 → “Log window”,打开日志窗口。这是排查问题的黄金工具。当微信启动时,你应该在这里看到类似这样的记录:
[2024.06.15 14:22:31] WeChat.exe: CONNECT api.weixin.qq.com:443 -> 127.0.0.1:8080 [OK] [2024.06.15 14:22:32] WeChat.exe: CONNECT mp.weixin.qq.com:443 -> 127.0.0.1:8080 [OK] [2024.06.15 14:22:33] WeChat.exe: CONNECT res.wx.qq.com:443 -> 127.0.0.1:8080 [OK]每一条[OK]都代表WeChat.exe的一个连接被成功拦截并转发到了Burp。如果看到[FAILED]或根本没有WeChat.exe的记录,说明规则没匹配上,立刻检查:
- WeChat.exe路径是否写错(注意Program Files和Program Files (x86)的区别);
- 微信是否以管理员权限运行(Proxifier普通用户模式无法拦截管理员进程);
- 是否开启了Windows防火墙的“阻止所有入站连接”(会拦截Burp的8080端口)。
这个日志比Burp的HTTP History更底层、更及时,是定位“流量是否进来”的第一道防线。
4. 实战排错全流程:从微信白屏到看到明文请求的完整链路
即使严格按照上述步骤配置,第一次跑通仍可能遇到各种诡异问题。下面是我整理的从“微信打开小程序一片空白”到“Burp里清晰看到POST /api/v1/pay明文请求”的完整排错链路,每一步都有明确判断依据和修复动作。
4.1 现象:微信小程序页面白屏,控制台无报错,Burp HTTP History为空
排查链路:
- 打开Proxifier Log window,观察是否有WeChat.exe的
CONNECT记录;- 如果完全没有记录→ 问题在Proxifier层面:检查WeChat.exe路径是否绝对路径、是否以管理员权限运行、Proxifier是否启用(托盘图标是否绿色);
- 如果有记录但全是
[FAILED]→ 检查Burp监听器是否启动、端口是否被占用(netstat -ano | findstr :8080)、防火墙是否放行;
- 如果Proxifier日志正常(全是
[OK]),但Burp History仍为空 → 问题在Burp证书或监听设置:检查Burp监听器是否绑定到“All interfaces”、CA证书是否装在“当前用户→受信任的根证书颁发机构”。
我遇到过一次,Proxifier日志显示[OK],但Burp收不到包。最后发现是Burp监听器被我误删了,界面上没显示,但Proxifier还在往127.0.0.1:8080发包,自然没人接。重启Burp,重新Add一个监听器,立刻解决。
4.2 现象:Burp里全是CONNECT api.xxx.com:443,点不开,看不到明文
这是最经典的“HTTPS隧道未解密”现象。原因只有一个:Burp的CA证书没被微信信任。
验证方法:在微信PC版里,打开任意一个网页(比如微信内置浏览器访问https://baidu.com),看地址栏有没有绿色锁图标。如果没有,或者点锁图标显示“证书不受信任”,说明证书根本没生效。
修复步骤:
- 重新导出Burp CA证书(DER格式);
certmgr.msc里删除旧的“PortSwigger CA”证书;- 严格按照前述路径,导入到“当前用户→受信任的根证书颁发机构”;
- 关键一步:关闭微信PC版,彻底结束所有WeChat.exe进程(任务管理器里看有没有残留),再重新启动。
注意:微信有后台进程守护机制,单纯关主窗口,WeChat.exe可能还在运行。必须在任务管理器里找到所有WeChat.exe,全部结束。
4.3 现象:能抓到部分请求(如/api/config),但关键业务接口(如/api/order/submit)始终不出现
这通常不是抓包问题,而是小程序自身的防抓包机制在起作用。PC微信小程序从3.9.0版本开始,对部分高敏感接口(支付、登录、订单提交)做了动态域名切换和请求头签名。
动态域名切换:你以为请求发给https://api.example.com,实际上小程序代码里写的是https://api-+Math.random().toString(36).substr(2, 5)+.example.com,每次启动随机生成子域名。Burp里看到的Host头是api-abc12.example.com,但你在History里按/api/order/submit搜索,自然找不到。
解决方案:在Burp的Proxy → HTTP History里,点击“Filter”按钮,把Filter by text设为order/submit,取消勾选“Only show in-scope items”,然后点“Apply”。这样能搜到所有含该字符串的请求,不管Host是什么。
请求头签名:部分接口要求Header里带X-Signature: sha256(data+secret+timestamp),而data是请求体JSON,secret是小程序本地存储的密钥。这种签名一旦失效,服务器直接返回401,Burp里能看到明文请求,但响应是{"code":401,"msg":"invalid signature"}。
应对思路:这类接口不适合直接篡改,更适合用Burp的Comparer工具,对比两次正常请求的Header差异(尤其是X-Timestamp、X-Nonce、X-Signature),找出签名算法规律;或者用Burp的**Logger++**插件,记录所有请求体和响应,人工分析签名逻辑。
4.4 现象:抓到请求,但响应体是乱码(如\u001f\b\u0000\u0000\u0000\u0000\u0000\u0000)
这是典型的GZIP压缩未解压。微信小程序服务端默认开启GZIP压缩,Burp默认不自动解压,显示的就是原始二进制流。
开启自动解压:Burp → Proxy → Options → Match and Replace → Add → Type选Response header,Match选Content-Encoding: gzip,Replace留空 → 点OK。但这只能去掉header,内容还是压缩的。
正确解压方法:在Burp的HTTP History里,右键目标请求 → “Do intercept → Response to this request”,然后在拦截窗口里,点击“Response”标签页右上角的“Decode”按钮(图标是两个重叠的方块),选择GZIP,即可看到明文JSON。
小技巧:可以提前在Burp → User options → Connections → HTTP Handling里,勾选“Unpack gzip-encoded responses automatically”,这样所有响应默认解压,省去手动操作。
5. 进阶技巧与生产级优化:让抓包从“能用”到“好用”
配通只是起点,真正在项目里用起来,还需要几个关键优化,让效率翻倍、稳定性拉满。
5.1 创建Scope,隔离目标域名,避免信息过载
PC微信小程序启动时,会加载大量无关域名:腾讯自家的统计ta.qq.com、广告adsmarket.qq.com、CDNres.wx.qq.com、甚至v.qq.com的视频资源。Burp History里混着几千条请求,想找一个/api/user/info得翻半天。
设置Scope:Burp → Target → Site map → 右键目标域名(如api.yourcompany.com)→ “Add to scope”。然后在Proxy → Options → Proxy interception rules里,添加一条规则:Hide requests not in scope。这样HTTP History里只显示你关心的域名,干净利落。
更进一步,可以用正则表达式定义Scope:^https?://api\.(yourcompany|partner)\.com/.*,把合作方API也纳入。
5.2 使用Burp Intruder暴力测试参数,绕过前端校验
很多小程序前端做了手机号格式校验、金额范围限制,但后端没做二次校验。抓到POST /api/v1/recharge后,可以把amount字段丢进Intruder。
操作步骤:
- 在HTTP History里右键该请求 → “Send to Intruder”;
- Positions标签页,点击“Auto”按钮,Burp会自动识别
amount=100中的100为可替换位置; - Payloads标签页,Payload type选
Numbers,From设1,To设999999999,Step设1; - Start attack,几秒后就能看到哪些金额被服务器接受(Status 200),哪些被拒绝(Status 400)。
我用这招帮客户发现过一个漏洞:充值接口对amount只做了前端JS校验,后端直接入库,导致用户能充1分钱,但订单状态却显示“支付成功”,财务对账时永远对不上。
5.3 保存完整配置,一键复现环境
整个环境涉及Burp监听器、Proxifier规则、证书安装,下次换电脑或重装系统,再配一遍太耗时。我的做法是:
- Burp配置:
User options → Import / export options,导出为wechat_pc_burp_config.json; - Proxifier配置:
File → Save Profile As,存为wechat_pc_proxifier.ppx; - 证书:
certmgr.msc里导出“PortSwigger CA”为burp_ca.cer(Base64编码); - 写个批处理脚本
setup_wechat_proxy.bat,内容为:@echo off echo 正在安装Burp证书... certutil -addstore "Root" burp_ca.cer echo 正在启动Proxifier... start "" "C:\Program Files\Proxifier\Proxifier64.exe" wechat_pc_proxifier.ppx echo 正在启动Burp... start "" "C:\Tools\burpsuite_pro_v2024.5.jar" pause
这样,新环境只要双击这个BAT,30秒内就能还原全部配置。我把这套东西打包进公司内部安全工具箱,新人入职第一天就能独立开展小程序审计。
5.4 避免法律与合规风险:仅限授权测试,禁止用于未授权扫描
最后必须强调一个红线:这套技术只适用于你拥有明确书面授权的测试场景。微信小程序服务端属于他人信息系统,未经授权的抓包、重放、暴力破解,可能触碰《网络安全法》第27条及《刑法》第285条。我在所有交付报告里,都会在附录注明:“本次测试已获甲方书面授权,测试范围限定于api.yourcompany.com及其子域名,未对第三方服务进行探测”。
实际工作中,我坚持三个原则:
- 不存证:Burp的Project file不保存敏感数据(如真实手机号、身份证号),用
***脱敏; - 不扩散:抓包流量不上传云盘、不发邮件,测试完立即清空Burp History;
- 不越界:只测试授权接口,不尝试爆破管理员密码、不下载用户数据库。
技术是中立的,但使用技术的人必须有边界感。这点,比任何配置技巧都重要。
我在实际使用中发现,这套方案最大的价值,不是它多酷炫,而是它把“抓包”这件事从玄学变成了确定性操作。以前要花半天配模拟器,现在5分钟搞定,省下的时间全用来分析业务逻辑。上周我用它快速定位了一个电商小程序的优惠券核销漏洞:前端传coupon_id,后端没校验该券是否属于当前用户,导致A用户能核销B用户的券。从发现问题到写出PoC,总共用了22分钟。这就是工具带来的真实生产力。
