分类号:TP393.08 U D C:D10621-408-(2007)5878-0密 级:公 开 编 号:2003032062成都信息工程学院学位论文Windows简单防火墙的设计与实现论文作者姓名:李书琴申请学位专业:网络工程申请学位类别:工学学士指导教师姓名(职称):闫丽丽论文提交日期:2007年07月25 日Windows简单防火墙的设计与实现摘 要随着互连网的高速发展,网络给我们带来了极大的方便。人们的学习、工作以及生活越来越依赖于计算机网络,随之也出现了许多网络安全问题,因此当前网络安全产品备受人们的重视。防火墙是保障系统安全的一种有效手段,它可以将个人电脑与不完全的网络隔离开,按照预先设定的规则决定是否允许数据包通过,以此保障了个人电脑的安全。本毕业设计是基于Windows 2000操作系统、DDK for Windows2000工具开发包及Visual C++6.0平台开发的简单防火墙系统。系统主要分为两个模块:过滤钩子驱动模块和用户操作界面模块。过滤钩子驱动模块主要功能是注册过滤钩子回调函数,并按照用户提供的过滤规则进行数据包的过滤;用户操作界面模块的主要功能是实现用户添加、删除过滤规则,同时允许用户以文件的形式保存所添加的过滤规则。关键词:防火墙;包过滤;钩子;回调函数The Design and Realization of Simple Firewall for WindowsAbstractWith 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页 TOC \O "1-3" \H \Z \U HYPERLINK \L "_TOC535355762" 1 引言 PAGEREF _TOC535355762 \H 1 HYPERLINK \L "_TOC535355763" 1.1 课题背景 PAGEREF _TOC535355763 \H 1 HYPERLINK \L "_TOC535355764" 1.2 国内外研究现状 PAGEREF _TOC535355764 \H 1 HYPERLINK \L "_TOC535355765" 1.3 本课题研究的意义 PAGEREF _TOC535355765 \H 1 HYPERLINK \L "_TOC535355766" 1.4 本课题的研究方法 PAGEREF _TOC535355766 \H 2 HYPERLINK \L "_TOC535355767" 2 相关理论技术基础 PAGEREF _TOC535355767 \H 2 HYPERLINK \L "_TOC535355768" 2.1 防火墙技术简介 PAGEREF _TOC535355768 \H 2 HYPERLINK \l "_Toc535355769" 2.1.1 防火墙简介 535355769 2 HYPERLINK \l "_Toc535355770" 2.1.2防火墙分类 535355770 2 HYPERLINK \l "_Toc535355771" 2.1.3 防火墙的局限性 535355771 3 HYPERLINK \L "_TOC535355772" 2.2 Visual C++6.0相关技术简介 PAGEREF _TOC535355772 \H 3 HYPERLINK \L "_TOC535355773" 3 总体设计方案 PAGEREF _TOC535355773 \H 4 HYPERLINK \L "_TOC535355774" 3.1 设计过程 PAGEREF _TOC535355774 \H 4 HYPERLINK \L "_TOC535355775" 3.2 设计方案 PAGEREF _TOC535355775 \H 4 HYPERLINK \L "_TOC535355776" 4 过滤钩子驱动的实现 PAGEREF _TOC535355776 \H 5 HYPERLINK \L "_TOC535355777" 4.1 Filter_Hook Driver概述 PAGEREF _TOC535355777 \H 5 HYPERLINK \L "_TOC535355778" 4.2 过滤钩子驱动的实现 PAGEREF _TOC535355778 \H 6 HYPERLINK \l "_Toc535355779" 4.2.1 创建内核模式驱动 535355779 6 HYPERLINK \l "_Toc535355780" 4.2.2 设置和清除过滤钩子 535355780 8 HYPERLINK \l "_Toc535355781" 4.2.3 过滤器钩子的I/O控制 535355781 10 HYPERLINK \l "_Toc535355782" 4.2.4过滤函数实现 535355782 11 HYPERLINK \L "_TOC535355783" 5 客户端应用程序 PAGEREF _TOC535355783 \H 12 HYPERLINK \L "_TOC535355784" 5.1 界面设计 PAGEREF _TOC535355784 \H 12 HYPERLINK \L "_TOC535355785" 5.2 编码规则 PAGEREF _TOC535355785 \H 14 HYPERLINK \L "_TOC535355786" 5.3 主要的类 PAGEREF _TOC535355786 \H 14 HYPERLINK \L "_TOC535355787" 5.4 核心代码 PAGEREF _TOC535355787 \H 14 HYPERLINK \l "_Toc535355788" 5.4.1开始过滤和停止过滤 535355788 15 HYPERLINK \l "_Toc535355789" 5.4.2安装和卸载过滤条件 535355789 16 HYPERLINK \l "_Toc535355790" 5.4.3文件存储 535355790 17 HYPERLINK \L "_TOC535355791" 结 论 PAGEREF _TOC535355791 \H 18 HYPERLINK \L "_TOC535355792" 参考文献 PAGEREF _TOC535355792 \H 18 HYPERLINK \L "_TOC535355793" 致 谢 PAGEREF _TOC535355793 \H 19 HYPERLINK \L "_TOC535355794" 声 明 PAGEREF _TOC535355794 \H 20引言 课题背景Internet的出现及迅速发展给现代人们的生产和生活都带来了前所未有的飞跃。互连网已经成为扩展个人和企业发展的重要工具,人们已经进入了信息时代。互连网将整个人类社会缩小成了一个村落——“地球村”,促进了信息的交流,提高了人们的工作效率,丰富了人们的生活。人们享受着信息时代带来的种种便利,体验着互联网带来的生活上的全新感受。但凡事有利必有一弊,随着对网络的依赖越来越大,网络安全问题也越来越明显。由于黑客攻击和信息泄露并不是直接对系统造成损害,所以往往不能引起人们的注意。人们总是在网络安全问题发生带来严重后果后,才意识到网络安全的重要。随着网络的进一步普及,网络安全产品逐渐地进入人们的视野,而防火墙作为把守用户安全大门的重要工具,越来越受到人们的重视。 国内外研究现状自从1986年美国Digital公司在Internet上安装了全球第一个商用防火墙系统,提出了防火墙概念后,防火墙技术得到了飞速的发展。国内外已有数家公司推出了功能各不相同的防火墙产品系列。目前的防火墙产品主要有堡垒主机、包过滤路由器、应用层网关(代理服务器)以及电路层网关、屏蔽主机防火墙、双宿主机等类型。作为内部网络与外部公共网络之间的第一道屏障,防火墙是最先受到人们重视的网络安全产品之一。虽然从理论上看,防火墙处于网络安全的最底层,负责网络间的安全认证与传输,但随着网络安全技术的整体发展和网络应用的不断变化,现代防火墙技术已经逐步走向网络层之外的其他安全层次,不仅要完成传统防火墙的过滤任务,同时还能为各种网络应用提供相应的安全服务。另外还有多种防火墙产品正朝着数据安全与用户认证、防止病毒与黑客侵入等方向发展。虽然防火墙是目前保护网络免遭黑客袭击的有效手段,但也有明显不足:无法防范通过防火墙以外的其它途径的攻击,不能防止来自内部变节者和不经心的用户们带来的威胁,也不能完全防止传送已感染病毒的软件或文件,以及无法防范数据驱动型的攻击。 本课题研究的意义目前市场上大多数的防火墙产品仅仅是网关型的,虽然它们的功能相当强大,但由于它们基于下述的假设:内部网是安全可靠的,所有的威胁都来自网外。因此,他们防外不防内,难以实现对企业内部局域网内主机之间的安全通信,也不能很好的解决每一个拨号用户所在主机的安全问题,而大多数个人上网之时,并没有置身于得到防护的安全网络内部。个人上网用户多使用Windows操作系统,而Windows操作系统本身的安全性就不高。各种Windows漏洞不断被公布,对主机的攻击也越来越多。一般都是利用操作系统设计的安全漏洞和通信协议的安全漏洞来实现攻击。如假冒IP包对通信双方进行欺骗;对主机大量发送IP数据包进行轰炸攻击,使之崩溃;以及蓝屏攻击等。因此,为了保护主机的安全通信,研究有效的个人防火墙技术很有必要。 本课题的研究方法本设计是使用Win2000 DDK中提供的Filter-Hook Driver来实现数据包的过滤。过滤钩子驱动程序是一个用于过滤网络包的核心模式驱动程序,它扩展了系统提供的IP过滤驱动程序的功能。过滤钩子驱动程序完成一个过滤钩子回调函数并在系统提供的IP过滤驱动程序中注册这个回调函数。这个回调函数被看作一个过滤钩子。当有数据包需要通过时,IP过滤驱动程序会调用这个过滤钩子以决定怎样处理到达和输出的包。相关理论技术基础防火墙技术简介2.1.1 防火墙简介Internet的发展给政府,企事业单位带来了革命性的改革和开放,也给个人的工作和生活带了前所未有的改变。人们享受着互连网带来的种种方便,同时也面临着Internet的开放带来的关于数据安全的新挑战和新危险:企事业单位商业机密的泄露,个人隐私以及私秘信息的窃取。这就需要人们给网络加一道安全之门,而这道门的重要守护者就是防火墙。防火墙是指设置在不同网络或者网络安全域之间的一系列部件的组合。它是不同网络或者网络安全域之间的唯一出口,所有进出这出口的访问都得经过它的审核。用户可以根据自己的情况来设置访问规则实现对所有访问的控制,用来达到对安全的保证。在逻辑上,防火墙是一个分离器,一个限制器,也是一个分析器。它有效地监控了内部网络与外部网络之间的所有活动,其基本目的是阻止未被邀请的客户进入内部网络,保证了内部网络的安全。2.1.2防火墙分类根据对限制传输机制的不同,把防火墙大致分成以下三种:封包过滤、代理服务器和应用程序网关:1.包过滤防火墙截获网络上的所有传输信息,这些信息都是以包的形式进行传输的,数据包中包含发送方的IP地址,接收方的IP地址,端口,链路状态等信息。防火墙的工作就是把这些信息读取出来,再根据用户自定义的规则来进行过滤。那些不符合规则的数据包将被过滤掉,以保证网络的安全。2.代理服务器接收客户请求后会检查验证其合法性,如果合法,代理服务器向一台客户机取回所需的信息在转发给客户。它将内部系统与外界隔离开来,从外面只能看到代理服务器而看不到任何内部资源。代理服务器只允许有代理的服务通过,而其他所有服务都完全被封锁住。这一点对系统安全是非常重要的,只有那些被认为“可信赖的”服务才允许通过防火墙。另外代理服务还可以过滤协议,如可以过滤FTP连接,拒绝使用FTP put(放置)命令,以保证用户不能将文件写到匿名服务器。代理服务器具有信息隐藏,保证有效的认证和登陆,简化了过滤规则等优点。网络地址转换服务可以屏蔽内部网络的IP地址,使网络结构对外部来讲是不可见的。3.应用程序网关本质上是另一种类型的代理服务器。通信时,内部客户首先和应用程序网关建立连接,应用程序网关确定这个连接是否被允许,如果允许的话再和目的计算机建立连接。因此,所有的通讯都需要经过两个连接——客户到网关的连接和网关到目的主机的连接。应用程序网关会监视所有的传输,根据规则决定是否转发他们。和代理服务器一样,外面的世界看到的只是应用网关的IP地址,这就有效地保护了内部网络。2.1.3 防火墙的局限性虽然防火墙按照我们的要求严格地把守着网络安全的大门,但它也不是万能的,也存在着一些局限性。比如它不能防范不经过它的攻击,也就是可以寻找一条小路绕开防火墙把守的大门。例如,如果允许从受保护的网络内部向外拨号,一些用户就可能形成与Internet的直接连接。另外,防火墙很难防范来自于网络内部的攻击以及病毒的威胁。它更不可能防止靠欺骗来获得某些可以破坏安全的信息的社会工程的攻击。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中包含了上成千上万行正确、优化和功能强大的Windows代码。你所调用的很多成员函数完成了你自己可能很难完成的工作。从这点上讲,MFC极大地加快了程序开发速度。总体设计方案设计过程防火墙是对所截取的数据包按用户定义的规则进行过滤的,所以要开发设计一个防火墙,第一步要实现对数据包的截取。如果数据包的拦截没有实现,那么分析、过滤等就是空谈。截获数据包有很多种方法,首先想到了Winpcap(Windows Packet Capture),它是Windows平台下的一个免费、公共的网络访问系统。但后来发现其主要功能在于独立于主机协议(如TCP/IP)而发送和接收原始数据。也就是是说,Winpcap不能阻塞、过滤或控制其他应用程序数据包的收发,它仅仅是监听共享网络上传送的数据报。因此,把它用于开发个人防火墙将会比较困难。虽然用户态下实现数据包捕获比较容易,但其拦截数据包有一些局限性,一个最大的缺点就是只能在Winsock层次上进行,而对于网络协议栈中底层协议的数据包无法进行处理。而利用驱动程序来拦截数据包,虽然功能很强大,但实现起来比较困难。做折中比较后,在用驱动程序拦截数据包的方法中选择了一个最简单的方法:使用Win2000 DDK中提供的Filter-Hook Driver来实现数据包的过滤。设计方案本设计分成两大模块:数据过滤钩子驱动模块和用户操作界面程序模块。 SHAPE \* MERGEFORMAT 图1.系统总体设计1.数据过滤钩子驱动模块利用在Microsoft Windows 2000 DDK中介绍的Filter-Hook Drive来实现对所有进出接口的数据进行过滤。主要有以下五个步骤:建立内核模式驱动Filter-Hook Drive;取得指向IP Filter Driver的指针;利用步骤2得到的指针,发送特殊的IRP来安装过滤函数;过滤数据;结束过滤,撤消过滤函数。2.用户操作界面程序模块该模块主要就是用户所看到的程序界面,是用户和防火墙进行对话的对象。它负责管理用户定义的过滤规则,与数据过滤钩子驱动模块进行通信。主要利用过滤钩子驱动模块应用输出接口提供的四个IOCTL来实现相应功能:START_IP_HOOK(注册过滤函数);STOP_IP_HOOK(撤消过滤函数);ADD_FILTER(安装新的过滤规则)CLEAR_FILTER(清除所有规则)过滤钩子驱动的实现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中说明了过滤钩子驱动程序的流程结构,这就给我们提供了拦截网络数据包的基本思路。内核中的过滤器钩子驱动将本机进出的所有封包都传入到我们的虚拟设备中,按照我们提供的过滤规则进行处理。 SHAPE \* MERGEFORMAT 图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; //效验和 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 种回复响应代码所代表的含义描述如下:·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过滤驱动名称“\Device\IPFILTERDRIVER”,为DesireAccess参数传递FILE_ALL_ACCESS过滤器钩子驱动程序使用PF_SET_EXTENSION_POINTER控制码建立一个IRP,并将其提交给IP过滤钩子驱动程序,通常filter-hook驱动程序调用IoBuildDeviceIoControlRequest函数建立所需IRP,该控制码向IP过滤器驱动程序注册过滤钩子回调函数。PIRP IoBuildDeviceIoControlRequest( 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例程设置和输出入口点。驱动开发人员需要定义和公布所有的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来实现。具体的过滤函数实际上就是过滤钩子回调函数,当有数据包的发送或者接收时钩子回调函数将会被调用。系统将根据对比过滤规则链表里的规则来决定如何处理封包。过滤函数实现大致流程如下:图3.过滤函数流程客户端应用程序用户程序的核心实现就是使用CDriver类向驱动程序发送几个设备控制代码(START_IP_HOOK(安装过滤钩子)、STOP_IP_HOOK(清除过滤钩子)、ADD_FILTER(安装过滤规则)、CLEAR_FILTER(卸载过滤规则))。程序在初始化时加载过滤钩子驱动,当用户单击开始按钮时向驱动发送START_IP_HOOK安装过滤钩子,单击停止按钮时发送STOP_IP_HOOK控制代码清除过滤钩子。用户单击添加过滤规则弹出添加规则对话框,为用户提供添加过滤规则的输入界面,单击删除时则实现删除用户选定的过滤规则;当用户单击安装规则和卸载规则时,则分别发送控制代码ADD_FILTER和CLEAR_FILTER来实现过滤规则的加载或者卸载。界面设计此模块工程是一个基于对话框的MFC应用程序。首先建立一个MFC的界面工程。完成后的主程序界面如图4。用户可以单击“开始过滤”和“停止过滤”来决定数据过滤的开始与停止。单击“安装规则”按钮可以把用户添加的规则加载到过滤驱动钩子驱动程序,单击“卸载规则”按钮则可以把所加载的过滤规则全部卸载。图4. 主程序界面当用户单击“添加规则”时弹出添加规则窗口,如图5。用户可以在这按自己的需要添加新的过滤规则。如源ip地址、源端口号,目的ip地址、目的端口号等内容。在“协议”的下拉菜单中有“所有”、“TCP”“UDP”“ICMP”四个选项供用户选择。在“动作”一栏里,用户可以选者“丢弃”或者“放行”来决定数据包如何处理。图5. 规则添加窗口编码规则为了增加程序的易读性,制定了以下变量命名规则:变量使用代表中文意思的单词或组合,如果是单词组合,每个单词的第一个字母大写,其余的小写。变量尽量不使用缩写,个别较长的单词或已成习惯缩写如下Initialize Init 初始化 Dialog Dlg 对话框Application App 应用程序自定义的全局变量用m_开头,过程变量则不用变量的前缀用变量类型的第一个字母标志变量类型。如果是对象,前缀用对象的名称,第一个字母大写主要的类CAboutDlg类:主窗口类,从CDialog类派生CFirewallApp类:主应用程序类,从CWinApp类派生,它拥有文档模板对象,指向主窗口的指针m_pMainWndCFirewallDoc类:从CDocument类派生的文档类,它处理应用程序的使用的数据,保存了与之相关的视图列表CFirewallView类:从CFormView类(间接从CWiew类派生)派生的视图类,它在文档和用户之间充当中介;视图在屏幕上显示文档数据,并将用户输入解释为对文档的操作。视图类又从CWnd类派生。CMainFrame类:从CFrameWnd派生的主窗口类,它充当可视图的容器,并为之添加控制条、状态栏、菜单等界面元素。CRuleDlg:从CDialog派生,过滤规则相关核心代码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 szPath[256]; char* p; ::GetFullPathName("DrvFltIp.sys", 256, szPath, &p); m_pFilterDrv = new CDriver(szPath, "DrvFltIp"); if(!m_pFilterDrv->StartDriver() || !m_pFilterDrv->OpenDevice()) { MessageBox("创建服务失败!"); exit(-1); } m_bStarted = FALSE;}CMainFrame::~CMainFrame(){ 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。以下是用户单击开始和停止按钮时程序调用的函数:void CMainFrame::OnFileStart() // 开始过滤{ if(m_bStarted) return;// 通知IP过滤驱动开始过滤 if(m_pFilterDrv->IoControl(START_IP_HOOK, NULL, 0, NULL, 0) == -1) { MessageBox("启动服务出错!"); return; } m_bStarted = TRUE;}void CMainFrame::OnFileStop() // 停止过滤{ if(m_bStarted) { // 通知IP过滤驱动停止过滤 m_pFilterDrv->IoControl(STOP_IP_HOOK, NULL, 0, NULL, 0); m_bStarted = FALSE; }}5.4.2安装和卸载过滤条件这项工作是通过向IP过滤驱动发送控制代码ADD_FILTER和CLEAR_FILTER来实现的。以下是主要代码:void CMainFrame::OnRulesInstall() // 安装过滤条件{ // 首先清除过滤条件 m_pFilterDrv->IoControl(CLEAR_FILTER, NULL, 0, NULL, 0); // 从文档对象取出数据,安装过滤条件 int nRet; CFirewallDoc* pDoc = (CFirewallDoc*)GetActiveDocument(); for(int i=0; im_nRules; i++) { // 转换字节顺序 CIPFilter pf; memcpy(&pf, &(pDoc->m_rules[i]), sizeof(CIPFilter)); pf.sourcePort = (USHORT)htonl(pDoc->m_rules[i].sourcePort);pf.destinationPort = (USHORT)htonl(pDoc->m_rules[i].destinationPort); // 发送设备控制代码nRet = m_pFilterDrv->IoControl(ADD_FILTER, &pf, sizeof(pf), NULL, 0); if(nRet == -1) { AfxMessageBox("安装过滤条件出错!"); break; } }}void CMainFrame::OnRulesUninstall() // 卸载过滤条件{ // 清除过滤条件 m_pFilterDrv->IoControl(CLEAR_FILTER, NULL, 0, NULL, 0);}5.4.3文件存储Firewall程序可以将用户添加的过滤规则保存到以rul为后缀的文件中。以下是用户单击保存过滤规则和加载过滤规则时框架程序调用的函数:void CMainFrame::OnFileConserve() // 用户单击保存过滤规则{ CFirewallDoc* pDoc = (CFirewallDoc*)GetActiveDocument(); if(pDoc->m_nRules == 0) { AfxMessageBox("没有规则!"); return; } // 弹出保存对话框 CFileDialog dlg(FALSE, "rul", NULL, OFN_HIDEREADONLY | OFN_CREATEPROMPT, "Rule Files(*.rul)|*.rul|all(*.*)|*.*||", NULL); if(dlg.DoModal() == IDCANCEL) return; // 写入文件 CFile file;if(file.Open(dlg.GetPathName(), CFile::modeCreate | CFile::modeWrite)) { for(int i=0; im_nRules; i++) { file.Write(&pDoc->m_rules[i], sizeof(CIPFilter)); } } else { AfxMessageBox("保存文件出错!"); } }结 论随着网络的发展,个人防火墙越来越受到重视,用户对个人防火墙的要求也越来越高。本课题采用Filter-Hook Driver技术,设计并实现了一个简单的包过滤防火墙,基本实现了用户自动添加、删除过滤规则,并能按用户提供的过滤规则实现数据包的过滤等功能。但通过测试可以看到,当用户添加了较多的过滤规则并进行数据过滤时,上网速度会变慢,所以还需要对过滤规则对比算法做一些改进。另外还有许多功能需要增加,比如日志功能。日志功能是防火墙很重要的功能之一,通过防火墙日志用户可以更好地维护和管理网络。由于毕业设计时间短暂,本设计还有很多需要改进的地方,将在今后的工作中继续完善该软件系统。通过本次课题的研究,对Windows环境下的数据包截获方法有了一定的了解,对Windows驱动编程和软件开发的各项流程也有了更进一步的认识,并巩固了所学的知识。 HYPERLINK "论文格式摸板(2007).doc" 参考文献[1] 王艳平,张越 著 .Windows网络与通信程序设计[M].北京:人民邮电出版社.2006。[2] 郑莉,董渊. 著 C++语言程序设计[M].北京:清华大学出版.2001。[3] 黎连业,张维, 向东明 著 防火墙及其应用技术[M].北京:清华大学出版.2004。[4] 朱雁辉,朱雁冰 著 Windows防火墙与网络封包截获技术[M].北京:电子工业出版社2002。[5] 刘晓华 著 精通MFC [M].北京:电子工业出版社2003。[6] Marcus Goncalves[美] 著.防火墙技术大全[M]. 北京: 中国电力出版社.1999。[7] 谢希仁 著.计算机网络[M].北京: 电子工业出版社.2003。致 谢首先感谢我的指导教师。从去年选题开始,接受课题到现在完成毕业设计论文,导师给予了精心的指导和热情的帮助,使得我得以顺利的完成毕业设计开发工作。在短暂的几个月的相处时间里,老师渊博的知识、敏锐的思路和实事求是的工作作风给我留下了深刻的印象,这将使得我终身受益,谨此向老师表示衷心的感谢和崇高的敬意。再次感谢学院领导的指导和关心,在资格审查中,感谢各位老师对我的前期成果提出意见,指出不足,以便我改进。我也感谢我的同组同学和同班同学在这次毕业设计中给我的支持和帮助,特别感谢同学为我提供电脑,让我顺利完成毕业设计和论文。也感谢学校图书馆给我提供丰富的资料,让我为做毕业设计做了充分准备。最后,要感谢的是在百忙之中抽出时间来审阅我的论文的各位老师,谢谢您们!作者简介: 姓 名:李书琴 性别: 男出生年月:1983.10.27 民族: 汉E-mail: li2014@163.com声 明本论文的工作是2007年02月至2007年06月在成都信息工程学院网络工程系完成的。文中除了特别加以标注地方外,不包含他人已经发表或撰写过的研究成果,也不包含为获得成都信息工程学院或其他教学机构的学位或证书而使用过的材料。除非另有说明,本文的工作是原始性工作。关于学位论文使用权和研究成果知识产权的说明:本人完全了解成都信息工程学院有关保管使用学位论文的规定,其中包括:(1)学校有权保管并向有关部门递交学位论文的原件与复印件。(2)学校可以采用影印、缩印或其他复制方式保存学位论文。(3)学校可以学术交流为目的复制、赠送和交换学位论文。(4)学校可允许学位论文被查阅或借阅。(5)学校可以公布学位论文的全部或部分内容(保密学位论文在解密后遵守此规定)。除非另有科研合同和其他法律文书的制约,本论文的科研成果属于成都信息工程学院。特此声明! 作者签名: 2007年06月 日PAGE 第 PAGE 20 页 共 20 页网络适配器网络适配器驱动程序IP过滤驱动程序开始结束NNYY取下一条规则过滤钩子DrvFltIp.sysNDISIP层TDI用户界面程序过滤钩子驱动程序处理UDP规则取下一条规则处理TCP规则是否符合TCP规则NNY取下一条规则处理IP规则拷贝packet的内容到共享内存区是否符合IP规则Y取下一条规则处理ICMP规则是否符合ICMP规则是否符合UDP规则
毕业论文设计,H2003032062_李书琴
3997
来源:
Licence:
联系:
分类:
平台:
环境:
大小:
更新:
标签:
免费下载
×
温馨提示
请用电脑打开本网页,即可以免费获取你想要的了。