CN
v2.1.7
WPE_TUTORIAL_V2 // 05_ANALYSIS

封包分析方法

Tutorial Rev · 2.1.8 beta

前面几章讲的是 软件怎么用,这一章讲 拿到一个陌生协议该怎么下手 —— 从看懂封包结构,到定位出你要改的那一个字节,再到验证改动是否真的生效。

// 本章定位

这里不介绍任何界面按钮,只讲 方法。用到的功能都在前面章节有详细说明,本章只标注「用哪个功能、在哪一节」。
建议先读完 滤镜 一章再来看这里。

快速上手 // 从一堆乱码到能改的字段

拿到一个完全陌生的协议时,按这个顺序走,比对着十六进制发呆有效得多。每一步的细节在本章后面展开。

  1. 先收窄:用 过滤设置 按端口 / 长度把无关流量挡掉,让列表里只剩几十条而不是几万条。
  2. 做一次对照实验:只改变游戏 / 程序里的 一个 变量(点一次按钮、改一个数值),抓两组包。
  3. 比对:把两组包分别丢进 文本对比 的 A / B,看差异表落在 哪几个偏移 上。
  4. 验证封包编辑 里改掉那个偏移的值,重放一遍,看程序或服务端有没有按预期反应。
  5. 排除干扰:如果改完被服务端拒绝,先按 04 节 判断有没有校验和或加密。
  6. 固化:确认规律后,把手工改包变成一条 滤镜,让它自动生效。

01 · 一个封包长什么样

绝大多数自定义二进制协议,封包都由这几段拼起来。认出这几段,是所有分析工作的起点:

01典型二进制封包的分段 · 不是每个协议都齐全,但顺序大体如此。
一条完整封包(十六进制) 01 00 00 00 26 1A 05 00 3F 4A 5B C3 7F … 业务数据 … 9C 4D 0 – 23 – 45 – 6 7 – 89 – …末 2 字节 ① 包头 / 魔数 固定不变,用来确认「这是一条本协议的包」 → 拆包设置的「包头」· 滤镜的「指定包头」 ② 包长 整包总长,粘包时靠它切分 → 拆包设置的「长度」(位置区间,大端) ③ 操作码 / 命令字 区分「这是登录包还是移动包」 → 滤镜搜索行的主要锚点 ④ 序号 / 时间戳 每包递增或随时间变化,重放时最容易踩坑 → 滤镜的「递进」标记 ⑤ 负载 真正的业务数据,你要改的通常在这里 → 滤镜的搜索行 + 修改行 ⑥ 校验 CRC / 累加和 / 摘要,改包后必须同步重算 → 见本章 04 节
// 立刻能用上的

只要认出了 ①包头②包长 两段,就可以去 代理模式的拆包设置 把粘在一起的 TCP 流切成一条条完整封包 —— 后面所有分析都会轻松很多。

02 · 四步定位一个字段

这是最核心的方法:不去猜,用对照实验把字段逼出来

02差异对比定位法 · 制造一个可控变化,看哪几个字节跟着变。
① 制造可控变化只改一个变量 ② 抓两组样本变化前 / 变化后 ③ 逐字节对比文本对比工具 ④ 反向验证改回去,看效果是否跟着变 验证不通过 → 换个变量重来 经验:一次只改一个变量。同时改两样东西,差异位会同时出现在两个地方,反而分不清谁对应谁。 经验:同一个动作重复抓 3~5 次。每次都变的位置是序号 / 时间戳,不是你要的业务字段。 经验:先缩小范围再细看。用「指定包头」或「长度」把无关封包过滤掉,列表干净了才好比对。

在 WPE x64 里具体怎么操作

  1. 缩小范围过滤设置 选「只显示」,按端口或包头把目标封包挑出来,列表先干净下来。
  2. 抓第一组:让目标程序做一次动作(比如数值为 100 时),在封包列表右键 → 添加到仓库 存档,同时右键 → 添加到文本A
  3. 抓第二组:把数值改成 90,重复同一动作,右键 → 添加到文本B
  4. 对比:切到 文本对比 页,点「文本比较」,差异表会直接指出 哪几个字节位置变了
  5. 验证:在 封包编辑 里把那几个字节改成第三个值发出去,看目标程序的反应是否符合预期。对上了,这个字段就确认了。
// 为什么要入仓库

仓库 会把样本原样存下来,列表清空或自动清理都不会丢。分析一个字段往往要来回比对十几次,随手存档能省掉大量重抓的时间。包头固定的话,直接开 自动入库 让它自己收集。

03 · 认出那些「每次都变」的字段

对比时你会发现:就算什么都不改,重复同一个动作,有些字节每次也不一样。这些是干扰项,得先排除掉,否则会误判成业务字段。

字段类型怎么认出来重放时的影响WPE 里的对策
序号 / 计数器严格单调递增,通常 +1;重启连接后归零不递增会被服务端判为重复包而丢弃滤镜修改行右键「启用递进」,步长 1,溢出时开进位
时间戳随时间单调增长,同一秒内多包相同;常见 4 或 8 字节过期的时间戳会被服务端拒绝不要写死。让它保持原值(搜索行留空该位)
随机数 / 会话 ID毫无规律,但一次连接内保持不变换连接后失效,隔天重放必然失败搜索行该位用 通配符 ** 跳过,或改用「随机」标记
长度字段数值恰好等于整包或负载的字节数改包后长度不同步会导致解析错位尽量做 等长替换;变长了必须同步改长度字段
校验和改任意一位,它就跟着变,且无明显规律不重算则整包被丢弃见下一节
// 最常见的翻车点

手工改一个字节、单发一次没问题,连发几次就全被服务端忽略 —— 十有八九是序号字段没跟着涨。这正是滤镜「递进」功能存在的意义:让它每命中一次就自动 +1。

04 · 判断有没有加密和校验

在花时间逐字节分析之前,先花两分钟判断这个协议属于哪一类,能省掉大量无用功。

03三个快速判断 · 按顺序做,几分钟内就能定性。
① 数据面板里有可读文字吗 明文协议直接分析,最省事 没有 ② 同一动作抓两次,包体一模一样吗 一样 二进制明文 · 可能带静态编码试异或计算工具 不一样 ③ 改一位再发被拒 → 有校验照收 → 整体加密 判断 ① 看数据面板右侧的字符列:能看出 HTTPJSON、域名、玩家昵称等可读片段,就是明文。 判断 ② 用「文本对比」把两次样本一比即可。完全一致说明没有随机化,分析难度大幅下降。 判断 ③ 用「封包编辑」改任意一个负载字节后重放:服务端无反应 = 校验拦下了;正常处理 = 没校验。 注意:HTTPS / TLS 属于「整体加密」,但代理模式能解 —— 见下方说明。

分别怎么办

判定结果可行做法
明文按 02 节的四步法正常分析,滤镜可以自由改写
简单编码(异或 / 移位)异或计算 试单字节或循环异或密钥。异或值填多字节时会循环套用,正好对付轮转密钥
带校验先分析出校验算法(改一位看校验位怎么变),改包后同步重算;算不出来就只能整包重放而不改内容
TLS / HTTPS别在注入模式硬啃密文。改用 代理模式 开 HTTP 代理,中间人解密后直接看明文
自研强加密封包层面无解。可行的只有原样重放(发送列表),或回到注入模式在加密 之前 的 API 上做文章
// 一个常被忽略的捷径

注入模式挂的是 WinSock 收发函数,拿到的是程序 准备发出去的最终字节。如果程序在应用层自己加了一层加密,那这层加密在 Hook 点已经完成了 —— 此时改用 代理模式 并不会更好。反过来,如果加密是 TLS 那种传输层的,代理模式的中间人就能剥掉它。先判断加密发生在哪一层,再选模式。

05 · 从分析到改包的完整工作流

把前面各章的功能串起来,一次完整的作业长这样:

04完整工作流 · 每一步对应教程里的哪一节。
1 · 抓包注入 or 代理 2 · 收窄过滤设置 + 拆包 3 · 存样本仓库 / 自动入库 4 · 定位字段文本对比 5 · 手工验证封包编辑重放 6 · 固化成滤镜搜索行 + 修改行 7 · 处理可变位递进 / 随机 / 排除 8 · 观察日志滤镜日志 / 统计 9 · 自动化执行联动 / 机器人 不对就回去改 第 5 步不能跳。滤镜是「自动执行」的,规则写错会持续作用在每一个包上;先用封包编辑手工发一次确认无误,再固化成滤镜。 第 8 步看的是执行次数:涨了说明规则命中,没涨说明匹配条件写错 —— 这是判断滤镜有没有生效最快的办法。

06 · 常见协议的开头特征

抓到一堆二进制不知道是什么?先看开头几个字节,很多协议一眼就能认出来:

开头字节是什么建议
16 03 01 / 16 03 03TLS 握手(ClientHello / 记录层)加密流量,改用代理模式解密
17 03 03TLS 应用数据同上
47 45 54 20GET
50 4F 53 54POST
HTTP 明文请求代理模式下会直接以文本显示
48 54 54 50 2FHTTP/HTTP 响应同上
第 3 字节为 01 0081 80DNS 查询 / 应答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 · 抓一个客户端的登录包(注入模式)

  1. 首页 → 注入模式 → 选择程序 选中目标 exe → 注入
    用「选择程序」而不是从列表选进程,才能抓到 启动阶段 的包。
  2. 界面出现在目标进程内。先进 菜单拦截设置,只勾「发送」和「接收」,减少噪声。
  3. 菜单过滤设置:选「只显示」,勾「端口号」,填服务器端口。
  4. 开始 —— 这一步同时会唤醒被挂起的目标进程。
  5. 执行登录,观察列表。找到目标包后右键 → 添加到仓库 存档。

场景 2 · 找出某个数值在包里的偏移

  1. 在数值为 100 时抓一次包,右键 → 添加到文本A
  2. 把数值变成 90,重复同一动作,右键 → 添加到文本B
  3. 切到 文本对比 → 文本比较,点「文本比较」,差异表直接指出 哪几个字节变了
  4. 封包编辑 改这几位重放验证,确认后再固化成滤镜。

这是本章 02 节四步定位法 的最小实例;若数值位置每次浮动,改用 高级模式 按特征串匹配。

场景 3 · 把 HTTPS 明文抓出来(代理模式)

  1. 代理模式 → 代理设置:勾「启用 HTTP 代理」(默认端口 1081)。
  2. 开始,系统日志出现「WPE64 证书安装成功」即表示本机证书就绪。
  3. 要抓手机或其他机器:代理设置里选证书格式 → 导出证书 → 在该设备上 安装为受信任的根证书
  4. 目标设备把 HTTP 代理指向 WPE本机IP:1081
  5. 「代理数据」里 HTTPS 请求 / 响应 类别的包,下方面板会直接以 纯文本 显示。

场景 4 · 把线上 JS 换成本地文件(调试用)

  1. 代理模式 → 菜单映射设置 → 勾「启用本地映射」→ 新增一条:
    协议 Https,主机地址 cdn.example.com,端口 443,远端路径 /app.js
  2. 本地文件:拖入你改好的 app.js
  3. 保存后重启代理服务。此后该 URL 的 响应体会被本地文件整体替换
// 为什么不用滤镜

滤镜 对 HTTP / HTTPS 类别无效(作用类别里没有这两项)。改 Web 资源一律走映射设置。

场景 5 · 把 WPE 当成带账号体系的 SOCKS5 服务器

  1. 代理设置:勾「启用 SOCKS5 代理」(1080)、勾「启用身份认证」;「自动检测」保持勾选以监听全部网卡。
  2. 账号列表菜单 → 批量创建账号:前缀 vip、数量 50、密码长度 8、限制链接数 5、设过期时间 → 预览 → 保存 → 右键导出 Excel 分发。
  3. 防火墙设置:勾「启用防火墙」选黑名单模式;在「防火墙规则」里打开「认证失败的 IP 自动拉黑」与「不支持的 Socks 协议封 30 分钟」。
  4. 远程管理设置:启用,端口 88,设管理员账号密码,之后可用浏览器远程查看在线情况。
  5. 开始 启动服务。

场景 6 · 给 WPEProxyCap 加速器下发节点与公告

  1. 先完成场景 5,确保有可用的 SOCKS5 服务与账号。
  2. 开启 远程管理,假设端口 88。
  3. WPC 配置 → 服务器列表 新增服务器:名称「华东一区」、IP 填公网地址、端口 1080,并填好注册 / 找回密码 / 验证地址。
  4. 给该服务器加规则,例如 PROCESS-NAME / game.exe / PROXY,再加一条 MATCH / DIRECT 兜底。
  5. 「公告列表」新增一条「维护说明」类型的公告。
  6. 客户端访问 http://<公网IP>:88/ProxyCap/GetServerList 即可拉到节点列表。
  7. 要让 WPC 一键订阅 自动找到这台机器,还需向订阅服务器申请一个绑定该地址的 订阅号;仅自测的话上一步的直连地址就够了。
// 安全提醒

/ProxyCap/*免认证 的公开接口,任何能访问该端口的人都能拿到节点列表。对公网暴露时请用防火墙限制来源。

场景 7 · 屏蔽某个功能的封包

  1. 按场景 1 / 2 定位到该功能对应的封包,右键 → 添加到滤镜列表
  2. 双击新建的滤镜,动作改成 拦截,作用类别勾「发送」。
  3. 数据表搜索行 只保留能唯一标识该功能的几个字节,其余清空,避免误伤别的包。
  4. 保存,回滤镜列表打开启用开关,观察「执行次数」确认命中。