滤镜
滤镜是 WPE x64 的灵魂功能:在封包真正发出 / 收下之前,按规则匹配并改写它。本章把匹配算法、四种特殊标记、五种动作和执行联动一次讲透。
00 · 改包之前:这活该交给谁
WPE 里有四个地方都能「让流量变得不一样」,但适用范围完全不同。选错入口是滤镜不生效的头号原因——尤其是拿滤镜去改 HTTP(S),那是永远不会命中的:
| 你想做的事 | 该用 | 为什么不是滤镜 |
|---|---|---|
| 改 TCP / UDP 封包里的某几个字节 | 滤镜 · 替换 | ——就是它 |
| 让某类封包干脆不发出去 / 不收进来 | 滤镜 · 拦截 | ——就是它 |
| 命中后回发一串固定数据 | 滤镜 · 换包,或滤镜触发 机器人 | ——就是它 |
| 改 HTTP / HTTPS 的响应内容 | 映射设置 · 本地映射 | 滤镜的作用类别只有 12 个开关,没有 HTTP(S) / WebSocket 项,这类包不参与匹配 |
| 把请求转到另一个域名 / 端口 | 映射设置 · 远程映射 | 滤镜只改内容,不改目标地址 |
| 某类封包根本别抓 | 拦截设置 | 滤镜在封包产生之后才介入,从源头关掉更省资源 |
| 只是列表太乱、想少看几行 | 过滤设置 | 滤镜会真的改数据,拿它当「显示过滤」用会误伤线上流量 |
| 主动发一串包 / 定时循环发 | 发送列表 | 滤镜是被动触发的,没有命中就不会动 |
滤镜是 WPE 里唯一能 改真实网络数据 的机制。下面是从零建一条到确认它跑起来的最短路径。
- 先抓到样本:在封包列表里找到要改的那个包,右键 → 添加到滤镜列表,搜索区会用它的内容预填好。
- 填滤镜名称,勾上要作用的 封包类别(注入模式选发送 / 接收…,代理模式选 TCP / UDP 请求响应)。
- 写搜索行:只留能唯一定位的那几个字节,其余单元格 留空表示通配。填得越少越容易命中,填得越多越精准。
- 写修改行:在对应偏移填上新值。需要每次递增或随机时改用 递进 / 随机标记。
- 选动作:改字节用
替换、丢包用拦截、整包重造用换包(详见 06 节)。 - 保存 → 回列表把「启用」打开 → 开始抓包,到 滤镜日志 与 统计数据 确认它真的在跑;列表里 执行次数 那一列会开始涨,命中的封包在封包列表里会变底色。
01 · 滤镜的生命周期
02 · 滤镜列表

- 工具条:新增滤镜 · 全部启用 · 全部禁用 · 重置计数;右端是导入 / 导出 / 清空
- 执行顺序提示条:左边那枚徽标显示 当前实际的执行模式(按顺序执行 / 优先原则,在 系统设置 里切),后面一句话说明这个模式下顺序意味着什么。⚠️ 优先原则那一档徽标转 琥珀——那时「顺序」的含义变了(只跑命中的第一条)
- 表列:
序号 / 启用 / 滤镜名称 / 动作 / 执行次数 / 指定类型 / 递进 / 操作 - 动作 那一列统一是淡紫色;真正按动作上色的是 封包列表里命中的那一行 —— 替换=洋红 · 换包=琥珀 · 拦截=红 · 仅显示=青,四组配色在 系统设置 · 动作配色 里可改(不显示 根本不进列表,所以没有它的配色)
- 启用 是这一屏唯一的勾选框(全项目的勾选框一律是绿的),点一下立刻生效并落库;没启用的行整行压暗,但勾选框那格除外
- 双击一行 打开滤镜编辑(行尾那支笔也一样)
- ⚠️ 这张表刻意不能按表头排序:这份列表的 顺序就是数据(引擎按下标从上往下走),排一次就会让屏幕上的顺序与实际执行顺序对不上。要调顺序用右键的置顶 / 上移 / 下移 / 置底
工具条从左到右:新增滤镜 全部启用 全部禁用 重置计数;右端三个作用于整张表:导入(读一个 .fp)导出(把全部滤镜写成 .fp)清空。
列表右键七项,作用于当前选中的那些行(项目名后面直接标着条数):置顶 / 向上移动 / 向下移动 / 置底 / 导出 / 复制 / 删除,另有 全选 / 取消选择。一行都没选就点,会提示「请先勾选要操作的行」。双击一行 打开滤镜编辑。
在「按顺序执行」模式下,列表顺序就是匹配顺序。滤镜不生效时,先试试把它置顶。
创建滤镜的三种方式
- 滤镜列表工具条 → 新增滤镜:创建一条空滤镜,名字是
滤镜 N(N 是当前条数 + 1),模式普通、动作替换、作用类别 默认全勾、启用开关默认关着。 - 封包列表 / 代理数据列表右键 → 添加到滤镜列表:用该封包内容 自动填充搜索行——最省事的起手式。
- 在十六进制面板 / 封包编辑里选中一段字节 → 右键 → 添加到滤镜列表:只用选中片段填充,适合已经定位到特征串的情况;一个字节都没选时用的是整包。
03 · 滤镜编辑窗口

- 滤镜名称:自由文本。封包列表右键「添加到滤镜列表」生成的那条,默认名是 服务端地址 + 封包长度(如
101.227.22.133:443 [180]),一眼能分清是哪个连接抓来的 - 模式:普通(查找与修改 对齐同一列)/ 高级(两者位置各自独立),见 04 节。右边那句灰字会跟着模式换,说的就是这件事
- 动作:替换 / 换包 / 拦截 / 仅显示 / 不显示,五选一,见 06 节
- 执行:勾「命中后执行」后,左边选类型(发送列表 / 机器人列表 / 滤镜列表 / 仓库列表)、右边选具体对象;没勾时两个下拉压暗禁用
- 修改起始于:只有高级模式用得上(普通模式下压暗但仍然显示,让人看得见有这个选项)。「包头」= 从第 1 字节算起;「指定位置」= 相对 匹配点 的偏移,可以是负数
- 查找 / 修改:普通模式下两行同在一张表里、共用一个滚动条按列对齐(查找行浅黄、修改行黄);高级模式下查找只有一行,修改是 另一张独立的表、有自己的滚动条。列号从
001起,共 1000 列(表下面那一行的右端有「跳到第 N 列」,敲个数字直接滚过去) - 图例那一行的三个色块 就是单元格标记:设为排除 · 设为递进 · 设为随机,在格子上右键切换,见 05 节
- 作用于哪些封包:按当前模式出不同的一组 —— 代理模式是 TCP / UDP 的请求与响应四项(图中所示),注入模式是八个 WinSock 类别。至少勾一个,否则这条滤镜永远不生效
- 指定类型:包头 / 长度 / 套接字 / 端口四个前置条件,勾了才算数,多个之间是 AND。输入框里的占位符直接示范了写法(
如 80 或 80-90,多个用 ; 隔开)—— 保存时会检查格式,写错了当场提示 - 递进:连续 + 步长 / 进位 + 进位值,与「指定类型」并排各占两行。⚠️ 它只决定 怎么加,加在哪个字节 由修改行里被标成「递进」的格子决定,两者缺一不可
列标题 001 对应字节 下标 0。数封包偏移时记得减一。
取值器与动态替换(2.5)
「取值器」在 Rules 分组中,用来把一次命中的封包字段保存成变量,再在后续滤镜修改时写回。一个取值器本身不匹配封包;它由滤镜的「取值器赋值」动作触发。变量可为常量、封包取值或表达式,数据类型为整数、浮点、字节或文本。
- 取值可按绝对偏移或相对当前匹配点的偏移读取;整数支持端序与有符号解析,文本支持 UTF-8、GB18030、Big5。越界或转换失败不会产生值。
- 作用域分为全局、Socket、代理会话;后两者可以设有效期。运行值仅留在处理封包的进程内存中,关闭或过期即不可再用,不会写进数据库或备份。
- 表达式可以引用已启用变量(
${取值器.变量:格式});数值可计算,字节可拼接,文本可拼接。循环或未取到的引用不会产生可写入结果。 - 动态替换在滤镜修改格右键选择「绑定取值器变量」,并选对应写入格式。数值必须明确宽度和端序;当变量不存在、未启用、未取到或过期时,该次修改不会写入该变量。
让负责取值的滤镜排在使用变量的滤镜之前;同一封包命中时,WPE 先完成取值,再渲染绑定的修改格。取值器配置支持排序、复制、导入导出和备份。



04 · 普通模式 vs 高级模式
4A 5B,结果完全不同。| 普通模式 | 高级模式 | |
|---|---|---|
| 语义 | 绝对位置匹配 | 特征串滑动搜索 |
| 能命中几处 | 只判定一次 | 可命中多处 |
| 数据表 | 一张表两行(查找 / 修改),共用一个滚动条、按列对齐,列 001~1000 | 两张各自独立的表(查找一行 + 修改一行),各有各的滚动条;修改表的列范围随「修改起始于」变 |
| 修改下标 | 绝对下标 | 「包头」= 绝对;「指定位置」= 相对偏移(可负) |
| 适用 | 协议字段位置固定 | 字段位置浮动、变长头 |
修改起始于(仅高级模式)
| 选项 | 处理范围 | 修改表列号含义 |
|---|---|---|
| 包头(默认) | 只处理 第一处 匹配 | 绝对下标,从 0 开始 |
| 指定位置 | 处理 每一处 匹配 | 相对锚点的偏移,锚点自身 = 0,可为负 |
通配符
搜索格支持 半字节通配:
| 写法 | 含义 | 掩码 |
|---|---|---|
4A | 精确匹配字节 0x4A | 0xFF |
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。
- 新增滤镜,命名「锁定字段」。
- 模式 = 普通;动作 = 替换。
- 作用类别勾
发送(注入)或TCP 请求(代理)。 - 数据表:搜索行第
005列填01;修改行第005列填09。 - 保存 → 回列表打开启用开关。
案例 2 · 屏蔽刷屏的心跳包
需求:包头是 01 00 03、长度恒为 8 的包不要出现在列表里。
- 新增滤镜,动作 = 不显示。
- 指定类型:勾 包头,填
01 00 03(两位一组,空格可有可无)。 - 指定类型:勾 长度,填
8。 - 数据表搜索行
001/002/003分别填01/00/03。
第 4 步不能省——搜索行为空的滤镜永远不会命中,只填「指定类型 · 包头」是不够的:那四项只是前置条件,真正的匹配靠搜索行。
案例 3 · 特征串跟随修改(高级模式)
需求:无论 4A 5B 出现在包的哪里,都把它后面第 2 个字节改成 FF。
- 模式 = 高级;动作 = 替换;修改起始于 = 指定位置。
- 搜索表:
001填4A,002填5B。 - 修改表(相对):在偏移
+3的列填FF。
锚点4A= 偏移 0,5B= 1,其后第 1 个 = 2,第 2 个 = 3。
案例 4 · 序号自增(递进)
需求:每次命中就把第 9 字节 +1,溢出时向前进位 2 字节。
- 模式 = 普通;动作 = 替换。
- 递进组:勾 连续,步长填
1;勾 进位,进位值填2。 - 在 修改行第
009列右键 → 设为递进(格子变深红)。
案例 5 · 命中后自动回发一串数据
- 先建一个 发送 项,把要回发的封包加进它的发送集。
- 建滤镜,动作可选 仅显示(只是想借它触发,不改数据)。
- 勾 命中后执行 → 左边的类型选
发送列表→ 右边选中刚才那个发送项。
11 · 滤镜不生效排查清单
① 滤镜列表里的 启用开关 打开了吗?
② 作用类别 至少勾了一个吗?勾的类别和要抓的包类别一致吗?
③ 「指定类型」勾了包头 / 套接字 / 长度 / 端口却填了不匹配的值?这四项是 AND 条件,任一条不成立整条滤镜就跳过(格式写错的话保存时就会被拦下)。
④ 数据表的 搜索行 为空?没有搜索内容永远不会命中。
⑤ 普通模式下下标是否 超出了封包长度?超出直接判不匹配。
⑥ 「滤镜执行模式 = 优先原则」时,前面已有滤镜命中就轮不到它——把它 置顶 试试。
⑦ 想改的是 HTTP / HTTPS / WebSocket 包?滤镜对这些类别无效,请改用 映射设置。
列标题 001 = 下标 0。高级模式选「指定位置」时,修改表列号是 相对锚点的偏移(列头带符号,000 就是锚点本身),不是绝对位置。