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