CN
v2.1.7
WPE_TUTORIAL_V2 // 02_INJECT

注入模式

Tutorial Rev · 2.1.8 beta

WPEHook.dll 注入目标进程,从 进程内部 挂钩 WinSock 收发函数。这是最贴近程序逻辑的抓包方式,本章走完从选目标到改包的完整链路。

// 一句话原理

EasyHook 把托管程序集注入目标进程 → 在目标进程内 Application.Run(InjectModeForm)WPE 的界面显示在被注入的程序里,用 LocalHook 挂钩 wsock32.dll / ws2_32.dll / mswsock.dll 的收发函数。

快速上手 // 注入模式六步

目标已经在运行、也不需要抓启动阶段的包时,这六步就是全部流程。

  1. 首页点 注入模式,在弹出的「进程列表」里用上方输入框筛出目标进程名。
  2. 单击选中那一行(下方回显变绿即表示已选中),点 注入。成功后 WPE 界面会出现在目标程序里。
  3. 进「菜单 → 拦截设置」,勾上要挂钩的收发函数。默认全开,先别急着减
  4. 包太多看不过来时,再进「菜单 → 过滤设置」按端口 / 长度 / 内容缩小 显示 范围。
  5. 点工具栏 开始,操作目标程序产生网络行为,封包实时滚入列表。
  6. 双击目标行打开 封包编辑,改字节 → 点「发送」重放;确认规律后再把它固化成 滤镜

01 · 选择注入目标

首页点「注入模式」后弹出「进程列表」对话框。

01进程列表 · 四种选目标的方式,右下角五个按钮。
进程列表 筛选进程列表 1 ICO 进程名称 ⇅ 进程编号 ⇅ 路径 chrome7284C:\Program Files\Google\...\chrome.exe Ld9BoxHeadless16980D:\leidian\LDPlayer9\...\dnplayer.exe notepad3312C:\Windows\System32\notepad.exe game9021D:\Games\game.exe …(枚举全部进程) 2 Ld9BoxHeadless [16980] 3 选择窗体 选择程序 刷新 注入 退出 4 5 6 7
  1. 筛选进程列表:按进程名实时过滤,不区分大小写、子串匹配
  2. 进程表格:图标 / 进程名称 / 进程编号(PID)/ 路径。名称与 PID 两列可点表头排序,单击一行即选中
  3. 已选目标回显:为空时边框标红,选中后变绿显示 进程名 [PID]
  4. 选择窗体:进入拾取模式 —— 鼠标悬停任意窗口会浮出「进程 / PID / 标题 / 路径」提示;左键点击目标窗口即选中并立刻注入;按 Esc 取消
  5. 选择程序:选一个尚未运行的 .exe。注入时走 CreateAndInject(先创建挂起进程再注入),可以 从程序启动的第一个包开始抓
  6. 刷新:清空两个输入框并重新枚举进程
  7. 注入:执行注入。成功后本对话框关闭,WPE 界面出现在目标进程里
// 贴心设计

程序会记住 最后一次成功注入的进程名,下次打开进程列表时若该进程正在运行会自动预选,省掉重新找的功夫。

三种选目标方式怎么挑

方式适用场景能否抓启动阶段
列表单击目标已在运行,且知道进程名
选择窗体不知道进程名,只知道是哪个窗口(多开、模拟器子窗口)
选择程序需要抓登录 / 握手等启动阶段封包
// 关键

用「选择程序」注入后,目标进程处于 挂起 状态,看起来像卡死。必须点一次工具栏的 开始,程序内部才会调用 WakeUpProcess() 唤醒它。

02 · 主界面导览

02注入模式主界面 · 左侧 11 项导航(带实时角标),右侧为工作区。
WPE x64 - 注入模式2.1.8 中文 — □ ✕ 8 封包列表248 滤镜列表3 发送列表2 机器人列表1 仓库列表4 统计数据 文本对比 异或计算 编码转换 数据提取 系统日志37 1 Ld9BoxHeadless [16980] | 主窗口标题 句柄:0x0034F1 | WinSock 1.1 2.0 Microsoft | 发送 : 12.3 KB 接收 : 45.6 KB 2 开始 停止 清空 🔍 自动滚动 自动清理 5000 窗口保持最前 菜单 ▾ 序号时间戳类别套接字 本机地址远端地址长度数据 110:22:31:0114820发送5164192.168.88.85:61821106.75.109.179:44318416 03 01 00 B3… 210:22:31:0231907接收5164106.75.109.179:443192.168.88.85:61821607216 03 03 00 54… 310:22:31:5510033WSA接收自5148192.168.1.1:530.0.0.0:61176289F9 C3 81 80 00… 410:22:32:1002119发送5164192.168.88.85:61821106.75.109.179:4439317 03 03 00 58… 510:22:32:4471028WSA发送5252192.168.88.85:61822106.14.127.178:8072150 4F 53 54 20… 610:22:33:0018844接收5252106.14.127.178:80192.168.88.85:6182241348 54 54 50 2F… 3 封包总数 : 248 | 滤镜执行 : 31 | 缓存区 : 0 | 过滤 : 12 | 发送 : 88 | 接收 : 92 | 发送到 : 14 | 接收自 : 10 | WSA 发送 : 24 | WSA 接收 : 8 4 滤镜发送机器人仓库 启用滤镜名称次数 锁定字段18 屏蔽心跳9 序号递进4 全部启用 全部禁用 重置计数 5 封包数据(十六进制) 00000000F9 C3 81 80 00 01 00 02 00 00 00 04 74 61 67 73ù.....tags 0000001072 6F 77 69 6E 67 69 6F 03 63 6F 6D 00 00 01 00rowingio.com 0000002001 C0 0C 00 05 00 01 00 00 02 58 00 0A 4B 6D C0.À........Km 0000003011 C0 0C 00 01 00 01 00 00 00 3C 00 04 76 69 70.À........vip 0000004033 06 61 6C 69 64 6E 73 00 00 01 00 01 C0 0C 003.alidns 行 3 列 1 289 Bytes Bits of Byte 0: 11111001 6 7
  1. 左侧导航(11 项):封包列表 / 滤镜列表 / 发送列表 / 机器人列表 / 仓库列表 / 统计数据 / 文本对比 / 异或计算 / 编码转换 / 数据提取 / 系统日志。绿色角标是 实时条数
  2. 信息条:进程名 [PID] · 主窗口标题与句柄 · 探测到的 WinSock 版本 · 累计收发字节
  3. 封包列表:行底色即滤镜动作结果(金=替换、红=拦截、蓝=换包,见 配色表)。双击任意行 打开封包编辑
  4. 统计条:封包总数 / 滤镜执行 / 缓存区 / 过滤 / 八类函数计数
  5. 快捷列表:四个页签(滤镜 / 发送 / 机器人 / 仓库),抓包时不用切主菜单就能开关滤镜。双击一行打开对应编辑窗口
  6. 封包数据面板:选中行的十六进制编辑器(Be.Windows.Forms.HexBox),底部显示行列与字节位信息
  7. 菜单:7 项设置抽屉,从右侧滑出
  8. 折叠导航 / 明暗主题 / 显示设置 / 语言切换
// WinSock 版本探测

信息条第三段如果只显示 WinSock(后面没有 1.1 / 2.0 / Microsoft),说明目标进程 还没加载任何 WinSock 模块——此时挂钩挂不上去,一个包都抓不到。先让程序产生一次网络行为,再重新注入。

03 · 开始抓包

  1. 先进 菜单拦截设置,勾选需要的函数(见下节)。必须在点「开始」之前设置。
  2. 需要的话再进 过滤设置 缩小显示范围。
  3. 开始:挂钩生效;若目标是被挂起创建的,此时一并唤醒。
  4. 让目标程序产生网络行为,封包实时滚入列表。
  5. 停止 卸载全部钩子,目标程序恢复原状;点 清空 清空队列、列表、数据面板与全部计数器。

04 · 拦截设置

决定 挂哪些钩子,直接影响能抓到什么。

03拦截设置(注入模式页) · 12 个函数开关,默认全开。
拦截设置 Winsock 1.1 发送 1.1 发送到 1.1 接收 1.1 接收自 1.1 Winsock 2.0 发送 发送到 接收 接收自 WSA发送 WSA发送到 WSA接收 WSA接收自 ※ mswsock 的 WSARecvEx 跟随「WSA接收」开关 保存 退出
  • Winsock 1.1wsock32.dll):send / sendto / recv / recvfrom
  • Winsock 2.0ws2_32.dll):send / sendto / recv / recvfrom + WSASend / WSASendTo / WSARecv / WSARecvFrom
  • MS 扩展mswsock.dll):WSARecvEx,跟随「WSA接收」
  • 只有 被探测到的 WinSock 版本 对应的钩子才会真正挂上
// 必看

挂钩是在点「开始」的 那一刻 按开关逐个创建的。开始之后再改拦截设置 不会生效,必须「停止」→ 改 →「开始」。

05 · 过滤设置(只影响显示)

04过滤设置 · 先选过滤方式,再填条件;各条件之间是 AND 关系。
过滤设置 过滤方式 : 不显示 只显示 1 套接字 : 5164;5252 长度 : 0-99;100 IP地址 : 支持 ; 分隔符 端口号 : 443;80 指定包头 : 十六进制带空格,支持 ; 分隔符 指定内容 : 十六进制带空格,支持 ; 分隔符 2 指定类别 : 发送 接收 发送到 接收自 WSA 发送 3 保存 退出
  1. 过滤方式不显示 = 命中条件的 不显示只显示 = 只显示命中条件的
  2. 六个条件,格式如下表。勾了但输入框留空,保存时会被拒绝
  3. 指定类别:勾选后展开类别复选框组,注入页 8 项、代理页 4 项
条件格式匹配方式
套接字5164;5252精确匹配,; 分隔
长度0-99;100支持区间与单值
IP地址1.1.1.1;8.8.8.8精确匹配 IP 段,本机与远端任一命中即算命中
端口号443;80精确匹配端口段,同上
指定包头01 00 0A;02 FF匹配封包 开头
指定内容4A 5B;FF FF在整包十六进制串中 子串包含

06 · 列表设置

两个页签(注入 / 代理),各 10 个复选框,控制列表显示哪些列:

序号 · 时间戳 · 类别 · 套接字 · 本机地址 · 本机所属地 · 远端地址 · 远端所属地 · 长度 · 数据

// 性能技巧

关掉两个 「所属地」 列可以显著降低高频抓包时的开销——它们背后是 QQWry 离线库查询 + 国旗图标渲染。

05查找封包抽屉 · 从顶部滑出。注意输入的是 正则表达式,不是纯文本。
^16 03 0[13] 1 查找文本 查找十六进制 2 从头开始 向下搜索 3 查找下一个 退出 4
  1. 正则表达式 输入框
  2. 匹配目标查找文本 = 把封包按 UTF-8 解码后的文本;查找十六进制 = 按十六进制格式化后的字符串(形如 16 03 01带空格
  3. 起点:从索引 0 开始 / 从当前选中行继续
  4. 查找下一个:命中后列表滚动选中该行,并在下方 Hex 编辑器 高亮定位到匹配片段;该行 Hex 定位不到时自动跳下一条继续搜

示例:查找以 0x16 0x03 开头的 TLS 记录 → 选「查找十六进制」,填 ^16 03。全部搜完无结果时弹出「没有匹配的封包」。

08 · 封包编辑与重放

双击列表行,或右键 → 编辑。这是 手工改包 + 重放 的主战场。

06封包编辑窗口 · 四个功能块:套接字 / 十六进制编辑器 / 发送 / 递进。
封包编辑 套接字 使用套接字 :5164 远端地址 :106.75.109.179:443 长度 :184 1 0000000016 03 01 00 B3 01 00 00 AF 03 03 F7 47 D1 EE 94......¯..÷GÑî. 0000001016 1B 76 2E 3A 41 2C 9A 5E 33 0C 4D 6E 6E 1F 5C..v.:A,.^3.Mnn.\ 0000002000 00 20 C0 2B C0 2F C0 2C C0 30 CC A9 CC A8 C0.. À+À/À,À0̨̩À 0000003013 C0 14 00 9C 00 9D 00 2F 00 35 01 00 00 66 00.À....../.5...f. 0000004000 00 12 00 10 00 00 0D 77 77 77 2E 65 78 61 6D........www.exam 0000005070 6C 65 2E 63 6F 6D 00 17 00 00 FF 01 00 01 00ple.com....ÿ.... …(可直接编辑,插入/删除会实时更新「长度」;右键有完整菜单) 2 发送 按次发送 1 连续发送 间隔(毫秒)100 3 递进 启用递进 位置8 步长1 进位递进 位数2 4 发送总数 : 120 | 成功 : 118 | 失败 : 2 5 发送 停止 保存 退出 6 7
  1. 使用套接字:默认取原封包的 socket,发送时用这个。填 0 则走代理模式的 SunnyNet 通道(见下方说明)
  2. 十六进制编辑器:可直接改字节。右键菜单 = 添加到发送 ▸ / 添加到滤镜列表 / 剪切 / 复制 ▸(文本、十六进制)/ 粘贴 ▸(文本、十六进制)/ 全选。光标移动会同步「递进位置」
  3. 发送方式:按次发送(指定次数)或连续发送(无限循环直到点停止);间隔设为 0 则不休眠
  4. 递进:每发一次就把指定字节 +步长。位置 必须小于封包长度,否则报「递进位置错误」;勾「进位递进」后溢出会向前面的字节进位,最多进 位数
  5. 实时统计:发送总数 / 成功 / 失败
  6. 发送 / 停止
  7. 保存:把编辑后的内容 写回列表中的这条封包(更新数据、长度、socket)并刷新数据面板

发送走的是哪条通道

条件发送方式
使用套接字 > 0按封包类别调用原生 send / sendto / WSASend 等 API 直接发出
= 0 且类别为 TCP_Req / TCP_Resp经 SunnyNet 通道发往服务端 / 客户端
= 0 且类别为 UDP_* / WebSocket_*同上
= 0 且类别为 HTTP_* / HTTPS_*不支持发送(恒返回失败)
菜单项快捷键作用
编辑打开封包编辑窗口
复制Ctrl+C把选中行以十六进制文本复制到剪贴板(多选时每行一条)
添加到发送子菜单列出所有发送项,把选中封包追加进去
添加到滤镜列表用选中封包 自动生成一条滤镜,内容预填
添加到仓库存入指定仓库
设置系统套接字把该行 socket 设为全局系统套接字
查看数据修改左右对照 原始封包滤镜修改后封包
导出到Excel导出选中行(未选则全部)为 .xls
添加到文本A / 文本B送到「文本对比」页做差异比较
全选 / 取消选择Ctrl+A
// 高频组合技

抓到目标包 → 右键 添加到滤镜列表(自动填好搜索行)→ 双击滤镜改动作与修改行 → 打开开关。这是从「看到」到「改掉」最短的路径。

10 · 封包数据对比

右键 →「查看数据修改」,左右两个 Hex 视图:左边 原始封包数据 ( 长度 N ),右边 修改后封包数据 ( 长度 M )。用来确认某条滤镜到底改了哪几个字节。

11 · 本章故障排查

// 注入失败

按顺序查:① WPE 是否管理员权限;② 目标是否有反作弊 / 反注入保护(有则改用 代理模式);③ 程序目录下 WPEHook.dllEasyHook32/64.dllEasyLoad32/64.dll 是否齐全;④ 压缩包是否「解除锁定」;⑤ 看系统日志里的完整异常。

// 注入成功但抓不到包

① 信息条的 WinSock 版本是否为空;② 拦截设置对应函数是否勾选(改完要停止再开始);③ 底部「过滤 :」计数在涨说明被显示过滤挡掉了;④ 系统设置里的 极速模式 是否开着;⑤ 是否有滤镜的动作是「不修改 - 不显示」。

// 选择程序注入后目标卡死

正常现象。CreateAndInject 创建的是挂起进程,点一次 开始 才会唤醒。