WINDOWS简单防火墙的设计与实现—计算机毕业设计.doc_第1页
WINDOWS简单防火墙的设计与实现—计算机毕业设计.doc_第2页
WINDOWS简单防火墙的设计与实现—计算机毕业设计.doc_第3页
WINDOWS简单防火墙的设计与实现—计算机毕业设计.doc_第4页
WINDOWS简单防火墙的设计与实现—计算机毕业设计.doc_第5页
免费预览已结束,剩余24页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

毕毕 业业 设设 计计( 论论 文文) Windows 简单防火墙的设计与实现简单防火墙的设计与实现 论文作者姓名:论文作者姓名: 申请学位专业:申请学位专业: 申请学位类别:申请学位类别: 指指导导教教师师姓姓名名(职职称称) : 论文提交日期:论文提交日期: Windows 简单防火墙的设计与实现简单防火墙的设计与实现 摘摘 要要 随着互连网的高速发展,网络给我们带来了极大的方便。人们的学习、工作以及生活 越来越依赖于计算机网络,随之也出现了许多网络安全问题,因此当前网络安全产品备受 人们的重视。防火墙是保障系统安全的一种有效手段,它可以将个人电脑与不完全的网络 隔离开,按照预先设定的规则决定是否允许数据包通过,以此保障了个人电脑的安全。 本毕业设计是基于 Windows 2000 操作系统、DDK for Windows2000 工具开发包及 Visual C+6.0 平台开发的简单防火墙系统。系统主要分为两个模块:过滤钩子驱动模块 和用户操作界面模块。过滤钩子驱动模块主要功能是注册过滤钩子回调函数,并按照用户 提供的过滤规则进行数据包的过滤;用户操作界面模块的主要功能是实现用户添加、删除 过滤规则,同时允许用户以文件的形式保存所添加的过滤规则。 关键词关键词:防火墙;包过滤;钩子;回调函数 The Design and Realization of Simple Firewall for Windows Abstract With the rapid development of Internet, it brings us great convenience. We become more and more dependent on the Internet, but it brought a lot of questions of network security, thereby the products of network security attract much attention. Firewall is an effective means to secure the system. It can separate personal computer from unsafe network, according to the preset rules to decide whether to let the packet through. It guarantees the safety of personal computer. This paper is based on Windows 2000, DDK for Windows 2000 and Visual C+6.0 platform to develop simple firewall system. There are two parts in the system, which are hook filter driver module and the module of user interface. The main function of hook filter driver module is to register hook callback function and filter packet according to rules. The main function of user interface module is to add or delete filter rules, and save filter rules as file. Key words: firewall; packet-filtering; hook; callback function 目目 录录 论文总页数:20 页 1引言 .1 1.1课题背景 .1 1.2国内外研究现状 .1 1.3本课题研究的意义 .1 1.4本课题的研究方法 .2 2相关理论技术基础 .2 2.1防火墙技术简介 .2 2.1.1 防火墙简介 .2 2.1.2 防火墙分类 .2 2.1.3 防火墙的局限性 .3 2.2VISUAL C+6.0 相关技术简介 .3 3总体设计方案 .4 3.1设计过程 .4 3.2设计方案 .4 4过滤钩子驱动的实现 .5 4.1FILTER_HOOK DRIVER概述.5 4.2过滤钩子驱动的实现 .6 4.2.1 创建内核模式驱动 .6 4.2.2 设置和清除过滤钩子 .8 4.2.3 过滤器钩子的 I/O 控制 .10 4.2.4 过滤函数实现 .11 5客户端应用程序 .12 5.1界面设计 .12 5.2编码规则 .14 5.3主要的类 .14 5.4核心代码 .14 5.4.1 开始过滤和停止过滤 .15 5.4.2 安装和卸载过滤条件 .16 5.4.3 文件存储 .17 结 论.18 参考文献.18 致 谢.19 声 明.20 第 1 页 共 20 页 1 引言引言 1.11.1 课题背景课题背景 Internet 的出现及迅速发展给现代人们的生产和生活都带来了前所未有的飞跃。互连网 已经成为扩展个人和企业发展的重要工具,人们已经进入了信息时代。互连网将整个人类 社会缩小成了一个村落“地球村” ,促进了信息的交流,提高了人们的工作效率,丰富 了人们的生活。人们享受着信息时代带来的种种便利,体验着互联网带来的生活上的全新 感受。但凡事有利必有一弊,随着对网络的依赖越来越大,网络安全问题也越来越明显。 由于黑客攻击和信息泄露并不是直接对系统造成损害,所以往往不能引起人们的注意。人 们总是在网络安全问题发生带来严重后果后,才意识到网络安全的重要。随着网络的进一 步普及,网络安全产品逐渐地进入人们的视野,而防火墙作为把守用户安全大门的重要工 具,越来越受到人们的重视。 1.21.2 国内外研究现状国内外研究现状 自从 1986 年美国 Digital 公司在 Internet 上安装了全球第一个商用防火墙系统,提出了 防火墙概念后,防火墙技术得到了飞速的发展。国内外已有数家公司推出了功能各不相同 的防火墙产品系列。目前的防火墙产品主要有堡垒主机、包过滤路由器、应用层网关(代理 服务器)以及电路层网关、屏蔽主机防火墙、双宿主机等类型。作为内部网络与外部公共网 络之间的第一道屏障,防火墙是最先受到人们重视的网络安全产品之一。虽然从理论上看,防 火墙处于网络安全的最底层,负责网络间的安全认证与传输,但随着网络安全技术的整体发展 和网络应用的不断变化,现代防火墙技术已经逐步走向网络层之外的其他安全层次,不仅要完 成传统防火墙的过滤任务,同时还能为各种网络应用提供相应的安全服务。另外还有多种防 火墙产品正朝着数据安全与用户认证、防止病毒与黑客侵入等方向发展。 虽然防火墙是目前保护网络免遭黑客袭击的有效手段,但也有明显不足:无法防范通 过防火墙以外的其它途径的攻击,不能防止来自内部变节者和不经心的用户们带来的威胁, 也不能完全防止传送已感染病毒的软件或文件,以及无法防范数据驱动型的攻击。 1.31.3 本课题研究的意义本课题研究的意义 目前市场上大多数的防火墙产品仅仅是网关型的,虽然它们的功能相当强大,但由于 它们基于下述的假设:内部网是安全可靠的,所有的威胁都来自网外。因此,他们防外不 防内,难以实现对企业内部局域网内主机之间的安全通信,也不能很好的解决每一个拨号 用户所在主机的安全问题,而大多数个人上网之时,并没有置身于得到防护的安全网络内 部。 个人上网用户多使用 Windows 操作系统,而 Windows 操作系统本身的安全性就不高。 各种 Windows 漏洞不断被公布,对主机的攻击也越来越多。一般都是利用操作系统设计的 安全漏洞和通信协议的安全漏洞来实现攻击。如假冒 IP 包对通信双方进行欺骗;对主机大 量发送 IP 数据包进行轰炸攻击,使之崩溃;以及蓝屏攻击等。因此,为了保护主机的安全 第 2 页 共 20 页 通信,研究有效的个人防火墙技术很有必要。 1.41.4 本课题的研究方法本课题的研究方法 本设计是使用 Win2000 DDK 中提供的 Filter-Hook Driver 来实现数据包的过滤。过滤 钩子驱动程序是一个用于过滤网络包的核心模式驱动程序,它扩展了系统提供的 IP 过滤驱 动程序的功能。 过滤钩子驱动程序完成一个过滤钩子回调函数并在系统提供的 IP 过滤驱动程序中注册 这个回调函数。这个回调函数被看作一个过滤钩子。当有数据包需要通过时,IP 过滤驱动 程序会调用这个过滤钩子以决定怎样处理到达和输出的包。 2相关理论技术基础相关理论技术基础 2.12.1 防火墙技术简介防火墙技术简介 .1 防火墙简介防火墙简介 Internet的发展给政府,企事业单位带来了革命性的改革和开放,也给个人的工作和生 活带了前所未有的改变。人们享受着互连网带来的种种方便,同时也面临着Internet的开放 带来的关于数据安全的新挑战和新危险:企事业单位商业机密的泄露,个人隐私以及私秘 信息的窃取。这就需要人们给网络加一道安全之门,而这道门的重要守护者就是防火墙。 防火墙是指设置在不同网络或者网络安全域之间的一系列部件的组合。它是不同网络 或者网络安全域之间的唯一出口,所有进出这出口的访问都得经过它的审核。用户可以根 据自己的情况来设置访问规则实现对所有访问的控制,用来达到对安全的保证。 在逻辑上,防火墙是一个分离器,一个限制器,也是一个分析器。它有效地监控了内 部网络与外部网络之间的所有活动,其基本目的是阻止未被邀请的客户进入内部网络,保 证了内部网络的安全。 .2 防火墙分类防火墙分类 根据对限制传输机制的不同,把防火墙大致分成以下三种:封包过滤、代理服务器和 应用程序网关: 1.包过滤防火墙截获网络上的所有传输信息,这些信息都是以包的形式进行传输的, 数据包中包含发送方的 IP 地址,接收方的 IP 地址,端口,链路状态等信息。防火墙的工 作就是把这些信息读取出来,再根据用户自定义的规则来进行过滤。那些不符合规则的数 据包将被过滤掉,以保证网络的安全。 2.代理服务器接收客户请求后会检查验证其合法性,如果合法,代理服务器向一台客 户机取回所需的信息在转发给客户。它将内部系统与外界隔离开来,从外面只能看到代理 服务器而看不到任何内部资源。代理服务器只允许有代理的服务通过,而其他所有服务都 完全被封锁住。这一点对系统安全是非常重要的,只有那些被认为“可信赖的”服务才允许 通过防火墙。另外代理服务还可以过滤协议,如可以过滤 FTP 连接,拒绝使用 FTP put(放置)命令,以保证用户不能将文件写到匿名服务器。代理服务器具有信息隐藏,保 第 3 页 共 20 页 证有效的认证和登陆,简化了过滤规则等优点。网络地址转换服务可以屏蔽内部网络的 IP 地址,使网络结构对外部来讲是不可见的。 3.应用程序网关本质上是另一种类型的代理服务器。通信时,内部客户首先和应用程 序网关建立连接,应用程序网关确定这个连接是否被允许,如果允许的话再和目的计算机 建立连接。因此,所有的通讯都需要经过两个连接客户到网关的连接和网关到目的主 机的连接。应用程序网关会监视所有的传输,根据规则决定是否转发他们。和代理服务器 一样,外面的世界看到的只是应用网关的 IP 地址,这就有效地保护了内部网络。 .3 防火墙的局限性防火墙的局限性 虽然防火墙按照我们的要求严格地把守着网络安全的大门,但它也不是万能的,也存 在着一些局限性。比如它不能防范不经过它的攻击,也就是可以寻找一条小路绕开防火墙 把守的大门。例如,如果允许从受保护的网络内部向外拨号,一些用户就可能形成与 Internet的直接连接。另外,防火墙很难防范来自于网络内部的攻击以及病毒的威胁。它更 不可能防止靠欺骗来获得某些可以破坏安全的信息的社会工程的攻击。 2.22.2 Visual C+6.0 相关技术简介相关技术简介 Visual C+ 6.0 是 Microsoft 公司推出的功能强大的软件开发平台,是真正的程序员 首选的开发工具之一。Visual C+不仅仅是一个编译器,它是一个全面的应用程序开发环 境,使用它你可以充分利用具有面向对象特性的 C+来开发出专业级的 Windows 应用程序。 它是一个 C+实现,提供了一个功能强大的集成开发环境;另一方面,它提供了一些 C+ 类库,其中最具影响力的是 MFC。此外,Visual C+还融合了大量的开发工具,特别是与 Internet 相关的开发支持。Visual C+ 6.0 以 ANSIC+为基础,并在此基础上进行了大量的 扩展,以适应开发各种 Windows 应用程序的需要。到目前为止,绝大多数 Windows 应用 程序都是用 Visual C+ 6.0 或其早期版本开发而成的,Visual C+ 6.0 已成为在 Windows 环 境下进行大型软件开发的首选。 MFC 是一个很大的、扩展了的 C+类层次结构,它能使开发 Windows 应用程序变得 更加容易。MFC 在整个 Windows 家族中都是兼容的,也就是说,无论是 Windows3.x、Windows95 还是 Windows NT,所使用的 MFC 是兼容的。每当新的 Windows 版本出现时,MFC 也会得到修改以便使旧的编译器和代码能在新的系统中工作。MFC 也 会得到扩展,添加新的特性,变得更加容易建立应用程序。 与传统上使用 C 语言直接访问 Windows API 相反,使用 MFC 和 C+的优点是 MFC 已经包含和压缩了所有标准的“样板文件”代码,这些代码是所有用 C 编写的 Windows 程 序所必需的。因此用 MFC 编写的程序要比用 C 语言编写的程序小得多。另外,MFC 所编 写的程序的性能也毫无损失。必要时,可以直接调用标准 C 函数,因为 MFC 不修改也不 隐藏 Windows 程序的基本结构。 使用 MFC 的最大优点是它为你做了所有最难做的事。MFC 中包含了上成千上万行正 第 4 页 共 20 页 确、优化和功能强大的 Windows 代码。你所调用的很多成员函数完成了你自己可能很难完 成的工作。从这点上讲,MFC 极大地加快了程序开发速度。 3总体设计方案总体设计方案 3.13.1 设计过程设计过程 防火墙是对所截取的数据包按用户定义的规则进行过滤的,所以要开发设计一个防火 墙,第一步要实现对数据包的截取。如果数据包的拦截没有实现,那么分析、过滤等就是 空谈。截获数据包有很多种方法,首先想到了 Winpcap(Windows Packet Capture),它是 Windows 平台下的一个免费、公共的网络访问系统。但后来发现其主要功能在于独立于主 机协议(如 TCP/IP)而发送和接收原始数据。也就是是说,Winpcap 不能阻塞、过滤或控 制其他应用程序数据包的收发,它仅仅是监听共享网络上传送的数据报。因此,把它用于 开发个人防火墙将会比较困难。 虽然用户态下实现数据包捕获比较容易,但其拦截数据包有一些局限性,一个最大的 缺点就是只能在 Winsock 层次上进行,而对于网络协议栈中底层协议的数据包无法进行处 理。而利用驱动程序来拦截数据包,虽然功能很强大,但实现起来比较困难。做折中比较 后,在用驱动程序拦截数据包的方法中选择了一个最简单的方法:使用 Win2000 DDK 中 提供的 Filter-Hook Driver 来实现数据包的过滤。 3.23.2 设计方案设计方案 本设计分成两大模块:数据过滤钩子驱动模块和用户操作界面程序模块。 IP 过滤驱动程序 网络适配器驱动程序 网络适配器 用户界面程序 过滤钩子驱动程序 图 1.系统总体设计 1.数据过滤钩子驱动模块 利用在 Microsoft Windows 2000 DDK 中介绍的 Filter-Hook Drive 来实现对所有进出接 口的数据进行过滤。主要有以下五个步骤: 建立内核模式驱动 Filter-Hook Drive; 取得指向 IP Filter Driver 的指针; 第 5 页 共 20 页 利用步骤 2 得到的指针,发送特殊的 IRP 来安装过滤函数; 过滤数据; 结束过滤,撤消过滤函数。 2.用户操作界面程序模块 该模块主要就是用户所看到的程序界面,是用户和防火墙进行对话的对象。它负责管 理用户定义的过滤规则,与数据过滤钩子驱动模块进行通信。主要利用过滤钩子驱动模块 应用输出接口提供的四个 IOCTL 来实现相应功能:START_IP_HOOK(注册过滤函数); STOP_IP_HOOK(撤消过滤函数);ADD_FILTER(安装新的过滤规则) CLEAR_FILTER(清除所有规则) 4过滤钩子驱动的实现过滤钩子驱动的实现 4.14.1 Filter_Hook Driver 概述概述 在 Windows2000 DDK 中,Microsoft 声称包括了新的网络驱动类型 Filter-Hook Driver。其实 Filter-Hook Drive 并不是一种新的网络驱动类型,它仅仅是 IP Filter Driver(包括 Windows2000 和以后版本)在功能上的扩展。它是一种 KMD(Kernel Mode Driver 内核模式驱动),与 IpFilterDrive 相配合。就也就决定了它只能用于 TCP/IP 协议,而 对 IPX/SPX、NetBEUI 等其他协议无能为力。 从 Windows 2000 开始,IpFilterDrive 成为系统自带的一个驱动。顾名思义就是 IP 过滤 驱动,对应系统目录下 ipfltdrv.sys 文件。它允许用户注册自己的 ip 数据报处理函数。在 MSDN 中有关于这方面内容的简短说明,位于 filter-hook driver reference 章节中。这一部分 说明文档论述了 filter-hook 驱程实现的回调函数和该驱程用以注册回调函数的 i/o 控制码。 回调函数是这类驱程的主体部分。操作系统提供的 ip 过滤驱动程序使用这个过滤钩子来判 断 ip 数据包的处理方式。 所注册的过滤钩子是用 PacketFilterExtensionPtr 数据类型定义的。由于是使用函数的地 址而不是函数的名字注册过滤钩子的入口点,所以可以自由的为过滤钩子函数命名。 在图 2 中说明了过滤钩子驱动程序的流程结构,这就给我们提供了拦截网络数据包的 基本思路。内核中的过滤器钩子驱动将本机进出的所有封包都传入到我们的虚拟设备中, 按照我们提供的过滤规则进行处理。 第 6 页 共 20 页 TDI IP 层 NDIS DrvFltIp.sys 过滤钩子 图 2 .过滤器钩子驱动程序流程示意图 4.24.2 过滤钩子驱动的实现过滤钩子驱动的实现 4.2.1 创建内核模式驱动创建内核模式驱动 首先过滤器钩子驱动程序设置过滤器钩子回调函数,它是这类驱动程序的主体,通过 系统提供的 IP 过滤器驱动注册这些过滤器钩子回调函数,随后,IP 过滤器驱动就可以使 用过滤器钩子决定如何处理传入或传出的数据包所注册的过滤钩子是用 PacketFilterExtensionPtr 数据类型定义的。以下是该数据类型原型: tyfedef PF_FORWARD_ACTION (*PacketFilterExtensionPtr)( IN unsigned char *PacketHeader, /封包的 IP 头指针 IN unsigned char *Packet, /具体封包数据,不包括头指针 IN unsigned int PacketLength, /具体封包数据大小,不包含头指针 IN ubsigned int RecvInterfaceTndex, /接收数据的接口适配器编号 IN unsigned int SendInterfaceIndex , /发送数据的接口适配器编号 IN IPAddr RecvLinkNextHop, /接收数据包的适配器 IP 地址 IN IPAddr SendLinkNextHop /发送数据包的适配器 IP 地址 ); PacketHearder 参数指向的数据通常定义为 IPHearder 结构,它提供了封包的详细信息。 Typedef struct IPHearder UCHAR iphverLen; /版本号和头长度 UCHAR ipTOS; /服务类型 USHORT ipLength; /封包总长度,即整个 IP 报的长度 USHORT ipID; /封包标适,唯一标识发送的每一个数据报 USHORY ipFlags; /标志 UCHAR ipTTL; /生存时间 UCHAR ipProtocol; /协议,其中 TCP(6) 、UDP(17) 、ICMP(1) USHORT ipChecksum; /效验和 第 7 页 共 20 页 ULONG ipSoruce; /源 IP 地址 ULONG ipDestination; /目的 IP 地址 IPPacket; Packet 参数指向去掉 IP 头之后的数据报,开头是一个 TCP 头、UDP 头、ICMP 头, 这都需要根据 IP 头的 ipProtocol 域确定。 TCP 头: typedef stuct_TCPHeader USHORT sourcePort; /源端口 USHORT destinationPort; /目的端口 ULONG sequenceNumber; /seq 序号 ULONG acknowledgeeNumber; /ack 序号 UCHAR dataoffset; /数据指针 UCHAR flags; /标志 USHORT windows; /窗口大小 USHORT checksum; /校验和 USHORT urgenPointer; /紧急指针 TCPHeader; UDP 头: Typedef stuct_UDPHeader USHORT sourcePort; /源端口号 USHORT destinationPort; /目的端口号 USHORT len; /封包长度 USHORT checksum; /校验和 UDPHearder; 在过滤器钩子驱动通过系统提供的 IP 过滤器驱动注册其过滤钩子(filter hook )的入 口点时,已给出了过滤器钩子的符号(可变)地址。由于过滤器驱动程序不是提供过滤器 钩子入口点的名称,所以开发人员可以自由选择过滤器钩子名称。不过,一般情况下要根 据过滤器钩子函数的基本功能来命名。 过滤器钩子对传入和传出的数据包做一些特殊处理动作。首先是把数据包的特定信息 和 IP 过滤器驱动提供给过滤器钩子的信息加以比较,以此决定数据包下一步如何被处理。 其次,在过滤器钩子检测完数据包后,回复响应代码 PF_FORWARD,PF_DROP 或 PF_PASS 给 IP 过滤器驱动,通知 IP 过滤器驱动如何处理数据包。这 3 种回复响应代码所 第 8 页 共 20 页 代表的含义描述如下: PF_FORWARD 表示 IP 过滤器驱动程序立即把数据包转发到 IP 协议栈中,如果该 数据包是本机需要的数据包,IP 协议将其转发给上层协议处理,否则,路由功能被打开, IP 将路由该数据包 PF DROP 表示 IP 过滤驱动程序将立刻向 IP 协议栈发出丢弃响应,IP 协议将丢弃该 数据包。 PF PASS 表小 IP 过滤驱动程序处理该数据包,并将结果动作回复给 IP 协议栈IP 过滤器驱动如何过滤数据包由它本身和包过滤 API 接口的设置方式来决定;如果过滤器钩 子认为自己不需要处理该数据包,而是让 IP 过滤器驱动过滤包,则应该返回该 PF_PASS。 4.2.2 设置和清除过滤钩子设置和清除过滤钩子 在 DriverEntry 函数中定义了驱动初始化和卸载的部分。过滤器钩子驱动程序设置了过 滤器钩子回调函数,并通知 IP 过滤器驱动为每个传入或者传出的 IP 数据包调用这个钩子 回调函数。过滤器钩子有可能清除先前注册的钩子回调。为了记录和清除钩子回调函数, 过滤器钩子驱动必须首先用设备对象的指针为 IP 过滤器驱动和 IOCTL_PF_SET_EXTENSION_POINTER 创建一个 IRP,然后,过滤器钩子驱动把这个 IRP 提交给 IP 过滤器驱动,过滤器钩子驱动设置或清除钩子回归函数的过程描述是:为了获得 IP 过滤器驱动的设备对象指针,过滤器钩子驱动需要调用函数 IoGetDeviceObjectPointer。 在这次调用中,过滤器钩子驱动传递了指向缓冲区(含有 IP 过滤器驱动的名字字符串)的 指针、数值(表示可以同时对提供的 IP 过滤器驱动进行读、写访问)以及容纳返回的文件 和设备对象缓冲区的指针。 NTSTATUS IoGetDrivceObjectPointer( IN PUNICODE_STRING ObjectName; /指定设备对象名称 IN ACCESS_MASK DesireAccess; /指定这个对象要求访问的权限 OUT PFILE_OBJECT *FileObject; /返回相应文件对象指针 OUT PDEVICE_OBJECT *DeviceObject/返回相应设备对象指针 ); 调用此函数时,为 ObjectName 参数传递 IP 过滤驱动名称 “DeviceIPFILTERDRIVER”,为 DesireAccess 参数传递 FILE_ALL_ACCESS 过滤器钩子驱动程序使用 PF_SET_EXTENSION_POINTER 控制码建立一个 IRP,并 将其提交给 IP 过滤钩子驱动程序,通常 filter-hook 驱动程序调用 IoBuildDeviceIoControlRequest 函数建立所需 IRP,该控制码向 IP 过滤器驱动程序注册过滤 钩子回调函数。 PIRP IoBuildDeviceIoControlRequest( 第 9 页 共 20 页 IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer OPTIONAL, IN ULONG InputBuffer Length, OUT PVOID OutputBuffer OPTIONAL, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN PKEVENT Event, OUT PIO_STATUS_BLOCJ IoStatusBlock ); 在这次调用中,过滤器钩子驱动传递了指定 IOCTL_PF_SET_EXTENSION_POINTER 值的参数、设备对象指针以及包含 PF_SET_EXTENSION_HOOK_INFO 结构的 缓冲区。 为了设置过滤器钩子,这个结构包含有设置过滤器钩子回调函数地址的信息。该控制码也 用来从 IP 过滤驱动程序中清除回调函数,为了清除过滤器钩子,这个结构包括了空 (NULL)值。借助 I/O 堆栈位置(根据已提供的参数设置) ,这次调用过程给 IRP 返回指 针。当有数据包发送或接收时,IP 过滤驱动程序就要调用这些回调函数。 为了把 IRP 提交给 IP 过滤器驱动,过滤钩子驱动调用 LoCallDriver 函数。在这次调用 中,过滤器钩子驱动传递了一个指向 IP 过滤驱动设备对象的指针,也就是先前已经创建的 IRP 指针。 过滤器驱动清除它的过滤钩子,是通过先前注册过滤钩子的口来实现的,因此过滤钩 子驱动应该保存指向 IP 过滤器驱动的文件和设备对象的指针,也就是说,只有在过滤器钩 子驱动从 IP 过滤器驱动清除它的过滤器钩子以后,过滤器钩子驱动程序才能调用 ObDereferenceObject 函数减小 IP 过滤器驱动的文件和设备对象的指针引用计数。 PF_SET_EXTENSION_HOOK_INFO 结构的定义如下,其包含回调函数的指针: Typedef struct_PF_SET_EXTENSION_HOOK_INFO PacketFilterExtensionPtr ExtensionPointer; PF_SET_EXTENSION_HOOK_INFO,*PPF_SET_EXTENSION_HOOK_INFO; 成员 ExtensionPointer 是指向 hook 回调函数的指针.通过该结构完成向 IP 过滤驱动程序 注册 hook 函数.如果 ExtensionPointer 为 NULL,则从 IP 过滤驱动程序中清除回调函数。 4.2.3 过滤过滤器钩子的器钩子的 I/O 控制控制 当应用程序或者上层驱动程序通过向过滤器钩子驱动程序发送 I/O 控制请求建立过滤 器钩子时,驱动程序自动会响应函数代码为 IRP_MJ_DEVICE_CONTROL 的 Dispatch 例程。 这个 Dispatch 例程处理发来的 I/O 控制请求,在 DriverEntry 入口函数中为这个 Dispatch 例 第 10 页 共 20 页 程设置和输出入口点。 驱动开发人员需要定义和公布所有的 I/O 控制请求信息和过滤器钩子运行时所处理的 类型,应用程序和上层驱动程序就能够用已经公布的 I/O 控制请求建立过滤器钩子。 为了获得 I/O 控制请求,过滤器钩子驱动程序的设备控制例程必须调用 IoGetCurrentIrpStackIocation 函数,在调用中,设备控制例程把一个 IRP 指针传递给 IoGetCurrentIrpStackIocation 函数,然后设备控制例程决定哪一个 I/O 控制请求已经收到并 且做相应的处理。 一旦当前的 I/O 控制请求完成后,设备控制例程调用 IoCompleteRequest 函数并且传递 其操作状态,这个状态已经返回给先前发送请求的应用程序或高层驱动程序。下面是典型 过滤器钩子驱动的备控制例程处理两种 I/O 控制请求: Set-Hook IOCTL 表示注册一个过滤器钩子; Clear-Hook IOCTL 示清除以前注册的过滤器钩子。 4.2.4 过滤过滤函数实现函数实现 过滤列表是将多个过滤规则连在一起的链表,在这定义一个 CFilterList 结构来描述, 在结构中给每个过滤规则添加了指向下一个规则的 pNext 指针,这样就把多个过滤规则连 在一起形成过滤列表,我们只需要记录首地址就可以管理所有过滤规则。在钩子回调函数 中,当有数据包需要通过时得遍历这个列表。 Stuct CFilterList CIPFILTER ipf; /过滤规则 CFilterList *pNext; /指向下一个的指针 Struct CFliterList* g_pHeader=NULL; /定义列表首地址 向过滤列表中添加规则时,首先申请一块 CFilterList 结构大小的内存,然后用正确的 参数来填充这块内存,最后连接到过滤列表中。具体功能实现由自定义函数 AddFilterToList 来实现。由于是链表结构存储,所以清除过滤列表时,只需要遍历 g_pHeader 指向的链表,依次释放添加规则时申请的内存即可。清除过滤规则列表由自定 义函数 ClearFilterList 来实现。具体的过滤函数实际上就是过滤钩子回调函数,当有数据包 的发送或者接收时钩子回调函数将会被调用。系统将根据对比过滤规则链表里的规则来决 定如何处理封包。过滤函数实现大致流程如下: 第 11 页 共 20 页 图 3.过滤函数流程 5客户端应用程序客户端应用程序 用户程序的核心实现就是使用 CDriver 类向驱动程序发送几个设备控制代码 (START_IP_HOOK(安装过滤钩子)、STOP_IP_HOOK(清除过滤钩子) 、 ADD_FILTER(安装过滤规则) 、CLEAR_FILTER(卸载过滤规则)) 。程序在初始化时加载 过滤钩子驱动,当用户单击开始按钮时向驱动发送 START_IP_HOOK 安装过滤钩子,单击 停止按钮时发送 STOP_IP_HOOK 控制代码清除过滤钩子。用户单击添加过滤规则弹出添 加规则对话框,为用户提供添加过滤规则的输入界面,单击删除时则实现删除用户选定的 过滤规则;当用户单击安装规则和卸载规则时,则分别发送控制代码 ADD_FILTER 和 是否符合 UDP 规则是否符合 ICMP 规 则 处理 ICMP 规则 取下一条规则 Y 是否符合 IP 规则 拷贝 packet 的内容到共享内存区 处理 IP 规则 取下一条规则 Y N N 是否符合 TCP 规 则 处理 TCP 规则 取下一条规则 处理 UDP 规则 取下一条规则 Y Y N N 结束 开始 第 12 页 共 20 页 CLEAR_FILTER 来实现过滤规则的加载或者卸载。 5.15.1 界面设计界面设计 此模块工程是一个基于对话框的 MFC 应用程序。首先建立一个 MFC 的界面工程。完 成后的主程序界面如图 4。用户可以单击“开始过滤”和“停止过滤”来决定数据过滤的 开始与停止。单击“安装规则”按钮可以把用户添加的规则加载到过滤驱动钩子驱动程序, 单击“卸载规则”按钮则可以把所加载的过滤规则全部卸载。 图 4. 主程序界面 当用户单击“添加规则”时弹出添加规则窗口,如图 5。用户可以在这按自己的需要 添加新的过滤规则。如源 ip 地址、源端口号,目的 ip 地址、目的端口号等内容。在“协议” 的下拉菜单中有“所有” 、 “TCP” “UDP” “ICMP”四个选项供用户选择。在“动作”一栏 里,用户可以选者“丢弃”或者“放行”来决定数据包如何处理。 第 13 页 共 20 页 图 5. 规则添加窗口 5.25.2 编码规则编码规则 为了增加程序的易读性,制定了以下变量命名规则: 变量使用代表中文意思的单词或组合,如果是单词组合,每个单词的第一个字母 大写,其余的小写。 变量尽量不使用缩写,个别较长的单词或已成习惯缩写如下 Initialize Init 初始化 Dialog Dlg 对话框 Application App 应用程序 自定义的全局变量用 m_开头,过程变量则不用变量的前缀用变量类型的第一个 字母标志变量类型。如果是对象,前缀用对象的名称,第一个字母大写 5.35.3 主要的类主要的类 CAboutDlg 类:主窗口类,从 CDialog 类派生 CFirewallApp 类:主应用程序类,从 CWinApp 类派生,它拥有文档模板对象,指向 主窗口的指针 m_pMainWnd CFirewallDoc 类:从 CDocument 类派生的文档类,它处理应用程序的使用的数据,保 存了与之相关的视图列表 CFirewallView 类:从 CFormView 类(间接从 CWiew 类派生)派生的视图类,它在文 档和用户之间充当中介;视图在屏幕上显示文档数据,并将用户输入解释为对文档的操作。 视图类又从 CWnd 类派生。 第 14 页 共 20 页 CMainFrame 类:从 CFrameWnd 派生的主窗口类,它充当可视图的容器,并为之添加 控制条、状态栏、菜单等界面元素。 CRuleDlg:从 CDialog 派生,过滤规则相关 5.45.4 核心代码核心代码 CMainFram 类主要是加载 IP 过滤驱动、IP 过滤钩子驱动和处理菜单命令。其在初始 化时加载 IP 过滤驱动和 IP 过滤钩子驱动,下面是相关主要代码: /-MainFram.h 文件- class CMainFrame : public CFrameWnd public: CDriver* m_pIPFltDrv; / IP 过滤驱动指针 CDriver* m_pFilterDrv; / IP 过滤钩子驱动指针 BOOL m_bStarted;/ 指示是否启动 ; /-MainFram.cpp 文件- CMainFrame:CMainFrame() / 确保 IP 过滤驱动启动(否则怎样为它安装钩子?) m_pIPFltDrv = new CDriver(IpFltDrv.sys, IpFltDrv); m_pIPFltDrv-StartDriver(); / 启动 IP 过滤钩子驱动 char szPath256; char* p; :GetFullPathName(DrvFltIp.sys, 256, szPath, m_pFilterDrv = new CDriver(szPath, DrvFltIp); if(!m_pFilterDrv-StartDriver() | !m_pFilterDrv-OpenDevice() MessageBox(创建服务失败!); exit(-1); m_bStarted = FALSE; CMainFrame:CMainFrame() 第 15 页 共 20 页 if(m_bStarted) m_pFilterDrv-IoControl(STOP_IP_HOOK, NULL, 0, NULL, 0); if(m_pFilterDrv != NULL) delete m_pFilterDrv; if(m_pIPFltDrv != NULL) delete m_pIPFltDrv; 5.4.1 开始过滤和停止过滤开始过滤和停止过滤 要开始或者停止过滤,只需要向 IP 过滤钩子发送设备控制代码 START_IP_HOOK 或 STOP_IP_HOOK。以下是用户单击开始和停止

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论