文章目录
- 前言
- WFP入门介绍
- WFP基本架构
- 名词解释
- 代码基本结构
- 代码示例
前言
WFP Architecture - Win32 apps | Microsoft Learn是一个网络流量处理平台。WFP 由一组连接到网络堆栈的钩子和一个协调网络堆栈交互的过滤引擎组成。
本文使用WFP,实现了一个网络阻断的demo,以阻断访问指定站点的流量。代码比较复杂,本文不进行介绍。本文仅是一个WFP入门介绍
PS:如果不是内核驱动程序员,不建议使用WFP进行网络过滤开发,上手成本挺高。(我头铁。。)
WFP入门介绍
相关阅读:
-
《windows内核安全与驱动开发》第15章 Windows过滤平台 (推荐,看完基本入门)
-
windows驱动-WFP框架介绍及其编程 | qwertwwwe
-
WFP Architecture - Win32 apps | Microsoft Learn (不推荐)
我没搞清这个架构具体是怎么回事,因为参考资料很少。因为我看不懂官方的文档,所以官方的文档很烂。但这不妨碍写代码,多找几个示例代码看看,照葫芦画瓢即可。
WFP基本架构
WFP的基本架构图如下:
整个WFP分为两部分:用户态和内核态。
挂载在内核钩子上的函数,必须通过驱动加载入内核。但是何时将这些函数挂载到钩子上,可以直接在驱动中实现,也可以在用户态控制。(目前可能看不懂这句话,不着急。实际写代码的时候,会区分出他们的优缺点。)(总的来说,本质都是这样:实现自定义的函数->将函数加载的内核hook上->数据流经过的时候,执行该函数)
名词解释
首先,需要进行的是”名词解释“。框架为了描述方便,会自定义一些名词。这些名词以特定的方式组合起来,便是整个框架。这些名词的官方链接是:Object Model - Win32 apps | Microsoft Learn
-
过滤器(Filter):当满足一组条件的时候,执行指定的动作。多个滤器之间,有位置和权重之分。过滤器也为钩子函数,提供上下文环境。(如果我们有知道nftables,会很容易理解这套流程:iptables和nftables的使用_大1234草的博客-CSDN博客_nftables和iptables)
-
Callout:是一组函数。数据流经过时,过滤器调用callout,执行callout中自定义的操作,然后标记放行还是阻断。callout有自己的ID。这样无论在内核还是用户空间,都可以通过ID挂载特定的callout。
-
Layer:表示网络流量处理中调用过滤器引擎的特定点。(不同的Layer,有不同的标识。比如我们想在TCP三次握手的某个过程中,进行网络阻断。我们可以将相应的callout放到对应的Layer中:TCP Packet Flows - Win32 apps | Microsoft Learn)
-
Sub-layer:layer的子组件。一个layer中可以创建不同的sub-layer,有权重之分(执行先后之分。比如我们权重高的sub-layer中,调用callout将也给数据流标记为阻塞,并设置为禁止修改。相同层的后面子层中的callou检查无修改权限后,直接return)。
-
Provider:略(代码中没用过,不知道)
-
Provider Context:略(代码中没用过,不知道)
代码基本结构
上面每个名词都有对应的数据结构,每个数据结构都有一组对应的操作函数。
接下来,需要将这些名词组合起来。下面是WFP API调用的整体结构:
-
定义一个或多个callout,然后向过滤引擎注册callout(FwpsCalloutRegister函数)。
-
将这些callout,添加到过滤引擎中,其中指定callout运行所在的layer(FwpmCalloutAdd函数)。
-
设计一个或者多个子层,把子层添加到分层中(FwpmSubLayerAdd函数)。
-
设计过滤器,把呼出接口、子层、分层和过滤器关联起来,向过滤引擎添加过滤器(FwpmFilterAdd)(当流量经过layer的时候,执行相应的callout,如修改数据,最后标记为放行或者阻塞)。
建议在写代码时候,使用Transactions。比如上面是一套API,如果有一个执行失败,可以全部不生效。Transactions介绍,可参考:Object Management - Win32 apps | Microsoft Learn
代码示例
上面文字过程,可能写的很烂,难以让人明白。此时需要去看些demo代码,好理解这些概念。
-
Windows-kernel-security-and-driver-development-CD/source/WfpSample at master · dybb8999/Windows-kernel-security-and-driver-development-CD · GitHub。这个是书上的对应代码,比较容易理解。(我自己也敲过一边,但是运行会导致系统退出,我没找到bug位置,不会win的驱动调试。。见:demo/16-wfp-demo at laboratory · da1234cao/demo · GitHub)
-
GitHub - henrypp/simplewall: Simple tool to configure Windows Filtering Platform (WFP) which can configure network activity on your computer.。这个不推荐去看,代码有些复杂。但是可以安装运行,看看WFP的好玩之处。
-
GitHub - junjiexing/libredirect: 使用WFP重定向socket链接。这个代码我完成看过一遍,也能跑起来。其重定向的原理是:先阻断流量;然后修改目标地址或端口;再放行流量。
-
阻断指定的域名访问。这是我写的代码。代码在内容上参考了第一个链接,在结构上参考了第三个链接。
复杂点的代码,不适合写成短篇文档。故,这里不介绍具体代码。下面是4中代码的运行截图。
我不建议写驱动的另一个原因是。win上驱动需要签名后才能安装。见:测试签名简介