有一类程序,是抓包人的老对手:证书装好了它报错、代理配好了它直连、好不容易把证书绑定解了——它掏出一套自研加密。你换工具的速度,赶不上它设防的花样。代理抓包在它面前是"连不上或抓不到",网卡抓包在它面前是"抓得到,但全是密文"。
直到换一个思路:不跟"设防"较劲了,直接从程序内部把明文取出来。这篇就讲这种抓法——应用层抓包。
先说它专治的三类程序吧(如果你手上的目标属于其中之一,这篇就是给你写的):
- 做了证书绑定(Pinning)的——代理一上就报错、直接拒连那种;
- 不认系统代理的——自己实现网络栈,直连到底;
- 用了自研/非标准加密的——流量抓到了,但解不开。
这三类在别的抓法里,其实就是三个不同的死胡同:一个卡在"连不上",一个卡在"抓不到",一个卡在"解不开"。而在应用层抓包这里,它们是同一个解法。
一、为什么它不惧"设防"
原理一句话就能说清:它不做中间人、不碰证书——从程序内部直接取程序收发的内容。
想一下那三类设防针对的是什么:证书绑定防的是"中间人拿自己的证书冒充服务器";不认代理防的是"请求被转走";自研加密防的是"外人看不懂流量"。而应用层抓包根本没有"外人"这个角色——它拿到的就是程序自己手里的明文,设防的对象根本不存在。这也解释了为什么它不挑加密库、不挑技术栈:主流库、冷门库、跨平台框架、甚至用操作系统自带加密(比如 Windows 系统网络栈上的 .NET / PowerShell 程序)的目标,一律从内部取明文。
顺手把三类设防在三种抓法下的遭遇摆一起看看,这个对照表本身就很说明问题:
- 证书绑定:代理——连不上、报错;网卡——有包,密文;应用层——明文。
- 不认代理:代理——抓不到;网卡——有包,密文;应用层——明文。
- 自研加密:代理——解不了;网卡——有包,密文;应用层——明文。
一句话总结:代理和网卡都止步于"程序怎么想",而应用层抓包不问程序怎么想。
二、对正在运行的程序直接下手
这个抓法还有个挺顺手的点:不用重启、不用改它的任何设置。程序已经在跑?选中它,就地从内部把明文取出来——对比一下此前提过的指定程序抓包:那条路要"填一条命令,把程序拉起来",适合脚本、CLI 这类方便重启的目标;而面对一个正在跑着的桌面客户端,"动都不用动它"的体验就完全不一样了——这类程序多为长期驻留、不方便重启的客户端,"直接下手"的价值恰好在这里。
当然反过来也行:填程序路径,让工具替你把它启动起来——两种入口按手上的情况挑嘛。
在 TraceEagle 里,这个抓法的入口就是选一个运行中的程序(或填路径)——取到的明文走的是和其它抓法同一套查看与解码流程,结构化视图、JSON 美化这些照常,不用重新学一遍。对不熟悉它的人来说,理解门槛大概就一句话:别的抓法在研究"流量怎么走",而这个抓法只关心"程序手里有什么"。
三、两把对付"硬骨头"的钳子
有些程序属于难啃的那一档,这套抓法也留了后手:
socket 流量兜底。 遇到精简过、去掉符号、或用较新技术栈编写的程序(文档里点名的例子:纯 Go、Rust,以及走 Windows 系统网络栈的那类),普通方式定位不到它的加解密入口时,打开这个开关——它换一条更底层的路取数据,照样解出明文。关键是这个兜底不依赖"能不能找到程序的加解密入口",也不依赖网卡——很多工具在这里是彻底没辙的,TraceEagle 这一手就是为它们准备的。
抓"启动那一刻"。 很多鉴权、握手动作就发生在程序刚启动的瞬间,等你想起来开抓,第一个关键请求已经过去了。做法也直接:让工具先把程序关掉、再由它拉起来,启动初期的流量一并抓下——那个"第一个请求"就不会错过。
四、它的边界在哪
强归强,边界也该说清楚,省得用错方向:
- 默认只针对选中的那一个程序,不会自动展开它的全部子进程——多进程、多窗口的程序,可能需要分别选中处理。
- macOS 系统自带的 App、以及格外顽固、藏得很深的应用,它进不去(这类程序拒绝一切外部介入)——那是系统级抓包的活,从系统底层观测、根本不进入程序。
- 和"解除证书绑定"的关系也值得说明,两者常被混为一谈:去 Pin 是"让程序接受中间人"(代理抓包路线的一个补救),应用层抓包是"根本不需要中间人"——两条路通向同一个目标(看到明文),但路数完全不同。碰上一个带 Pinning 的程序时,两条路都行,看你想不想动它呢。
本机四种抓法到这算凑齐了啊:能命令启动的常规程序用指定程序抓包,整机全流量用网卡抓包,不认代理的上无感代理,而这一篇——覆盖是"最不讲道理"的那一档:反正不管程序怎么防,明文照拿。四种抓法不是互斥的选项,而是同一个工具箱里的四把工具。在 TraceEagle 里,排查时按程序"设了什么防"挑一把,本机抓包这一块,基本就不剩死角了。