WFP网络过滤驱动-限制网站访问

news2024/11/16 10:28:13

文章目录

    • 前言
    • 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的基本架构图如下:

basic architecture of the windows filtering platform diagram

整个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调用的整体结构

  1. 定义一个或多个callout,然后向过滤引擎注册callout(FwpsCalloutRegister函数)。

  2. 将这些callout,添加到过滤引擎中,其中指定callout运行所在的layer(FwpmCalloutAdd函数)。

  3. 设计一个或者多个子层,把子层添加到分层中(FwpmSubLayerAdd函数)。

  4. 设计过滤器,把呼出接口、子层、分层和过滤器关联起来,向过滤引擎添加过滤器(FwpmFilterAdd)(当流量经过layer的时候,执行相应的callout,如修改数据,最后标记为放行或者阻塞)。

建议在写代码时候,使用Transactions。比如上面是一套API,如果有一个执行失败,可以全部不生效。Transactions介绍,可参考:Object Management - Win32 apps | Microsoft Learn


代码示例

上面文字过程,可能写的很烂,难以让人明白。此时需要去看些demo代码,好理解这些概念。

  1. 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)

  2. GitHub - henrypp/simplewall: Simple tool to configure Windows Filtering Platform (WFP) which can configure network activity on your computer.。这个不推荐去看,代码有些复杂。但是可以安装运行,看看WFP的好玩之处。

  3. GitHub - junjiexing/libredirect: 使用WFP重定向socket链接。这个代码我完成看过一遍,也能跑起来。其重定向的原理是:先阻断流量;然后修改目标地址或端口;再放行流量。

  4. 阻断指定的域名访问。这是我写的代码。代码在内容上参考了第一个链接,在结构上参考了第三个链接。

复杂点的代码,不适合写成短篇文档。故,这里不介绍具体代码。下面是4中代码的运行截图。

在这里插入图片描述

我不建议写驱动的另一个原因是。win上驱动需要签名后才能安装。见:测试签名简介

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/366752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Guna UI WinForms 2.0.4.4 Crack

Guna.UI2 WinForms is the suite for creating groundbreaking desktop app UI. It is for developers targeting the .NET Windows Forms platform. 50 多个 UI 控件 具有广泛功能的综合组件可帮助您开发任何东西。 无尽的定制 只需拖放即可创建视觉效果命令和体验。 出色的…

服务端开发之Java备战秋招面试篇2-HashMap底层原理篇

现在Java应届生和实习生就业基本上必问HashMap的底层原理和扩容机制等,可以说是十分常见的面试题了,今天我们来好好整理一下这些知识,为后面的秋招做足准备,加油吧,少年。 目录 1、HashMap集合介绍 2、HashMap的存储…

S2-001漏洞分析

首发于个人博客:https://bthoughts.top/posts/S2-001漏洞分析/ 一、简介 1.1 Struts2 Struts2是流行和成熟的基于MVC设计模式的Web应用程序框架。 Struts2不只是Struts1下一个版本,它是一个完全重写的Struts架构。 1.2 S2-001 Remote code exploit o…

【保姆级】手把手捋动态代理流程(JDK+Cglib超详细源码分析)

简介动态代理,通俗点说就是:无需声明式的创建java代理类,而是在运行过程中生成"虚拟"的代理类,被ClassLoader加载。 从而避免了静态代理那样需要声明大量的代理类。上面的简介中提到了两个关键的名词:“静态…

C语言进阶(九)—— 函数指针和回调函数、预处理、动态库和静态库的使用、递归函数

1. 函数指针1.1 函数类型通过什么来区分两个不同的函数?一个函数在编译时被分配一个入口地址,这个地址就称为函数的指针,函数名代表函数的入口地址。函数三要素: 名称、参数、返回值。C语言中的函数有自己特定的类型。c语言中通过…

多元回归分析 | ELM极限学习机多输入单输出预测(Matlab完整程序)

多元回归分析 | ELM极限学习机多输入单输出预测(Matlab完整程序) 目录 多元回归分析 | ELM极限学习机多输入单输出预测(Matlab完整程序)预测结果评价指标基本介绍程序设计参考资料预测结果 评价指标 -----------ELM结果分析-------------- 均方根误差(RMSE):0.55438 测试集…

webgis高德地图

webgis高德地图 首先准备工作,注册一个高德地图账号,然后在创建一个新应用生一个key跟appId 高德开放平台 接着创建一个html页面 高德配置手册 <style>* {margin: 0;padding: 0;}#

如何维护固态继电器?

固态继电器是SSR的简称&#xff0c;是由微电子电路、分立电子器件和电力电子功率器件组成的非接触式开关。隔离装置用于实现控制端子与负载终端之间的隔离。固态继电器的输入端使用微小的控制信号直接驱动大电流负载。那么&#xff0c;如何保养固态继电器呢&#xff1f; 在为小…

Editor工具开发基础一:顶部菜单栏拓展

一.创建脚本路径 不管是那种工具 都需要在工程里创建一个Editor文件夹 来存放工具.cs文件 二.特性 MenuItem 特性 修饰静态方法 三个构造函数 public MenuItem(string itemName); public MenuItem(string itemName, bool isValidateFunction); public MenuItem(string itemN…

手工测试用例就是自动化测试脚本——使用ruby 1.9新特性进行自动化脚本的编写

昨天因为要装watir-webdriver的原因将用了快一年的ruby1.8.6升级到了1.9。由于1.9是原生支持unicode编码&#xff0c;所以我们可以使用中文进行自动化脚本的编写工作。 做了简单的封装后&#xff0c;我们可以实现如下的自动化测试代码。请注意&#xff0c;这些代码是可以正确运…

【2023考研数学二考试大纲】

文章目录I 考试科目II考试形式和试卷结构一、试卷满分及考试时间二、答题方式三、试卷内容结构四、试卷题型结构III考查内容【高等数学】一、函数、极限、连续二、一元函数微分学三、一元函数积分学四、多元函数微积分学五、常微分方程【线性代数】一、行列式二、矩阵三、向量四…

新手入门吉他推荐,第一把吉他从这十款选绝不踩雷!初学者吉他选购指南【新手必看】

一、新手购琴注意事项&#xff1a; 1、预算范围 一把合适的吉他对于初学者来说会拥有一个很好的音乐启蒙。选一款性价比高&#xff0c;做工材料、音质和手感相对较好的吉他自然不会是一件吃亏的事。**初学者第一把琴的预算&#xff0c;我觉得最低标准也是要在500元起&#xf…

数字IC设计需要学什么?

看到不少同学在网上提问数字IC设计如何入门&#xff0c;在学习过程中面临着各种各样的问题&#xff0c;比如书本知识艰涩难懂&#xff0c;有知识问题难解决&#xff0c;网络资源少&#xff0c;质量参差不齐。那么数字IC设计到底需要学什么呢&#xff1f; 首先来看看数字IC设计…

我们来说说蹿红的AIGC到底是什么?ChatGPT又是什么?

近期&#xff0c;人工智能&#xff08;AI&#xff09;领域动作频频&#xff0c;OPENAI公司Chat GPT的出现&#xff0c;标志着人工智能的研究与应用已经进入了一个崭新的发展阶段&#xff0c;国内腾讯、阿里巴巴、百度、易网、国外微软、谷歌、苹果、IBM、Amazon&#xff0c;等互…

YOLOv5的训练调优技巧

本文编译自英文原文https://github.com/ultralytics/yolov5/wiki/Tips-for-Best-Training-Results&#xff0c;文章解释了如何提高Yolov5的mAP和训练效果。大多数时间&#xff0c;在没有改变模型或是训练配置的情况下&#xff0c;如果能够提供足够多的数据集以及好的标注&#…

理解随机游走

随机游走 基本思想 从一个或一系列顶点开始遍历一张图。在任意一个顶点&#xff0c;遍历者将以概率1-a游走到这个顶点的邻居顶点&#xff0c;以概率a随机跳跃到图中的任何一个顶点&#xff0c;称a为跳转发生概率&#xff0c;每次游走后得出一个概率分布&#xff0c;该概率分布…

【前端】CSS3弹性布局、媒体查询实现响应式布局和自适应布局

文章目录弹性布局基本概念容器&#xff08;container&#xff09;的属性容器成员&#xff08;item&#xff09;的属性媒体查询响应式布局自适应布局参考弹性布局 基本概念 任何一个容器都可以指定为 Flex 布局。 display:flex;行内元素也可以&#xff1a; display:inline-f…

Apollo规划模块代码学习(2): 轨迹规划流程理论基础详解(lane follow场景为例)

文章目录1、轨迹规划基础2、Frenet坐标系3、路径规划和速度规划4、轨迹优化&#xff08;QP过程&#xff09;5、规划流程(lane follow场景为例)1、规划模块流程2、Apollo中各场景3、Lane_follow场景中task本文以具体场景Lane follow为例梳理具体的轨迹规划算法流程。详细介绍轨迹…

关于selenium的等待

目录 隐式等待 显式等待 注意事项 隐式等待 简单来说&#xff1a;在规定的时间范围内&#xff0c;轮询等待元素出现之后就立即结束。 如果在规定的时间范围内&#xff0c;元素仍然没有出现&#xff0c;则会抛出一个异常【NoSuchElementException】&#xff0c;脚本停止运行…

【Linux学习笔记】2.Linux 系统启动过程及系统目录结构

前言 本章介绍Linux的系统启动过程和系统目录结构。 Linux 系统启动过程 linux启动时我们会看到许多启动信息。 Linux系统的启动过程并不是大家想象中的那么复杂&#xff0c;其过程可以分为5个阶段&#xff1a; 内核的引导。运行 init。系统初始化。建立终端 。用户登录系…