封包分析方法
前面几章讲的是 软件怎么用,这一章讲 拿到一个陌生协议该怎么下手 —— 从看懂封包结构,到定位出你要改的那一个字节,再到验证改动是否真的生效。
这里不介绍任何界面按钮,只讲 方法。用到的功能都在前面章节有详细说明,本章只标注「用哪个功能、在哪一节」。
建议先读完 滤镜 一章再来看这里。
拿到一个完全陌生的协议时,按这个顺序走,比对着十六进制发呆有效得多。每一步的细节在本章后面展开。
01 · 一个封包长什么样
绝大多数自定义二进制协议,封包都由这几段拼起来。认出这几段,是所有分析工作的起点:
只要认出了 ①包头 和 ②包长 两段,就可以去 代理模式的拆包设置 把粘在一起的 TCP 流切成一条条完整封包 —— 后面所有分析都会轻松很多。
02 · 四步定位一个字段
这是最核心的方法:不去猜,用对照实验把字段逼出来。
在 WPE x64 里具体怎么操作
- 缩小范围:过滤设置 选「只显示」,按端口或包头把目标封包挑出来,列表先干净下来。
- 抓第一组:让目标程序做一次动作(比如数值为
100时),在封包列表右键 → 添加到仓库 存档,同时右键 → 添加到文本A。 - 抓第二组:把数值改成
90,重复同一动作,右键 → 添加到文本B。 - 对比:切到 文本对比 页,点「文本比较」,差异表会直接指出 哪几个字节位置变了。
- 验证:在 封包编辑 里把那几个字节改成第三个值发出去,看目标程序的反应是否符合预期。对上了,这个字段就确认了。
仓库 会把样本原样存下来,列表清空或自动清理都不会丢。分析一个字段往往要来回比对十几次,随手存档能省掉大量重抓的时间。包头固定的话,直接开 自动入库 让它自己收集。
03 · 认出那些「每次都变」的字段
对比时你会发现:就算什么都不改,重复同一个动作,有些字节每次也不一样。这些是干扰项,得先排除掉,否则会误判成业务字段。
| 字段类型 | 怎么认出来 | 重放时的影响 | WPE 里的对策 |
|---|---|---|---|
| 序号 / 计数器 | 严格单调递增,通常 +1;重启连接后归零 | 不递增会被服务端判为重复包而丢弃 | 滤镜修改行右键「启用递进」,步长 1,溢出时开进位 |
| 时间戳 | 随时间单调增长,同一秒内多包相同;常见 4 或 8 字节 | 过期的时间戳会被服务端拒绝 | 不要写死。让它保持原值(搜索行留空该位) |
| 随机数 / 会话 ID | 毫无规律,但一次连接内保持不变 | 换连接后失效,隔天重放必然失败 | 搜索行该位用 通配符 ** 跳过,或改用「随机」标记 |
| 长度字段 | 数值恰好等于整包或负载的字节数 | 改包后长度不同步会导致解析错位 | 尽量做 等长替换;变长了必须同步改长度字段 |
| 校验和 | 改任意一位,它就跟着变,且无明显规律 | 不重算则整包被丢弃 | 见下一节 |
手工改一个字节、单发一次没问题,连发几次就全被服务端忽略 —— 十有八九是序号字段没跟着涨。这正是滤镜「递进」功能存在的意义:让它每命中一次就自动 +1。
04 · 判断有没有加密和校验
在花时间逐字节分析之前,先花两分钟判断这个协议属于哪一类,能省掉大量无用功。
分别怎么办
| 判定结果 | 可行做法 |
|---|---|
| 明文 | 按 02 节的四步法正常分析,滤镜可以自由改写 |
| 简单编码(异或 / 移位) | 用 异或计算 试单字节或循环异或密钥。异或值填多字节时会循环套用,正好对付轮转密钥 |
| 带校验 | 先分析出校验算法(改一位看校验位怎么变),改包后同步重算;算不出来就只能整包重放而不改内容 |
| TLS / HTTPS | 别在注入模式硬啃密文。改用 代理模式 开 HTTP 代理,中间人解密后直接看明文 |
| 自研强加密 | 封包层面无解。可行的只有原样重放(发送列表),或回到注入模式在加密 之前 的 API 上做文章 |
注入模式挂的是 WinSock 收发函数,拿到的是程序 准备发出去的最终字节。如果程序在应用层自己加了一层加密,那这层加密在 Hook 点已经完成了 —— 此时改用 代理模式 并不会更好。反过来,如果加密是 TLS 那种传输层的,代理模式的中间人就能剥掉它。先判断加密发生在哪一层,再选模式。
05 · 从分析到改包的完整工作流
把前面各章的功能串起来,一次完整的作业长这样:
06 · 常见协议的开头特征
抓到一堆二进制不知道是什么?先看开头几个字节,很多协议一眼就能认出来:
| 开头字节 | 是什么 | 建议 |
|---|---|---|
16 03 01 / 16 03 03 | TLS 握手(ClientHello / 记录层) | 加密流量,改用代理模式解密 |
17 03 03 | TLS 应用数据 | 同上 |
47 45 54 20(GET )50 4F 53 54(POST) | HTTP 明文请求 | 代理模式下会直接以文本显示 |
48 54 54 50 2F(HTTP/) | HTTP 响应 | 同上 |
第 3 字节为 01 00 或 81 80 | DNS 查询 / 应答 | UDP 类别,注意用「接收自 / 发送到」抓 |
| 以固定几字节反复出现 | 自定义协议的魔数包头 | 正是拆包设置要填的「包头」 |
知道特征后,可以用 查找封包 的「查找十六进制」配上正则一次定位,例如 ^16 03 找出所有 TLS 记录、^01 00 0A 找出某个自定义包。
07 · 老版 WPE 教程术语对照
网上流传的 WPE 教程绝大多数是十几年前基于旧版 WPE / WPE Pro 写的。思路完全通用,但术语和界面位置对不上 2.1.8。照着老教程操作前,请先看这张对照表:
| 老教程的说法 | WPE x64 2.1.8 里的对应 |
|---|---|
| SEARCH(搜索) | 滤镜编辑数据表格的 第 1 行「搜索」(浅黄底) |
| MODIFY(替换) | 数据表格的 第 2 行「修改」(黄底) |
| 一般模式 / 普通模式 | 模式 → 普通,绝对位置匹配 |
| 递进模式 | 模式 → 高级,特征串滑动搜索。注意不是 2.1.8 的「递进」! |
| 从封包开头替换 | 高级模式下的「修改起始于 → 数据包开头」 |
| 从发现连锁的位置替换 | 高级模式下的「修改起始于 → 自发现有连锁的位置」 |
| 封包大小 / 长度限定 | 「指定类型 → 长度」,支持 0-99;100 这样的区间写法 |
| 过滤器(Filter) | 就是 滤镜。注意与「过滤设置」不是一回事 —— 后者只管界面显示 |
| 发送列表 / 重放 | 发送列表,另有 封包编辑 做单条重放 |
老教程里的「递进模式」指的是 2.1.8 的 高级模式(按特征串浮动匹配)。
而 2.1.8 自己的「递进」是另一回事 —— 它是给修改行某个格子打的标记,作用是 每命中一次就把该字节按步长累加,用来对付序号字段。
两者毫无关系,看老教程时务必区分。
除了术语,还有这些实质差异
- 老版 WPE 只有 注入 一种方式;2.1.8 多了 代理模式,抓 HTTPS 和移动端设备要方便得多。
- 老版没有 通配符;2.1.8 的搜索格支持
4*/*A半字节通配,处理浮动字段更省事。 - 老版没有 排除位;2.1.8 可以给搜索格标「排除」,表示 该字节不等于此值 才算匹配。
- 老版靠人盯着改;2.1.8 有 执行联动,滤镜命中后可自动触发发送、机器人或入库。
- 老版单机单配置;2.1.8 支持 多开,不同目标各用一套独立配置。
08 · 分析前的自检清单
□ 目标该走 注入 还是 代理?(选型对照)
□ 拦截设置 里该勾的函数勾了吗?改完记得「停止 → 开始」
□ 有没有用 过滤设置 把噪声挡掉,让列表干净?
□ 是 TCP 粘包吗?要不要先配 拆包?
□ 样本 存仓库 了吗?分析中途列表被自动清理就白抓了
□ 同一动作抓够 3 次以上 了吗?不然分不清业务字段和序号
□ 改包前确认过 有没有校验 吗?
□ 滤镜写好后,看过 执行次数 确认真的命中了吗?
09 · 七个实战场景
把全书的功能按真实任务串起来。每个场景都是 从零到可用 的完整步骤,涉及的细节在对应章节里有详细说明。
场景 1 · 抓一个客户端的登录包(注入模式)
- 首页 → 注入模式 → 选择程序 选中目标 exe → 注入。
用「选择程序」而不是从列表选进程,才能抓到 启动阶段 的包。 - 界面出现在目标进程内。先进 菜单 → 拦截设置,只勾「发送」和「接收」,减少噪声。
- 菜单 → 过滤设置:选「只显示」,勾「端口号」,填服务器端口。
- 点 开始 —— 这一步同时会唤醒被挂起的目标进程。
- 执行登录,观察列表。找到目标包后右键 → 添加到仓库 存档。
场景 2 · 找出某个数值在包里的偏移
- 在数值为
100时抓一次包,右键 → 添加到文本A。 - 把数值变成
90,重复同一动作,右键 → 添加到文本B。 - 切到 文本对比 → 文本比较,点「文本比较」,差异表直接指出 哪几个字节变了。
- 用 封包编辑 改这几位重放验证,确认后再固化成滤镜。
这是本章 02 节四步定位法 的最小实例;若数值位置每次浮动,改用 高级模式 按特征串匹配。
场景 3 · 把 HTTPS 明文抓出来(代理模式)
- 代理模式 → 代理设置:勾「启用 HTTP 代理」(默认端口 1081)。
- 点 开始,系统日志出现「WPE64 证书安装成功」即表示本机证书就绪。
- 要抓手机或其他机器:代理设置里选证书格式 → 导出证书 → 在该设备上 安装为受信任的根证书。
- 目标设备把 HTTP 代理指向
WPE本机IP:1081。 - 「代理数据」里
HTTPS 请求 / 响应类别的包,下方面板会直接以 纯文本 显示。
场景 4 · 把线上 JS 换成本地文件(调试用)
- 代理模式 → 菜单 → 映射设置 → 勾「启用本地映射」→ 新增一条:
协议Https,主机地址cdn.example.com,端口443,远端路径/app.js - 本地文件:拖入你改好的
app.js。 - 保存后重启代理服务。此后该 URL 的 响应体会被本地文件整体替换。
滤镜 对 HTTP / HTTPS 类别无效(作用类别里没有这两项)。改 Web 资源一律走映射设置。
场景 5 · 把 WPE 当成带账号体系的 SOCKS5 服务器
- 代理设置:勾「启用 SOCKS5 代理」(1080)、勾「启用身份认证」;「自动检测」保持勾选以监听全部网卡。
- 账号列表 → 菜单 → 批量创建账号:前缀
vip、数量 50、密码长度 8、限制链接数 5、设过期时间 → 预览 → 保存 → 右键导出 Excel 分发。 - 防火墙设置:勾「启用防火墙」选黑名单模式;在「防火墙规则」里打开「认证失败的 IP 自动拉黑」与「不支持的 Socks 协议封 30 分钟」。
- 远程管理设置:启用,端口 88,设管理员账号密码,之后可用浏览器远程查看在线情况。
- 点 开始 启动服务。
场景 6 · 给 WPEProxyCap 加速器下发节点与公告
- 先完成场景 5,确保有可用的 SOCKS5 服务与账号。
- 开启 远程管理,假设端口 88。
- WPC 配置 → 服务器列表 新增服务器:名称「华东一区」、IP 填公网地址、端口 1080,并填好注册 / 找回密码 / 验证地址。
- 给该服务器加规则,例如
PROCESS-NAME / game.exe / PROXY,再加一条MATCH / DIRECT兜底。 - 「公告列表」新增一条「维护说明」类型的公告。
- 客户端访问
http://<公网IP>:88/ProxyCap/GetServerList即可拉到节点列表。 - 要让 WPC 一键订阅 自动找到这台机器,还需向订阅服务器申请一个绑定该地址的 订阅号;仅自测的话上一步的直连地址就够了。
/ProxyCap/* 是 免认证 的公开接口,任何能访问该端口的人都能拿到节点列表。对公网暴露时请用防火墙限制来源。
场景 7 · 屏蔽某个功能的封包
- 按场景 1 / 2 定位到该功能对应的封包,右键 → 添加到滤镜列表。
- 双击新建的滤镜,动作改成 拦截,作用类别勾「发送」。
- 数据表搜索行 只保留能唯一标识该功能的几个字节,其余清空,避免误伤别的包。
- 保存,回滤镜列表打开启用开关,观察「执行次数」确认命中。