CN
v2.1.7
WPE_TUTORIAL_V2 // 04_FILTER

滤镜

Tutorial Rev · 2.1.8 beta

滤镜是 WPE x64 的灵魂功能:在封包真正发出 / 收下之前,按规则匹配并改写它。本章把匹配算法、四种特殊标记、五种动作和执行联动一次讲透。

00 · 改包之前:这活该交给谁

WPE 里有四个地方都能「让流量变得不一样」,但适用范围完全不同。选错入口是滤镜不生效的头号原因——尤其是拿滤镜去改 HTTP(S),那是永远不会命中的:

你想做的事该用为什么不是滤镜
改 TCP / UDP 封包里的某几个字节滤镜 · 替换——就是它
让某类封包干脆不发出去 / 不收进来滤镜 · 拦截——就是它
命中后回发一串固定数据滤镜 · 换包,或滤镜触发 机器人——就是它
改 HTTP / HTTPS 的响应内容映射设置 · 本地映射滤镜的作用类别只有 12 个开关,没有 HTTP(S) / WebSocket 项,这类包不参与匹配
把请求转到另一个域名 / 端口映射设置 · 远程映射滤镜只改内容,不改目标地址
某类封包根本别抓拦截设置滤镜在封包产生之后才介入,从源头关掉更省资源
只是列表太乱、想少看几行过滤设置滤镜会真的改数据,拿它当「显示过滤」用会误伤线上流量
主动发一串包 / 定时循环发发送列表滤镜是被动触发的,没有命中就不会动
快速上手 // 建一条能生效的滤镜

滤镜是 WPE 里唯一能 改真实网络数据 的机制。下面是从零建一条到确认它跑起来的最短路径。

  1. 先抓到样本:在封包列表里找到要改的那个包,右键 → 添加到滤镜列表,搜索区会用它的内容预填好。
  2. 填滤镜名称,勾上要作用的 封包类别(注入模式选发送 / 接收…,代理模式选 TCP / UDP 请求响应)。
  3. 写搜索行:只留能唯一定位的那几个字节,其余单元格 留空表示通配。填得越少越容易命中,填得越多越精准。
  4. 写修改行:在对应偏移填上新值。需要每次递增或随机时改用 递进 / 随机标记
  5. 选动作:改字节用 替换、丢包用 拦截、整包重造用 换包(详见 06 节)。
  6. 勾「启用」保存 → 点「开始」,到 滤镜日志统计数据 确认它的状态是 处理中;命中的行在列表里会变底色。

01 · 滤镜的生命周期

01一条封包在滤镜引擎里的旅程 · 先做前置检查,再做内容匹配,最后执行动作。
封包到达 Hook / 代理转发点 ① 生效检查启用?作用类别?套接字/端口/长度/包头? 不通过 跳过这条滤镜 ② 内容匹配普通:绝对位置 · 高级:滑动搜索 未命中 ③ 执行动作替换 / 换包 / 拦截 / 只显示 / 不显示 ④ 执行联动(可选)发送 / 机器人 / 另一条滤镜 / 封包入库 ⑤ 计数 +1,写滤镜日志 按「滤镜执行模式」决定是否继续往下匹配 下一条

02 · 滤镜列表

工具栏:全部启用 全部禁用 重置计数菜单 下拉四项:新增滤镜 / 导入滤镜列表 / 导出所有滤镜 / 清空所有滤镜。

列表右键:置顶Ctrl+)/ 向上移动(Alt+)/ 向下移动(Alt+)/ 置底(Ctrl+)/ 导出 / 复制 / 删除。双击一行 打开滤镜编辑。

// 顺序有意义

在「按顺序执行」模式下,列表顺序就是匹配顺序。滤镜不生效时,先试试把它置顶。

创建滤镜的三种方式

  1. 菜单 → 新增滤镜:创建一条空滤镜,名字为 滤镜 N
  2. 封包列表 / 代理数据列表右键 → 添加到滤镜列表:用该封包内容 自动填充搜索行——最省事的起手式。
  3. 在十六进制编辑器里选中一段字节 → 右键 → 添加到滤镜列表:只用选中片段填充,适合已经定位到特征串的情况。

03 · 滤镜编辑窗口

02滤镜编辑(普通模式) · 上半是参数区,下半是两行数据表格。
滤镜编辑 滤镜名称 锁定金币字段 1 模式 普通 高级 2 动作 替换 换包 拦截 不修改 - 只显示 不修改 - 不显示 3 执行 发送列表 ▾ 回发心跳 ▾ 4 作用类别 注入模式代理模式 发送 发送到 接收 接收自 WSA 发送 WSA 发送到 WSA 接收 WSA 接收自 5 指定类型 套接字 5164;5252 长度 0-99;100 端口 例如 80-89;1080 6 高级指定 指定包头 01 00 0A 递进 连续递进 步长1 进位递进 位数2 7 数据表格 列号 001002003004005006007008009010011012 搜索 01 00 0A 4* FF … 共 1000 列 修改 09 00 00 8 9 递进 随机 排除(搜索行) 单元格右键即可切换这三种标记;再次右键「取消启用 / 取消排除」还原 保存 退出
  1. 滤镜名称:自由文本
  2. 模式:普通(绝对位置)/ 高级(滑动搜索),见 04 节
  3. 动作:五选一,见 05 节
  4. 执行联动:命中后额外触发发送 / 机器人 / 另一条滤镜 / 封包入库
  5. 作用类别:两个页签按当前模式自动切换,至少勾一个,否则滤镜永远不生效
  6. 指定类型:套接字 / 长度 / 端口三个前置条件,全部是 AND
  7. 高级指定 + 递进:指定包头;连续递进 / 步长 / 进位递进 / 位数
  8. 搜索行(浅黄):填在第 i 列的十六进制值必须等于封包第 i 字节
  9. 修改行(黄):命中后把封包第 i 字节改成这个值
// 列号 ≠ 下标

列标题 001 对应字节 下标 0。数封包偏移时记得减一。

04 · 普通模式 vs 高级模式

03两种匹配方式的差别 · 同样是找 4A 5B,结果完全不同。
封包内容 01 00 4A 5B C3 7F 4A 5B D0 11 0123456789 普通模式 搜索行:第 003 列 = 4A,第 004 列 = 5B → 只检查下标 2 和 3,命中 1 处(且只可能有 1 处) 命中 不看 高级模式 搜索行:第 001 列 = 4A,第 002 列 = 5B(表示相对顺序 → 以 4A 为锚点在整包滑动查找,命中 2 处 命中 #1 命中 #2 「修改起始于」决定处理第一处还是每一处 ※ 高级模式选「自发现有连锁的位置」时,修改表的列号是相对锚点的偏移,可为负数(-1000 ~ 999)
普通模式高级模式
语义绝对位置匹配特征串滑动搜索
能命中几处只判定一次可命中多处
数据表两行(搜索 / 修改),列 001~1000三个表:搜索表 + 两种修改表
修改下标绝对下标「数据包开头」= 绝对;「自发现有连锁的位置」= 相对偏移(可负)
适用协议字段位置固定字段位置浮动、变长头

修改起始于(仅高级模式)

选项处理范围修改表列号含义
数据包开头只处理 第一处 匹配绝对下标,从 0 开始
自发现有连锁的位置处理 每一处 匹配相对锚点的偏移,锚点自身 = 0,可为负

通配符

搜索格支持 半字节通配

写法含义掩码
4A精确匹配字节 0x4A0xFF
4*高半字节必须是 4,低半字节任意0xF0
*A低半字节必须是 A,高半字节任意0x0F
// 限制

高级模式下,只有形如 X* / *X(长度恰好 2)的写法会被识别为部分通配;** 这种全通配 不会加入匹配条件(等于留空)。

05 · 三种单元格标记

在数据表格的单元格上右键即可切换,靠 底色 区分:

标记可用行底色语义
排除搜索行取反:该字节 不等于 填入值才算匹配
递进修改行深红每命中一次就按步长累加,可进位
随机修改行亮蓝每次写入一个随机字节
// 常见错误

只勾了「连续递进」复选框但 没有在修改行右键「启用递进」——递进不会生效。复选框控制的是 累加方式,格子底色才决定 作用在哪个字节

递进的计算方式

对每个递进位:新值 = 旧值 + 步长 ×(递进次数 + 1)

  • 勾了 连续递进,每命中一次「递进次数」+1,形成持续累加;不勾则每次都是同样的增量
  • 勾了 进位递进,字节溢出(> 0xFF)时向 前面 的字节进位,最多进 位数

06 · 五种动作

动作行为列表行色
替换按「修改」行改写命中位置的字节;同时应用递进与随机位暗金
换包丢弃原包内容,用「修改」行的数据新建封包(长度 = 最大下标 + 1)亮蓝
拦截该封包不发送 / 不接收,直接丢弃深红
不修改 - 只显示内容不变,但确保这条被记入列表并统计浅绿
不修改 - 不显示内容不变,且 不入列表(静默高频心跳)
// 换包会丢数据

「换包」新建的封包长度 = 修改行里 最大下标 + 1未填写的位置一律是 0x00。想保留原始内容请用「替换」。

执行联动

勾选「执行」后出现两个下拉框:

执行类型选择对象命中后发生什么
发送列表一个发送项立即执行该发送(自动回包、连招)
机器人列表一个机器人启动该机器人,并把当前 socket 作为 FilterSocket 参数传进去
滤镜列表另一条滤镜再执行那条滤镜(链式处理)
封包入库一个仓库把命中的封包存进仓库(已改写则存改写后的)

对应列表为空时,该项在下拉里显示为 灰色不可选——先去建一个发送 / 机器人 / 仓库再回来。

07 · 滤镜执行模式

系统设置 → 滤镜执行模式 里切换:

模式行为适用
按顺序执行(默认)从上到下遍历全部滤镜。替换 会继续往下匹配(后面的滤镜作用在已改过的数据上);一旦命中 拦截 / 换包 / 只显示 / 不显示 立即返回需要多条滤镜叠加改同一个包
优先原则只要有任何一条命中,立即返回,不再往下规则互斥、追求性能

08 · 滤镜日志与统计

每次命中(非极速模式)会写一条滤镜日志:记录时间 / 滤镜名称 / 动作 / 匹配数 / 类别 / 长度,在 系统日志 → 滤镜日志 查看,可导出 Excel。

统计数据 页则给出滤镜执行占比与各动作占比的进度条。

09 · 导入导出与格式转换

  • 原生格式 .fp(滤镜列表文件,XML,可加密
  • 旧版 WPE 的 .filt 过滤器文件 转换:用 数据提取 页,选择 [ FILT过滤器文件(.filt)] 提取到 [ WPE64 滤镜文件(.sp)]。转换会解析 35 个 分隔字段,映射出滤镜名称、包头 / 套接字 / 长度条件、普通 / 高级模式、替换 / 拦截 / 不可视动作、搜索与修改内容、递进等

10 · 五个实战案例

案例 1 · 把某个字段固定改成某个值

需求:所有「发送」类封包,第 5 个字节(下标 4)由 01 改成 09

  1. 新增滤镜,命名「锁定字段」。
  2. 模式 = 普通;动作 = 替换
  3. 作用类别勾 发送(注入)或 TCP 请求(代理)。
  4. 数据表:搜索行第 005 列填 01;修改行第 005 列填 09
  5. 保存 → 回列表打开启用开关。

案例 2 · 屏蔽刷屏的心跳包

需求:包头是 01 00 03、长度恒为 8 的包不要出现在列表里。

  1. 新增滤镜,动作 = 不修改 - 不显示
  2. 高级指定:勾「指定包头」,填 01 00 03
  3. 指定类型:勾「长度」,填 8
  4. 数据表搜索行 001 / 002 / 003 分别填 01 / 00 / 03
// 别忘了这一步

第 4 步不能省——搜索行为空的滤镜永远不会命中,只填「指定包头」是不够的。

案例 3 · 特征串跟随修改(高级模式)

需求:无论 4A 5B 出现在包的哪里,都把它后面第 2 个字节改成 FF

  1. 模式 = 高级;动作 = 替换;修改起始于 = 自发现有连锁的位置
  2. 搜索表:0014A0025B
  3. 修改表(相对):在偏移 +3 的列填 FF
    锚点 4A = 偏移 0,5B = 1,其后第 1 个 = 2,第 2 个 = 3。

案例 4 · 序号自增(递进)

需求:每次命中就把第 9 字节 +1,溢出时向前进位 2 字节。

  1. 模式 = 普通;动作 = 替换。
  2. 递进组:勾「连续递进」,步长填 1;勾「进位递进」,位数填 2
  3. 修改行第 009 列右键 → 启用递进(格子变深红)。

案例 5 · 命中后自动回发一串数据

  1. 先建一个 发送 项,把要回发的封包加进它的封包集。
  2. 建滤镜,动作可选「不修改 - 只显示」(只是想借它触发,不改数据)。
  3. 勾「执行」→ 类型选 发送列表 → 选中刚才那个发送项。

11 · 滤镜不生效排查清单

// 按顺序逐条检查

① 滤镜列表里的 启用开关 打开了吗?
作用类别 至少勾了一个吗?勾的类别和要抓的包类别一致吗?
③ 「指定类型」勾了套接字 / 长度 / 端口但填错值?这些是 AND 条件。
④ 数据表的 搜索行 为空?没有搜索内容永远不会命中。
⑤ 普通模式下下标是否 超出了封包长度?超出直接判不匹配。
⑥ 「滤镜执行模式 = 优先原则」时,前面已有滤镜命中就轮不到它——把它 置顶 试试。
⑦ 想改的是 HTTP / HTTPS / WebSocket 包?滤镜对这些类别无效,请改用 映射设置

// 改错了位置

列标题 001 = 下标 0。高级模式选「自发现有连锁的位置」时,修改表列号是 相对锚点的偏移,不是绝对位置。