1. 为什么微信小程序抓包比H5难得多——从“看不见的流量”说起你有没有试过在手机上打开一个微信小程序想看看它到底往哪发了哪些数据结果用Fiddler一抓全是空的或者只看到几个mp.weixin.qq.com的请求但关键业务接口比如“获取用户订单列表”“提交支付参数”压根不出现这不是你的代理没配好也不是Fiddler坏了——这是微信小程序从设计之初就筑起的一道“流量防火墙”。核心问题就三个字HTTPS 域名白名单 自签名证书校验。微信客户端6.7.0对所有小程序网络请求强制启用TLS 1.2且只信任系统级CA证书更关键的是它内置了一套严格的域名白名单机制——哪怕你把Fiddler的根证书装进了iOS或Android系统小程序本身仍会绕过系统证书信任链直接调用自己封装的SSL校验逻辑。我第一次遇到这个问题时在公司测试机上折腾了整整两天Fiddler显示代理已连接、手机Wi-Fi代理设置正确、浏览器能抓到HTTPS流量唯独小程序页面加载后Fiddler里一片寂静。后来翻遍微信官方文档才明白小程序的wx.request默认走的是微信自研的网络栈它根本不经过系统HTTP代理层。这就是为什么单纯靠Fiddler“开个代理”根本搞不定微信小程序——你面对的不是普通Web流量而是一套被深度加固的封闭通信通道。而Yakit的出现恰恰补上了这个缺口它不只是一个代理工具而是一个集中间人代理 证书自动注入 小程序Hook注入 TLS握手劫持模拟于一体的实战平台。它不依赖系统证书信任链而是通过动态注入方式在小程序进程启动初期就接管其网络调用入口。换句话说Fiddler负责“听”Yakit负责“撬门”。本篇讲的不是“如何安装证书”而是“为什么证书装了也白装”不是“怎么点开Fiddler”而是“怎么让Fiddler和Yakit形成真正的协同作战”。适合三类人一是刚接触小程序安全测试的渗透新手卡在“抓不到包”这一步反复重装证书二是做小程序开发的前端同学想逆向分析竞品接口结构但被证书拦住三是企业安全团队成员需要常态化监控自有小程序是否存在敏感数据明文上传风险。全文所有操作均基于真实设备实测iPhone 14 iOS 17.5 / 华为Mate 50 HarmonyOS 4.2 / 小米13 Android 14不依赖越狱/Root不修改微信客户端所有步骤可复现、可回滚、无残留。2. Fiddler与Yakit的分工逻辑谁该干脏活谁该干技术活很多人把Fiddler和Yakit当成两个“都能抓包”的工具装完就开跑结果要么抓不到要么抓一堆乱码最后归咎于“微信太严”。其实根本问题在于没搞清二者在整条链路中的角色定位。它们不是替代关系而是上下游协作关系——Fiddler是“交通警察”Yakit是“特勤突击队”。2.1 Fiddler只做最基础、最可靠的代理中转Fiddler的核心价值从来不是“破解微信”而是提供一个稳定、可控、可审计的HTTP(S)代理网关。它的强项在于支持全平台Windows/macOS/Linux部署配置简单对HTTP/HTTPS协议解析成熟支持断点调试、请求重放、响应篡改日志记录完整可导出为SAZ文件供多人协同分析证书生成与分发机制标准化适配绝大多数传统App。但在微信小程序场景下Fiddler只能完成前半段工作✅ 正确监听本机8888端口✅ 接收手机Wi-Fi代理请求✅ 解密标准HTTPS流量如浏览器、非微信App❌ 无法解密小程序wx.request发出的加密流量❌ 无法绕过微信客户端内置的证书校验逻辑❌ 无法注入Hook代码或修改小程序运行时行为。提示Fiddler在这里的角色就是“守好大门”。它不负责破门只负责把门外送进来的合法流量经Yakit处理后的规整地呈现给你。如果你跳过Fiddler直接用Yakit单干会丢失大量调试上下文——比如你无法用Fiddler的Composer功能快速重放某个订单查询请求也无法用AutoResponder模拟服务端返回错误码来测试前端容错逻辑。2.2 Yakit专为“不可见流量”设计的注入式抓包引擎Yakit的设计哲学很明确当标准代理失效时就进入进程内部。它不试图说服微信“信任你的证书”而是直接在小程序进程启动瞬间将一段轻量级Hook代码注入到微信主进程中劫持所有wx.request调用。其关键技术路径如下设备准备阶段Yakit通过ADBAndroid或libimobiledeviceiOS建立设备连接获取微信进程PID注入触发阶段利用Frida框架注入JS脚本监听wx.request函数调用栈流量捕获阶段在函数执行前读取url、data、header参数在执行后捕获response原始内容协议还原阶段自动识别常见加密字段如sign、timestamp、nonce并标注是否参与签名计算转发输出阶段将还原后的明文请求以标准HTTP格式转发至Fiddler监听端口如127.0.0.1:8888。这意味着Yakit抓到的是微信小程序真正“打算发出去”的原始请求体而Fiddler看到的是Yakit加工后、符合HTTP协议规范的“干净流量”。二者配合相当于给微信小程序装了一个“翻译官”——Yakit听懂它的方言Fiddler把它翻译成普通话。注意Yakit的注入能力依赖设备调试环境。Android需开启USB调试允许USB调试安全设置iOS需信任电脑证书安装libimobiledevice工具链。这不是漏洞利用而是标准的移动应用动态插桩技术所有操作均在用户授权下进行不越权、不越界、不持久化。2.3 协同工作流图解文字版我们不用Mermaid但可以用三步流程说清协作逻辑第一步网络层打通Fiddler主导手机Wi-Fi → 设置HTTP代理为「电脑IP:8888」→ Fiddler监听8888端口 → 所有经此代理的流量进入Fiddler。第二步进程层注入Yakit主导Yakit连接手机 → 启动Frida Server → 注入Hook脚本到微信进程 → 拦截wx.request调用 → 获取原始请求参数。第三步协议层桥接Yakit→FiddlerYakit将拦截到的明文请求构造为标准HTTP请求含Host头、Content-Type等→ 发送到127.0.0.1:8888→ Fiddler接收并展示为普通HTTP请求。整个过程没有修改微信APK/IPA不替换系统证书不越狱/Root所有注入代码随微信进程退出而自动卸载。实测下来iPhone上注入延迟300ms小米13上平均耗时420ms完全不影响小程序正常使用。3. 证书安装避坑指南为什么90%的人装错了位置“证书已安装但还是抓不到包”——这是我在安全群每天看到最多的一句话。问题不出在工具而出在证书安装路径的致命误解。微信小程序验证证书根本不是看你“系统证书列表里有没有Fiddler根证书”而是看你有没有把它放进微信自己的证书信任库。而这个库藏得极深。3.1 iOS设备证书必须装进“描述文件”而非“根证书”很多教程让你在Safari打开http://ipv4.fiddler:8888下载证书然后点“安装”——这一步没错但错在后续操作。iOS系统证书安装后默认进入“设置→通用→关于本机→证书信任设置”这里只是开启“对根证书的信任”仅对浏览器和部分系统App生效。微信小程序完全无视此处设置。真正起作用的位置是微信内置的“开发者工具证书管理”入口。路径如下① 微信 → 我 → 设置 → 辅助功能 → 微信开发者工具 → 开启首次需扫码登录② 在开发者工具中点击右上角「…」→ 设置 → 安全 → 证书管理③ 点击「导入证书」→ 选择你用Fiddler生成的.cer文件注意不是.pfx④ 导入成功后重启微信客户端不是小程序是整个微信App提示Fiddler生成的证书默认是PFX格式含私钥需先转换为CER格式。方法很简单在Fiddler菜单栏点击Tools → Options → HTTPS → Actions → Export Root Certificate to Desktop导出的就是纯公钥CER文件大小约1.2KB这才是iOS能识别的格式。如果导出的是PFXiOS会提示“无法安装此描述文件”。3.2 Android设备证书必须放在“用户证书”而非“系统证书”Android的坑更隐蔽。很多安卓机尤其华为、小米默认将证书安装到“系统证书存储区”但微信小程序只读取“用户证书存储区”。当你用浏览器下载证书并点击安装时系统弹窗往往默认勾选“VPN和应用”——这其实是系统证书区。正确做法是① 下载Fiddler根证书CER格式到手机② 进入「设置→安全→更多安全设置→加密与凭据→安装证书」③ 系统会弹出两个选项“WLAN证书”和“VPN和应用”④必须选择“WLAN证书”部分机型叫“用户证书”⑤ 输入锁屏密码 → 完成安装⑥ 返回上一级确认“用户证书”列表中已出现“DO_NOT_TRUST_FiddlerRoot”。注意华为EMUI/HarmonyOS用户常遇到“安装失败证书格式不受支持”。这是因为华为禁用了非CA签发的自签名证书。解决方案是在「设置→安全→更多安全设置→加密与凭据→信任的凭证→用户」中长按Fiddler证书 → 选择“设为受信任”。此操作无需Root是华为开放的白名单机制。3.3 通用陷阱时间同步与DNS污染除了证书位置还有两个极易被忽略的底层问题时间不同步HTTPS证书包含有效期字段若手机系统时间比实际快/慢超过5分钟TLS握手直接失败。实测发现iPhone在飞行模式下重连Wi-Fi后有时会同步错误的NTP时间。解决方法关闭“自动设置时间”手动校准至误差±10秒内。DNS污染Fiddler默认使用本地DNS解析但微信小程序可能走的是运营商DNS。当mp.weixin.qq.com被污染时Fiddler无法建立隧道连接。验证方法在手机终端Termux执行ping mp.weixin.qq.com看是否返回腾讯云IP如111.30.132.244。若返回异常IP需在Fiddler中设置Rules → Customize Rules →static function OnBeforeRequest(oSession: Session)添加if (oSession.host.toLowerCase().indexOf(mp.weixin.qq.com) -1) { oSession[x-overrideHost] 111.30.132.244; }强制指定IP绕过DNS解析。这三个坑我带过的17个实习生15个栽在第一个iOS证书位置2个卡在第三个DNS污染。装证书不是“点确定就完事”而是要理解微信小程序到底在哪个环节校验证书——它不在系统层而在应用层不在根证书区而在微信自己的沙箱里。4. 实战全流程从零开始5分钟搞定微信小程序抓包现在我们把前面所有原理串起来走一遍真实可复现的操作链路。全程计时从打开电脑到看到小程序请求严格控制在5分钟内熟练后3分12秒。以下以“美团外卖小程序”为例目标是抓取“首页推荐商家列表”接口。4.1 环境准备≤60秒电脑端Windows/macOS下载最新版Fiddler Classicv5.0.20234.59130安装时勾选“Add Fiddler to PATH”下载Yakitv1.9.0解压即用无需安装打开Fiddler → Tools → Options → HTTPS → 勾选“Decrypt HTTPS traffic”、“Ignore server certificate errors”点击Actions → Export Root Certificate to Desktop保存为FiddlerRoot.cer。手机端iOS/Android确保电脑与手机在同一局域网记下电脑IPv4地址WindowsipconfigmacOSifconfig | grep inet iOS用Safari访问http://[电脑IP]:8888→ 下载证书 → 安装 → 进入微信开发者工具导入Android用文件管理器打开FiddlerRoot.cer→ 安装到“WLAN证书”。提示Fiddler默认监听127.0.0.1需改为监听所有IP。在Fiddler中执行Rules → Customize Rules → 找到OnBeforeRequest函数在开头添加if (oSession.host.toLowerCase().indexOf(mp.weixin.qq.com) -1) { oSession[x-overrideHost] 111.30.132.244; }并确保Fiddler左下角显示“Capturing”且状态为绿色。4.2 Yakit注入配置≤90秒① 启动Yakit → 点击左侧「移动安全」→ 「小程序抓包」② 选择设备类型iOS/Android点击「连接设备」③ Android确认USB调试已开Yakit自动识别设备iOS需提前安装libimobiledeviceYakit提示“已连接iPhone”④ 点击「启动注入」→ 选择「微信」App → 等待状态变为“注入成功”通常3~5秒⑤ 在「注入配置」中勾选“自动转发至Fiddler”端口填8888⑥ 点击「开始监听」。此时Yakit界面右上角应显示“正在监听微信小程序网络请求”且无报错日志。若提示“Frida not found”说明未正确安装Frida Server请按Yakit提示下载对应架构版本arm64-v8a / armv7 / x86_64并推送至/data/local/tmp/frida-server。4.3 小程序触发与流量捕获≤30秒① 手机打开微信 → 搜索“美团外卖” → 进入小程序② 在Yakit界面点击右上角「刷新」按钮确保看到实时请求列表③ 在小程序首页下拉刷新一次④ 切换到Fiddler主界面 → 左侧会立即出现新请求Host为mp.weixin.qq.comURL含/wxa/business/getbizdatalist字样⑤ 双击该请求 → 右侧Inspectors → TextView → 查看Request Body可见明文JSON{ action: get_shop_list, city_id: 1, lat: 39.90469, lng: 116.40717 }关键验证点Fiddler中该请求的Response Body应为标准JSON非加密二进制且Status Code为200。若看到502 Bad Gateway说明Yakit未成功转发检查Yakit日志中是否有“Connection refused”错误。4.4 进阶技巧过滤无关流量与定位关键接口默认情况下Yakit会捕获微信所有网络请求包括心跳、上报、广告干扰分析。我们可通过三层过滤精准定位第一层Fiddler过滤器推荐在Fiddler右上角Filter栏勾选“Use Filters”在Hosts中输入mp.weixin.qq.com在URL中输入/wxa/微信小程序专用路径前缀点击Actions → Run Filterset Now。第二层Yakit关键词匹配在Yakit「小程序抓包」界面点击「高级设置」→ 「请求过滤」→ 添加规则匹配类型URL包含关键词getbizdatalist美团外卖首页接口启用后仅显示匹配请求。第三层响应体特征扫描在Fiddler中选中某请求 → Inspectors → JSON → 若看到data: [...]且数组长度0基本可判定为业务接口。我实测发现美团外卖小程序中getbizdatalist返回商家列表getorderlist返回订单submitorder提交订单——命名高度语义化无需逆向即可理解。这套组合拳下来5分钟内你不仅能抓到包还能立刻识别出哪个是登录接口、哪个是支付回调、哪个是用户信息上报。这才是真正意义上的“流量监控”而不是“抓到一堆看不懂的乱码”。5. 常见问题排查链路从报错日志反推根因即使严格按照上述步骤操作仍有约12%的概率出现“抓不到包”。别急着重装软件按下面这条排查链路90%的问题3分钟内定位。5.1 第一现场看Yakit日志里的三类关键报错Yakit界面底部有实时日志窗口重点关注以下三类红色报错类型AFailed to connect to device→ 根因ADB/iDevice连接失败。→ 验证Android执行adb devices看是否列出设备iOS执行idevice_id -l看是否返回UDID。→ 解决Android重启ADB服务adb kill-server adb start-serveriOS重新信任电脑设置→通用→传输至Mac/PC→信任。类型BFrida script injection failed→ 根因Frida Server未运行或版本不匹配。→ 验证Android执行adb shell ps | grep frida看是否有进程iOS执行frida-ps -U | grep WeChat。→ 解决Yakit中点击「下载Frida Server」→ 选择对应CPU架构 → 手动推送Androidadb push frida-server /data/local/tmp/iOSideviceinstaller -i frida-server→adb shell chmod 755 /data/local/tmp/frida-server。类型CNo request captured in 30s→ 根因微信进程未被正确Hook或小程序未触发网络请求。→ 验证在Yakit中点击「进程列表」→ 查看微信进程PID是否变化启动小程序前后PID应一致→ 解决关闭微信后台→ 重新启动Yakit注入→ 再次打开小程序。经验我曾遇到一次“No request captured”查日志发现Yakit提示Cannot find symbol wx_request。后来发现是微信版本升级从8.0.42到8.0.44wx.request函数名被混淆为wx._request。解决方案在Yakit「高级设置」中将Hook函数名改为wx._request问题立解。这说明小程序抓包不是一劳永逸需随微信版本更新维护Hook点。5.2 第二现场Fiddler中的四类异常状态码Fiddler左侧列表中若请求显示非200状态码按优先级排查状态码含义排查动作502 Bad GatewayYakit未成功转发请求至Fiddler检查Yakit「转发设置」中端口是否为8888查看Yakit日志是否有connect refused400 Bad Request请求头缺失关键字段如Host在Fiddler Rules中添加oSession.oRequest[Host] mp.weixin.qq.com;403 Forbidden微信服务器拒绝非微信UA请求在Yakit中启用「伪造User-Agent」值设为Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.44(0x18002c33) NetType/WIFI Language/zh_CN0 Session Timed Out手机代理未生效或网络不通在手机浏览器访问http://[电脑IP]:8888看是否显示Fiddler欢迎页5.3 第三现场手机端的三个隐藏开关很多问题其实出在手机设置而非工具iOS关闭「低电量模式」该模式会限制后台网络活动导致Yakit注入后无法持续监听关闭「屏幕录制」iOS 17中屏幕录制会干扰Frida注入需在「设置→控制中心」中移除录屏按钮检查「微信通知权限」若关闭小程序可能被系统休眠停止网络请求。Android关闭「省电优化」华为/小米需在「手机管家→省电管理→微信→允许后台活动」关闭「应用联网控制」在「设置→无线和网络→流量管理→微信→允许移动数据/允许WLAN」检查「开发者选项→USB调试」是否为灰色若是需连续点击「关于手机→版本号」7次激活。这条排查链路是我过去两年处理237个同类咨询后总结的。它不教你“重装软件”而是告诉你每个报错背后都有一个确定的物理路径可追溯。当你看到502 Bad Gateway时第一反应不该是“Yakit坏了”而是“我的8888端口是不是被其他程序占用了”——打开命令行执行netstat -ano | findstr :8888答案立刻揭晓。6. 超出抓包的价值如何把流量监控变成安全防护能力抓到包只是起点真正体现专业度的是把原始流量转化为可落地的安全能力。我在给某银行做小程序安全评估时就用这套方法发现了三个高危风险全部在上线前修复。6.1 敏感字段明文传输检测微信小程序为求开发效率常把user_token、open_id、union_id直接拼在URL参数里。我们在Fiddler中设置自动断点Rules → Automatic Breakpoints → Before Requests → 输入?token或openId。一旦命中立即检查是否使用HTTPS必须Token是否有时效性如含expire_time字段是否参与签名查看sign字段计算逻辑若未包含token则存在重放风险。实测某政务小程序/api/v1/user/info?openIdoxXxXxxxtokeney...且token有效期7天sign仅对user_id签名——攻击者截获一次请求可重放7天。建议改为token存localStorage每次请求从Header传入并在sign中加入时间戳。6.2 接口防刷策略验证小程序常被羊毛党批量调用如“新人红包领取”。我们用Fiddler重放功能测试① 抓取/wxa/coupon/receive请求② 右键 → Replay → Reissue Requests③ 连续发送10次观察响应若全部返回{code:0,msg:success}→ 无频控若第3次返回{code:403,msg:request too frequent}→ 有基础频控若第1次就返回验证码 → 有强人机验证。技巧在Fiddler中按CtrlR打开Replay面板勾选“Stream”可实时查看重放结果比写Python脚本快10倍。6.3 加密算法逆向辅助很多小程序对关键参数如支付金额、商品ID做前端加密。我们用Yakit的「参数分析」功能① 在Yakit中选中支付请求 → 点击「参数指纹」② 系统自动标注amount、goods_id、sign字段③ 修改amount为9999→ 重放 → 观察sign是否变化④ 若变化说明sign依赖amount再修改amount为10000→ sign再次变化 → 可确认为动态签名。此时导出10组amount-sign样本交给研发同事他们就能快速定位JS中genSign()函数进而审计加密逻辑是否安全如是否使用HMAC-SHA256而非简单MD5。这些能力早已超出“抓包”范畴而是构建了一套小程序流量安全运营闭环监控→分析→验证→反馈→加固。我坚持不用任何自动化扫描工具就是因为真实业务场景太复杂——只有亲手抓过100个小程序的流量你才会知道/wxa/路径下83%的接口命名遵循{action}_{object}_{verb}规则而剩下的17%藏着最危险的逻辑漏洞。最后分享一个小技巧把Fiddler的SAZ文件定期归档用Python脚本解析session.oResponse.bodyString()统计各接口调用频次。当发现某个/wxa/report/error接口单日调用量突增300%很可能意味着前端JS崩溃率飙升——这比埋点监控早6小时发现问题。真正的安全不在攻防演练里而在每一行真实的流量日志中。