CN
v2.5
WPE_TUTORIAL_V2 // 04_FILTER

滤镜

最新版教程

滤镜是 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 · 滤镜列表

02滤镜列表 · 工具条 + 一条执行顺序提示 + 表。
WPE x64 滤镜列表:新增 / 全部启用 / 全部禁用 / 重置计数,执行顺序提示条与滤镜表
  1. 工具条:新增滤镜 · 全部启用 · 全部禁用 · 重置计数;右端是导入 / 导出 / 清空
  2. 执行顺序提示条:左边那枚徽标显示 当前实际的执行模式(按顺序执行 / 优先原则,在 系统设置 里切),后面一句话说明这个模式下顺序意味着什么。⚠️ 优先原则那一档徽标转 琥珀——那时「顺序」的含义变了(只跑命中的第一条)
  3. 表列:序号 / 启用 / 滤镜名称 / 动作 / 执行次数 / 指定类型 / 递进 / 操作
  4. 动作 那一列统一是淡紫色;真正按动作上色的是 封包列表里命中的那一行 —— 替换=洋红 · 换包=琥珀 · 拦截=红 · 仅显示=青,四组配色在 系统设置 · 动作配色 里可改(不显示 根本不进列表,所以没有它的配色)
  5. 启用 是这一屏唯一的勾选框(全项目的勾选框一律是绿的),点一下立刻生效并落库;没启用的行整行压暗,但勾选框那格除外
  6. 双击一行 打开滤镜编辑(行尾那支笔也一样)
  7. ⚠️ 这张表刻意不能按表头排序:这份列表的 顺序就是数据(引擎按下标从上往下走),排一次就会让屏幕上的顺序与实际执行顺序对不上。要调顺序用右键的置顶 / 上移 / 下移 / 置底

工具条从左到右:新增滤镜 全部启用 全部禁用 重置计数;右端三个作用于整张表:导入(读一个 .fp)导出(把全部滤镜写成 .fp)清空。

列表右键七项,作用于当前选中的那些行(项目名后面直接标着条数):置顶 / 向上移动 / 向下移动 / 置底 / 导出 / 复制 / 删除,另有 全选 / 取消选择。一行都没选就点,会提示「请先勾选要操作的行」。双击一行 打开滤镜编辑。

// 顺序有意义

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

创建滤镜的三种方式

  1. 滤镜列表工具条 → 新增滤镜:创建一条空滤镜,名字是 滤镜 N(N 是当前条数 + 1),模式 普通、动作 替换、作用类别 默认全勾、启用开关默认关着。
  2. 封包列表 / 代理数据列表右键 → 添加到滤镜列表:用该封包内容 自动填充搜索行——最省事的起手式。
  3. 在十六进制面板 / 封包编辑里选中一段字节 → 右键 → 添加到滤镜列表:只用选中片段填充,适合已经定位到特征串的情况;一个字节都没选时用的是整包。

03 · 滤镜编辑窗口

03滤镜编辑(普通模式) · 上半是参数,中间是查找 / 修改两行格子,下半是条件与递进。
WPE x64 滤镜编辑:模式、动作、执行、修改起始于、查找与修改格子、作用类别、指定类型、递进
  1. 滤镜名称:自由文本。封包列表右键「添加到滤镜列表」生成的那条,默认名是 服务端地址 + 封包长度(如 101.227.22.133:443 [180]),一眼能分清是哪个连接抓来的
  2. 模式:普通(查找与修改 对齐同一列)/ 高级(两者位置各自独立),见 04 节。右边那句灰字会跟着模式换,说的就是这件事
  3. 动作:替换 / 换包 / 拦截 / 仅显示 / 不显示,五选一,见 06 节
  4. 执行:勾「命中后执行」后,左边选类型(发送列表 / 机器人列表 / 滤镜列表 / 仓库列表)、右边选具体对象;没勾时两个下拉压暗禁用
  5. 修改起始于:只有高级模式用得上(普通模式下压暗但仍然显示,让人看得见有这个选项)。「包头」= 从第 1 字节算起;「指定位置」= 相对 匹配点 的偏移,可以是负数
  6. 查找 / 修改:普通模式下两行同在一张表里、共用一个滚动条按列对齐(查找行浅黄、修改行黄);高级模式下查找只有一行,修改是 另一张独立的表、有自己的滚动条。列号从 001 起,共 1000 列(表下面那一行的右端有「跳到第 N 列」,敲个数字直接滚过去)
  7. 图例那一行的三个色块 就是单元格标记:设为排除 · 设为递进 · 设为随机,在格子上右键切换,见 05 节
  8. 作用于哪些封包:按当前模式出不同的一组 —— 代理模式是 TCP / UDP 的请求与响应四项(图中所示),注入模式是八个 WinSock 类别。至少勾一个,否则这条滤镜永远不生效
  9. 指定类型:包头 / 长度 / 套接字 / 端口四个前置条件,勾了才算数,多个之间是 AND。输入框里的占位符直接示范了写法(如 80 或 80-90,多个用 ; 隔开)—— 保存时会检查格式,写错了当场提示
  10. 递进:连续 + 步长 / 进位 + 进位值,与「指定类型」并排各占两行。⚠️ 它只决定 怎么加,加在哪个字节 由修改行里被标成「递进」的格子决定,两者缺一不可
// 列号 ≠ 下标

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

取值器与动态替换(2.5)

「取值器」在 Rules 分组中,用来把一次命中的封包字段保存成变量,再在后续滤镜修改时写回。一个取值器本身不匹配封包;它由滤镜的「取值器赋值」动作触发。变量可为常量、封包取值或表达式,数据类型为整数、浮点、字节或文本。

  • 取值可按绝对偏移或相对当前匹配点的偏移读取;整数支持端序与有符号解析,文本支持 UTF-8、GB18030、Big5。越界或转换失败不会产生值。
  • 作用域分为全局、Socket、代理会话;后两者可以设有效期。运行值仅留在处理封包的进程内存中,关闭或过期即不可再用,不会写进数据库或备份。
  • 表达式可以引用已启用变量(${取值器.变量:格式});数值可计算,字节可拼接,文本可拼接。循环或未取到的引用不会产生可写入结果。
  • 动态替换在滤镜修改格右键选择「绑定取值器变量」,并选对应写入格式。数值必须明确宽度和端序;当变量不存在、未启用、未取到或过期时,该次修改不会写入该变量。
// 顺序建议

让负责取值的滤镜排在使用变量的滤镜之前;同一封包命中时,WPE 先完成取值,再渲染绑定的修改格。取值器配置支持排序、复制、导入导出和备份。

04取值器列表 · 管理名称、启用状态、作用域、变量数与备注。
WPE x64 取值器列表:新增、批量启用、导入导出与取值器表格
05取值器编辑 · 配置作用域、变量类型、取值范围、表达式与有效期。
WPE x64 取值器编辑器:变量配置与封包取值参数
06绑定取值器变量 · 在滤镜修改格中选择变量和写入格式。
WPE x64 滤镜编辑器中的取值器变量绑定窗口

04 · 普通模式 vs 高级模式

04两种匹配方式的差别 · 同样是找 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
// 三条限制

① 普通模式的查找格不收 *——编辑器只让键入 0-9 A-F。要用通配符请切到 高级 模式(修改格两种模式下都收)。
② 只有形如 X* / *X(长度恰好 2)的写法算部分通配;** 这种全通配 不会加入匹配条件(等于留空)。
③ 高级模式下 最左边那一格是锚点,引擎拿它在整包里逐字节找起点,比的是 整字节相等——在锚点上写通配符不会按半字节放宽。通配符要留给后面那几格。

05 · 三种单元格标记

在格子上右键即可切换,靠 底色 区分。三种标记在两张表下面有一排 同色图例,与格子一眼对得上;再右键一次「取消排除 / 取消标记」还原。递进与随机互斥,标了一个另一个自动撤掉;空格子不能设排除(会提示「空值无法设置排除」),把值删空时紫底也跟着撤掉。

标记可用行底色语义
排除搜索行紫取反:该字节 不等于 填入值才算匹配
递进修改行深红每命中一次就按步长累加,可进位
随机修改行亮蓝每次写入一个随机字节,保证与原值不同;标上之后格子里的值会被清掉(随机位用不着预设值)
// 常见错误

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

递进的计算方式

对每个递进位:新值 = 旧值 + 步长 ×(递进次数 + 1)(超过 0xFF 按 256 取模)

  • 勾了 连续,每命中一次「递进次数」+1,形成持续累加;不勾则每次都是同样的增量
  • 勾了 进位,字节溢出(> 0xFF)时向 前面 的字节进位,最多往前推 进位值 个字节;哪一位不再产生进位就停
  • 「递进次数」不落库:重启程序、或在列表工具条上按「重置计数」,它和执行次数一起归零

06 · 五种动作

// 与老教程里的叫法对照

老教程里的「不修改 - 只显示」「不修改 - 不显示」就是这里的 仅显示 / 不显示,.filt 转换出来的滤镜也对应这两项。

动作行为命中行的默认配色
替换按「修改」行改写命中位置的字节;同时应用递进与随机位。唯一会继续往下匹配的动作暗洋红底 + 亮洋红字
换包丢弃原包内容,用「修改」行的数据新建封包(长度 = 最大下标 + 1)暗琥珀底 + 亮琥珀字
拦截该封包不发送 / 不接收,直接丢弃暗红底 + 亮红字
仅显示内容不变,但确保这条被记入列表并统计暗青底 + 亮青字
不显示内容不变,且 不入列表(静默高频心跳)—(它根本不进列表)
// 这四组颜色是可配的

上表是 新建数据库 的出厂值(暗底 + 同色相亮字,为深色皮肤重调过)。在 系统设置 · 动作配色 里点色块可以改前景 / 背景。⚠️ 配色是 落库 的,老库里存的还是旧的一套,要改或者换新库才会变。

// 换包的修改行必须从头连起来

「换包」是用修改行 整体替换 封包,所以那一行必须是从第 001 列起 连续填满 的一段:中间空一格、或者夹一个「随机」格(设为随机会把值清掉),保存时会直接被拦下来报「换包数据错误」。新包长度 = 修改行里 最大下标 + 1。想保留原始内容请用「替换」。

执行联动

勾上「命中后执行」之后,左边那个下拉选类型、右边那个选具体对象:

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

对应列表为空时右边那个下拉会写「这张表还没有可选项」——先去建一个发送 / 机器人 / 仓库再回来。

07 · 滤镜执行模式

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

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

08 · 滤镜日志与统计

每次命中(非 极速模式)会写一条滤镜日志:时间 / 滤镜名称 / 动作 / 匹配数 / 类型 / 长度,在 系统日志 → 滤镜日志 查看,可导出 Excel。「匹配数」在普通模式下恒为 1,高级模式下是这一包里命中了几处。

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

09 · 导入导出与格式转换

  • 原生格式 .fp(滤镜列表文件,XML,可加密)
  • 从 旧版 WPE 的 .filt 过滤器文件 转换:用 数据提取 页,选 旧版 FILT 过滤器 那张卡(.filt → .fp),再把生成的 .fp 用滤镜列表的「导入」读进来。转换按行解析 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. 搜索表:001 填 4A,002 填 5B。
  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。高级模式选「指定位置」时,修改表列号是 相对锚点的偏移(列头带符号,000 就是锚点本身),不是绝对位置。