摘要随着互联网的普及,安全问题越来越受到大家的重视一个安全良好的网络环境能很好的保护好人们的计算机不受木马和病毒的侵扰,给人们的财产和隐私提供必要的保护.个人防火墙作为最早出现和最多使用的网络安全产品,以软件的形式存在于计算机与其所连接的网络之间,对流经计算机的未经授权的网络数据包进行监控和阻止,以起到对系统的保护作用.因此,开发有效的个人防火墙具重要意义本文根据个人防火墙的实际需求,首先分析了目前市场上各类防火墙所采用的不同核心过滤技术,结合其优缺点和实现的难易程度,确定了本课题实现所采用的技术并做出相应的阐述.其次对本课题实现的功能和核心技术进行了详细的介绍,接着对个人防火墙的相关功能进行了介绍和展示,最后对完成本论文中获得的心得体会和经验进行了系统的总结本课题中实现个人防火墙所采用的核心过滤技术为Filter—Hook Driver核心过滤驱动的开发采用Visual Studio 2010和Windows下的驱动开发工具WDK进行编码和编译,用户层采用C语言进行编写用户界面用MFC实现.本个人防火墙实现了对网络数据包的过滤,管控规则设置和日志功能充分考虑了个人防火墙所需的基本功能,操作方便,界面简单友好。
关键词个人防火墙;数据包过滤;Filter—Hook Driver;网络安全Abstract With the popularity of the Internet, security issues are attention by more and more people A secure network environment can protect personal computer from Trojans and viruses, and provide necessary protection to people’s property and privacy. Personal firewall as the earliest and the most used Network Security toolkit, it exists as software, between a computer and its network In order to protect the system, personal firewall monitors and prevents network packets which are flowing through the compute and unauthorized. Therefore, the development of an effective personal firewall has the important meaning。
According to the actual needs of personal firewall, this paper first analyzes different core filtering technologies adopted by all kinds of firewall used in the current market, combined with the ease of their implementation and relative merits. This topic determined how to achieve this system and made the corresponding elaboration Secondly the function and the core technology of this project is introduced in detail, then introduces and displays the related functions of a personal firewall, and finally summarizes the feelings and experiences in completing this paper。
In this topic, the core filtering technology in realization of personal firewall is adopted by the Filter-Hook Driver Filter-Hook Driver using Visual Studio 2010 and WDK to development which is a driver development tool under the Windows, Using C language to write user layer The user interface use MFC to achieve. This personal firewall achieved those functions: network packet filtering, control rules set and logging. Fully considering the basic functions of a personal firewall, this system is easy to operate and has friendly interfaces.Key wordsPersonal Firewall; Packet filtering; Filter-Hook Driver; Network security31 / 35目录摘要 IAbstract II第一章 前言 11。
1 课题的开发背景与意义 11.1.1 开发背景 11.12 研究意义 212 国内外研究现状 213 课题研究内容与结构 4第二章 相关理论简介 521 防火墙核心过滤技术 52.1.1 用户态数据包拦截技术 52.1.2 内核态数据包拦截技术 521.3 Filter—Hook Driver 622 TCP\IP网络通信协议 72.21 IP网际协议 822 TCP传输控制协议 822.3 UDP用户数据报协议 823 内核模式驱动程序开发 9第三章 开发工具与环境简介 103.1 Microsoft Visual Studio 2010 103.2 C语言简介 1033 驱动开发工具 1033.1 WDK内核编程工具 1133.2 编译驱动程序源文件 1133.3 安装运行驱动程序 123.4 MFC简介 12第四章 个人防火墙的总体设计 1341 防火墙整体结构 1341 用户层 1441.2 驱动层 1442 防火墙系统流程图 1443 防火墙实现的功能 16第五章 个人防火墙的详细设计与实现 175.1 驱动层Filter—Hook Driver 1751 初始化 1751.2 请求分发 185.2 驱动控制模块的实现 225。
2.1 驱动服务安装 2352.2 打开驱动设备 2453 对驱动设备进行控制 245.3 用户界面 255.4 系统测试 2551 测试环境与工具 265.42 功能测试 26结论 29参考文献 30致谢 31第一章 前言本章主要阐述windows平台下个人防火墙开发的相关背景和课题研究意义,对个人防火墙在国内外的发展现状作简要介绍并对本文的结构和内容进行简单的概括1 课题的开发背景与意义1.1.1 开发背景随着网络技术的飞速发展和互联网在全世界范围内的普及,人们的生活越来越离不开互联网-—学习,娱乐,通信,信息获取等等,互联网大大提高了我们的效率,丰富了我们的生活.但随着互联网用户越来越多,互联网在给人们生活带来便利的同时,也给不少人提供了一条攻击其他用户计算机或窃取用户资料的途径,这就导致了普通用户在网络上收到攻击的现象越来越严重,各种入侵攻击层出不穷,导致人们因网络安全而导致的损失越来越大因此,为了给用户提供一个良好的网络环境,需要一种方法来为用户抵御这类来自网络的攻击而个人防火墙作为一种隔离控制技术,把用户和公共网络分隔开来,通过对流经它的网络信息进行监控过滤,抵御外部攻击以实现安全防护的安全工具,可以对流经它的数据包进行过滤--对用户“允许"的合法数据访问放行并对用户“不允许"的非法数据进行拦截过滤,以起到保护个人计算机的目的。
因此,个人防火墙在保护用户个人计算机的网络安全方面起到重要作用另一方面,Windows操作系统凭借其简单易用的操作和强大的技术支持,几乎占据了整个桌面操作系统市场,市场占有率超过90%但我们知道,世界上没有绝对安全的操作系统,Windows也存在很多漏洞,给骇客通过网络和系统漏洞对用户进行攻击留下了后门,这无疑会给用户的财产和隐私带来巨大的损失.而防火墙作为保护用户上网环境安全的工具,可以有效避免用户因遭到网络攻击造成的损失,因此,在Windows系统下构建个人防火墙是十分必要的.考虑到各种防火墙的优缺点及其实现的难易程度,并结合个人能力本文最终采用Filter-Hook Driver数据包拦截技术实现个人防火墙1.2 研究意义个人防火墙作为作为最常用的网络安全工具,其实现所用到的很多技术跟企业级防火墙和硬件防火墙的基本原理是相同的,可以从研究个人防火墙开始,由浅入深,进而理解企业级防火墙和硬件防火墙的原理和实现方法从而研究个人防火墙也能极大的推动网络安全技术的进步,具有重大的工程意义.Windows作为国内外主要的桌面操作系统,其平台下的个人防火墙为用户的网络安全起到了很好的防护作用。
但目前市场上基于不同包截获技术的防火墙的综合性能参差不齐,故在该平台下的防火墙的研究对于推动个人防火墙技术的发展具有现实意义.本文采用的通过Filter-Hook Driver实现数据包拦截的防火墙技术虽然不是开发防火墙最好的方法,但对于对这个领域感兴趣的个人是一个具实际意义的好的开始.1.2 国内外研究现状防火墙作为最早出现的网络安全产品,受到了广大用户和机构的青睐,应用十分广泛,自1986年美国Digital公司提出防火墙概念并安装第一个商用防火墙以来,防火墙技术已经获得了飞速的发展,基于功能划分,可分为以下阶段:Ø 第一代防火墙技术几乎与路由器同时出现,采用包过滤技术这类防火墙根据数据包头信息和过滤规则来控制数据包的过滤,一般用于对安全性要求不是很高,偏重数据处理速度的网络路由器上Ø 第二代防火墙由贝尔实验室的Dave Presotto和Howard Trickey最早于于1989年推出,即电路层防火墙并同时提出了第三代防火墙—应用层防火墙的概念(或者叫做代理防火墙).Ø 1992年,USC信息科学院的BobBraden开发出了基于动态包过滤(Dynamic packet filter)技术后来演变为现在所说的状态监视(Stateful inspection)技术的第四代防火墙。
它根据过去的通信信息和应用程序状态信息动态生成过滤规则1994年,以色列的CheckPoint公司开发出了第一个采用这种技术的商业化的防火墙产品Ø 1998年,NAI公司推出了一种自适应代理(Adaptive proxy)技术,并在其产品Gauntlet Firewall for NT中得以实现,给代理类型的防火墙赋予了全新的意义,可以称之为第五代防火墙该类型的防火墙整合了动态包过滤技术和应用代理技术,本质上也可认为仍属于状态检测防火墙另外,基于实现划分,防火墙又可分基于路由器的防火墙、用户花的防火墙、建立在通用操作系统上的防火墙和具有安全操作系统的防火墙四个阶段:Ø 基于路由器的防火墙即第一代防火墙,上面已做简单介绍Ø 用户化的防火墙即把过滤功能从路由器中独立出来加上日志和警告功能,并针对用户需求提供相应功能,使得防火墙的安全性和性价比相对第一代防火墙有所提高Ø 建立在通用操作系统上的防火墙,顾名思义,就是将防火墙以软件或硬件的实现方式独立出来,并配有专用的代理系统,以监控所有协议的数据和指令,并能保护用户的编程空间和可配置内核参数的设置,这使得防火墙的安全性和速度得到大幅提高Ø 具有安全操作系统的防火墙本身就是一个操作系统,在安全性上较前几种防火墙有本质的提高,这也是目前防火墙产品的主要发展趋势,这类防火墙的开发厂商有操作系统的源代码,可实现安全内核并对其加固,甚至对每个服务器和子系统都做安全处理,一旦骇客攻破了一个服务器,防火墙就将它隔离在此服务器内,不会对其他部分构成威胁,且透明性良好,易于使用.windows操作系统作为全球使用者最多的操作系统,其平台下开发出了许多优秀的个人防火墙。
国外的如Symantec公司的Norton、Network ice公司的BlackIce Defender、Mcafee公司的Cisco、卡巴斯基互联网安全套装个人版以及Zone Lab公司的Free ZoneAlarm等都是比较著名的个人防火墙国内市场上个人用户较多的有天网防火墙个人版、金山网镖、瑞星、费尔等常见个人防火墙所有这些基于windows的个人防火墙的区别主要在于它们所采用的对网络数据包拦截的核心技术不同总的来说,可分为用户态和内核态数据包拦截两大类[[] 孙卫, 荆霞, 王诚. Windows平台个人防火墙技术的研究[J]. 南京审计学院学报, 2010, 7(2):84-92.]用户态下的个人防火墙主要为基于winsock2 SPI技术的个人防火墙(如费尔个人防火墙等);和内核态下的个人防火墙主要有:基于TDI过滤驱动的个人防火墙(如国内的天网防火墙和金山网镖等),基于NDIS中间层驱动(如冰盾防火墙等)的个人防火墙,基于NDIS-HOOK的个人防火墙(如卡巴斯基互联网套装个人版)和基于Win2K Filter—Hook Driver的个人防火墙目前很多比较优秀著名的个人防火墙多采用复合型数据包过滤技术进行开发,即采用两种或多种封包截获技术进行数据包的过滤,以达到全面、强大、平台兼容的效果。
本课题将采用Filter-Hook Driver过滤技术,Filter-Hook Driver是从Windows 2000开始提供的一种机制,利用ipfiltdrvsys所提供的功能来拦截网络数据包,其结构简单,相对易于实现,且能截获所有的IP包.13 课题研究内容与结构本文主要研究通过实现Filter—Hook Driver的方式来操控ipfiltdrvsys对网络数据包的过滤,本课题主要分为核心层驱动和用户层调用函数及界面两个模块,通过用户层操作控制核心层驱动程序,从而实现个人防火墙.简单来说,实现Filter-Hook就是对系统ipfiltdrvsys的接口的实现本文的整体结构如下:Ø 第一章主要阐述系统开发的背景和研究意义、国内外研究现状以及本文总体概述Ø 第二章主要针对本文所涉及的技术的相关知识理论进行简单的介绍Ø 第三章将介绍本防火墙系统开发中所用到的开发环境和工具Ø 第四章详细介绍本文个人防火墙的系统设计和各个功能模块Ø 第五章主要阐述核心功能的具体实现和详细分析以及系统测试等Ø 最后是总结,致谢等第二章 相关理论简介本章将对课题实现中所用到的技术和开发工具进行介绍.将对各种主流防火墙核心过滤技术、TCP\IP和驱动开发相关基础知识再做简单介绍。
另将主要介绍如Filter—Hook Driver、IP过滤驱动(IP Filter Driver)等所用到的技术1 防火墙核心过滤技术网络防火墙的核心过滤都是基于数据包的拦截技术之上的在Windows下数据包的拦截方式可分为用户态和内核态数据包拦截两大类[[] Chiong R, Dhakal S. On the Insecurity of Personal Firewall[J]. Information Technology,2008,(8):1-10.]2.1.1 用户态数据包拦截技术用户态下的数据包拦截技术主要为Winsock2 SPI(Service Provider Interface)Winsock2是Windows Sockets的20版本,SPI是Winsock2提供的一个可编程接口.SPI以动态链接库(DLL)的形式工作在应用层,开发者通过安装自己编写的SPI程序(服务提供者接口程序)来处理截获的基于Socket的网络数据包以完成过滤Winsock2 SPI以DLL形式存在,编程简单,调试方便.并且数据封包比较完整,便于内容过滤但无法拦截核心层或不用Socket的网络通讯(如ICMP)的数据包,容易被木马或病毒绕过[[] 朱雁辉. Windows防火墙与网络封包截获技术[M]. 北京:电子工业出版社,2002:77-90.]。
22 内核态数据包拦截技术内核态下的数据包拦截方式有多种:TDI过滤驱动程序、NDIS中间层驱动程序、NDIS-Hook Driver和Filter-Hook Driver.目前很多大型防火墙都是采用复合型的数据包过滤技术下面简单介绍各包拦截技术Filter—Hook Driver将在后边进行单独的介绍.1. TDI(Transport Driver Interface)过滤驱动:TDI—Filter Driver程序通过将创建的一个或者多个设备对象挂载到一个现有的驱动程序(tcpipsys)之上,当有应用程序或其他驱动程序调用这一个或多个设备对象时,会首先映射到过滤驱动程序上,然后再由过滤驱动程序传递给原来的设备对象[[] 方飞, 李兵. Windows系统TDI驱动关键技术的研究[J]. 通信技术, 2010, 43(7):89-91.]这就完成了数据包的过滤其优点是可以获取到当前进程的详细信息缺点是该驱动位于tcpip.sys上,不能获取由tcpipsys直接处理的数据包,且TDI驱动需重启系统才能生效.另外Windows 2000之前的系统不支持2. NDIS中间层驱动:位于协议驱动和小端口驱动之间。
主要在网络层和数据链路层对数据包进行过滤.NDIS由于是在网卡驱动程序和传输驱动程序间插入了一层,其优点是过滤功能强大,能截获所有的数据包,安全系数高[[] 刘鹏远. Windows下个人防火墙实现技术路线分析[J]. 计算机工程与设计, 2008, 29(21):65-68.]缺点是编程规范要求苛刻复杂,难度较大;不容易安装,安装出错容易导致系统错误;也不支持Windows 2000之前的系统3. NDIS—Hook Driver:NDIS—Hook Driver是目前大多数网络防火墙采用的方法NDIS(Network Driver Interface Specification)是微软和3COM公司定制的一套开发Windows下网络驱动程序的标准,为网络驱动的开发提供一套标准接口,使得网络驱动程序的跨平台性更好该技术的实现方法是安装Hook钩子到ndis.sys中,替换其中某些关键函数,从而达到截获网络数据包的目的[[] Chris Ries. Defeating Windows Personal Firewalls: Filtering Methodologies, Attacks, and Defense[R]. VigilantMinds Inc, 2005:3-15.]。
具有安装简单,截包完整全面,安全性高等优点,但无法获得应用程序进程信息以上几种方法对于团队开发而言,NDIS—Hook是最佳选择,TDI-Filter Driver次之但对个人而言,工作量较大.2.13 Filter—Hook Driver国内关于TDI和NDIS驱动的资料比较多,但有关Filter-Hook Driver 的书籍资料就相对少很多.本文所采用的Filter-Hook Driver数据包拦截过滤驱动技术在Microsoft 微软相关文档里也只有Windows 2000 DDK中有一些介绍,实际上它只是扩展了IP过滤驱动(IP Filter Driver)的功能,是一种内核模式驱动(Kernel Mode Driver).IP Filter Driver对应ipfltdrvsys文件,该文件在Windows XP中的System32\drivers目录下,它允许用户注册自己的IP数据包处理函数.这个驱动文件默认未加载,但可以手动加载Filter-Hook Driver主要利用IpFilterDriver(ipfiltdrv.sys)所提供的功能来拦截网络数据包,可应用与TCP\IP协议[[] 潘瑜. 基于Filter-Hook技术的防火墙软件设计与实现[J]. 江苏技术师范学院学报, 2010, 16(9):18-23.]。
其工作方式如下:在Filter—Hook Driver中提供我们自己编写的回调(callback)函数,然后用IP 过滤驱动注册回调函数.实现步骤如下:1. 建立Filter—Hook Driver.2. 得到指向IP Filter Driver的指针3. 获得指针后,通过发送特殊的IRP请求安装过滤函数,该请求传递的数据包含了过滤函数的指针4. 过滤数据包5. 结束过滤,撤销过滤函数(通过传递NULL指针作为过滤函数指针来实现).另外,最多只能注册一个Filter-Hook Driver只有当Filter—Hook回调函数为空时,Filter-Hook Driver才能向IP Filter Driver注册自己提供的回调函数,后者调用提供的回调函数来实现Filter-Hook Driver控制数据包过滤.该技术的优点是结构简单,易于实现,且能截获所有的IP数据包(包括ICMP包)但无法获取当前应用程序进程信息,也无法取得数据包的以太帧,也不支持Windows 2000之前的系统本文采用Filter—Hook Driver控制数据包过滤,故不支持Windows 2000以前的系统2.2 TCP\IP网络通信协议TCP\IP协议指因特网整个TCP\IP协议族,而不是表面上的TCP和IP协议的合称。
TCP\IP协议族用于各平台下计算机之间的通信,是当今互联网通信的基础与OSI七层参考模型不完全相同,TCP\IP协议族通常被认为是一个四层协议系统TCP\IP协议族的四个层次与OSI七层参考模型间的对应关系如图2—1所示:图 2—1 TCP\IP协议族与OSI模型对应关系应用层表示层数据链路层网络层传输层会话层物理层应用层传输层网络层链路层如上图所示,人们通常(由于对于TCP\IP协议族与OSI七层模型不能精确的匹配,故也没有一个完全正确的说法来说明他们之间的对应关系)认为OSI模型的应用层、表示层和会话层这上三层在TCP\IP协议族中是应用层,而其最底两层在TCP\IP协议族中是链路层防火墙系统的过滤驱动模块工作在Windows TCP\IP协议模型的传输层.下文将对本文用到的协议做简单介绍.2.2.1 IP网际协议IP是TCP\IP协议族中最为核心的协议所有的TCP、UDP和ICMP数据都以IP数据报格式传输.IP数据报由IP首部和数据组成.IP首部一般长度为20Byte,除非包含有选项字段[[] (美)W Richard Stevens. TCP/IP详解 卷1:协议[M].【译者】范建华,张涛等.北京:机械工业出版社, 2000:24-36.]。
其首部的固定部分的字段为:版本(4bit)、首部长度(4bit)、服务类型(8bit)、总长度(16bit)、标识(16bit)、标志(3bit)、片偏移(13bit)、生存时间TTL(8bit)、协议(8bit)、首部检验和(16bit)、源地址(32bit)、目的地址(32bit).本文中对数据报的处理时所需注意的主要为版本、服务类型、协议、源地址和目的地址字段2 TCP传输控制协议TCP协议属于运输层,向应用层提供面向连接的,可靠的字节流服务TCP数据被封装在IP数据报中,如图2—2所示:IP首部TCP首部TCP数据图 2-Error! Bookmark not defined. TCP数据在IP数据报中的封装TCP首部包含源端口和目的端口的端口号字段、序号字段、确认序号字段、首部长度字段、检验和字段等源端口和目的端口号用于需找发送端和接收端的应用进程,这两个值加上IP首部中的源地址和目的地址可以唯一确定一个TCP链接序号用来标识源目端之间的数据字节流许多应用程序都使用TCP,如和SMTP2.2.3 UDP用户数据报协议UDP是一个简单的面向数据的运输层协议.与TCP协议同属运输层,但与TCP协议不同,它是一种非连接导向协议,不提供可靠性。
UDP首部字段包含源端口号、目的端口号、UDP长度、UDP检验和以及数据(可无)几个字段源、目端口号指明发送进程和接收进程;UDP长度表示UDP首部和UDP数据的字节长度,最小值为8byteUDP的检验和可选,其覆盖UDP首部和UDP数据2.3 内核模式驱动程序开发内核模式驱动是Windows系统中两种基本驱动程序之一.设备驱动程序的功能就是Windows操作系统给的一个扩展内核模式驱动程序可执行某些受保护的操作,并可访问用户模式驱动程序无法访问的系统结构但随着访问权的增加,调试难度和系统损害几率也随之增大.本个人防火墙的核心Filter—Hook驱动就是内核模式驱动程序,它利用Microsoft在Windows的网络协议层上提供的接口在系统中实现过滤驱动[[] Zwicky E. D, Cooper S, Chapman D. B. Building the Internet Firewall[M]. 2nd ed.[S. 1]: McGraw-Hill, 2003:90-95.]驱动程序由一系列例程组成,加载驱动或处理I\O请求时就会调用特定的例程每个驱动程序都至少实现三个例程:入口例程(DriverEntry)、卸载例程和打开关闭例程。
驱动编程属于内核编程的范畴,内核开发中会经常的创建、打开和操作内核对象,但内核对象不允许用户直接访问,它是系统提供的用户模式下代码与内核模式下代码进行交互的基本接口[[] 王艳平, 张铮. Windows程序设计[M]. 北京:人民邮电出版社, 2008:9-12.]当驱动被加载到内存中时,DriverEntry例程将被调用DriverEntry例程负责执行驱动程序初始化工作I/O管理器为每个加载到内存的驱动程序创建一个驱动程序对象,并将这个对象指针传递给驱动程序,驱动程序就可以在需要的时候调用这个设备对象卸载例程负责做清理工作,I\O管理器调用这个例程时,将清除当前驱动创建的设备对象和符号链接名称,以释放资源打开关闭例程,当应用程序需要打开或关闭到驱动的句柄时,I\O管理器调用这个例程,以做出相应处理一般接收到关闭请求表明设备对象的文件对象句柄已经被释放.第三章 开发工具与环境简介本章主要介绍本课题的开发环境和所用到的开发工具,平台如题所述,是Windows平台,版本为Windows XP开发工具用到Microsoft Visual Studio 2010,驱动开发工具WDK等,编程语言采用C语言,编程的系统环境为虚拟机下的Windows XP环境。
另外,由于本文涉及驱动编程,为了避免调试过程中驱动程序错误引起的系统错误等不必要的麻烦,本文所述系统的开发将在VMware Workstation虚拟机内的操作系统上完成开发和测试1 Microsoft Visual Studio 2010Microsoft Visual Studio 2010是微软公司于2010年推出的最新的Windows平台应用程序集成开发环境,是一款非常流行的IDEVisual Studio功能强大,可以用以创建Windows应用程序、网络应用程序、网络服务、android应用程序等,里边包含了Visual Studio C++开发工具,可进行C\C++相关程序开发,且引入了MFC库该版本做了重大修改并引入了很多新的特性,如对最新的C++标准的支持等能切实提高开发人员的开发效率2 C语言简介C程序设计语言是由Dennis Ritchie于1973年设计并实现的经历标准制定和多次修订(现在最新标准为C99),发展至今,已成为全球使用者最多的程序设计语言之一同样著名的C++和Java也由它衍生而来C语言是一种通用的程序设计语言,他不受限于操作系统或机器C语言是一种低级语言,适合系统编程.此外,该语言还有高效性、可移植性、功能强大、灵活性、提供标准库等优点[[] (美)K. N. King. C语言程序设计:现代方法[M]. 【译者】吕秀锋. 北京:人民邮电出版社, 2007:2-4.],这也是本文所述系统采用C语言编写的主要原因。
3.3 驱动开发工具本文所要编写的Filter—Hook Driver即为一个Windows内核模式驱动,故需要相应的内核开发工具——WDK.接下来对驱动开发工具和驱动程序的编译执行做简单介绍1 WDK内核编程工具就像应用程序使用开发包SDK一样,内核编程使用“Windows Driver Kit”,简称WDKWDK已经自带所有需要的头文件、库、C/C++语言及汇编语言的编译器与连接器,所以可以在不安装Visual Studio等SDK的环境下编程.WDK的获得可通过微软官方网站下载WDK是Windows内核开发工具,驱动程序属于内核编程而非应用程序编程,故用WDK编译的驱动程序源文件中不能调用Win32 API函数,另外,部分的C Runtime函数也不能使用,编写程序可以参考说明文档,文档中说明的函数都可使用3.2 编译驱动程序源文件编译器在编译驱动内核驱动程序源文件时把中DriverEntry当做每个内核模块的入口点历程(就是一个函数,相当于普通C源文件中的main函数),在加载这个模块时被系统进程System调用一次另外附加说明一点,为了方便驱动被加载后能够被卸载,我们需要在编写程序的时候设置DriverUnload函数指针[[] 谭文, 杨潇等. 寒江独钓Windows内核安全编程[M]. 北京:电子工业出版社, 2009:2-14.].WDK在编译工程的时候,必须在工程目录下增加两个文件,以便WDK可以成功的build.这两个文件分别是make,且文件名必须如此.makefile文件几乎都一样,不用更改,如本文所用的makefile文件内容如下:!INCLUDE $(NTMAKEENV)\make另外一个source文件的内容则关系到这个驱动模块要编译的文件,以及编译出来的.sys文件的名字.如本文总所用source文件内容实例如下:TARGETNAME=DrvFltIpTARGETPATH=objTARGETTYPE=DRIVERSOURCES= DrvFltIp。
c其中TARGETNAME表示编译后得到的文件的名字,如本实例编译后得到的为DrvFltIp.sys;TARGETPATH 表示文件所在路径;TARGETTYPE表示编译的目标类型;SOURCES则为所要编译的c文件(多个文件间用空格分开)这样我们在选择相应的系统版本后打开WDK,进入控制台编译环境后就可以进入文件所在目录进行编译了,编译命令为build,编译后的sys文件保存在文件所在目录下自动生成的文件夹内的子文件夹内.3.3.3 安装运行驱动程序安装驱动程序的工具有很多,本文采用InstDrvexe这个软件使用方法简单,打开软件,找到.sys文件路径,然后点击所需操作即可完成驱动的安装、卸载、开启和停止安装好驱动程序后,就可以通过我们的方式查看它的运行情况3.4 MFC简介本文个人防火墙的用户界面采用MFC实现微软提供的MFC是放置Windows API的面向对象的包装的C++类库.是应用程序编程的框架结构.MFC封装了许多类,其中一些可以直接使用,另一些则主要作为自己的类的基础.在MFC程序中,并不经常直接调用Windows API;而是从MFC类创建对象并调用属于这些对象的成员函数[[] (美)Jeff Prosise. MFC Windows程序设计[M]. 【译者】北京博彦科技发张有限责任公司. 北京:清华大学出版社, 2007:6-30.]。
在类库中定义的成员函数有几百个,其中许多事Windows API的简单封装,有的甚至与相应API同名,这使得MFC程序更加简单易懂.MFC也是一个应用程序的框架结构,其目的是可以让程序员直接在此基础上来建立Windows下的应用程序,使得实现方式相对SDK来实现更加简单.MFC框架定义了程序的轮廓,提供了一套用户接口的标准实现方法,程序员用MFC编写Windows应用程序所需要做的就是通过这些接口把具体应用程序特有的东西填入这个轮廓Microsoft Visual C++中提供了相应的MFC工具来帮助程序员完成应用程序的编写:AppWizard可用来生成初步的框架文件,如代码和资源;资源编辑器用于直观的设计用户接口;ClassWizard用于协助添加代码到框架文件;然后经过编译就可以通过类库来实现应用程序特定的逻辑.第四章 个人防火墙的总体设计本章主要介绍本文windows平台下个人防火墙系统的总体设计、工作流程和功能模块Filter—Hook Driver与IP Filter Driver配合实现的数据包过滤的个人防火墙实际上就是利用自己写的Hook来修改底层函数的入口地址,以达到截取需要过滤的特定数据包并按编写的函数进行过滤来实现个人防火墙的数据包过滤功能[[] 谭丹, 鲜继清. 基于hook的Windows防火墙驱动程序研究与设计[J]. 计算机应用, 2005, 25(7):1530.]。
本个人防火墙系统采用结构化设计的方法来实现系统的总体功能,实现的防火墙界面直观,操作简单.能起到对管控规则内的网络数据访问进行放行,管控规则之外的则进行拦截,并能够修改过滤规则以及查看日志,适合个人用户使用1 防火墙整体结构本文个人防火墙主要分为用户层和驱动层两个模块,其整体结果如图4-1所示:图 4—1 防火墙整体结构用户层界面驱动控制驱动层Filter-Hook Driver接口IP Filter Driver (ipfltdrv.sys)网络数据包41.1 用户层用户层里又包含界面模块和驱动控制模块两个模块:1. 驱动控制模块驱动控制模块主要通过自己编写的控制函数来实现用户层与驱动层之间的数据交流,通过这个模块,实现用户层与底层驱动之间的交互,包括安装服务,打开设备和设备控制.2. 界面模块该模块负责与用户交互用户通过界面模块可以实现对个人防火墙的各项操作,如启动、停止、添加\移除过滤规则等1.2 驱动层如上图4—1所示,驱动层内也分为Filter—Hook Driver和IP Filter Driver两块.驱动层模块是整个防火墙的核心模块1. IP Filter DriverIP Filter Driver是Windows2000,Windows XP系统自带的一个驱动,系统默认情况下并不加载,这个驱动可以实现对数据包的过滤.这个驱动本身提供一个接口,接口是通过回调函数来实现的,接口负责对驱动进行操控。
2. Filter-Hook DriverFilter-Hook Driver就是本文防火墙中自己所写的驱动程序,这就是用来过滤网络封包的内核模式驱动,该驱动程序实现了IP Filter Driver(对应系统中ipfltdrv.sys,上文已述)提供的接口,通过向IP Filter Driver注册回调函数,并实现这个回调函数,在这个回调函数中我们可以根据需要定义自己的规则当IP Filter Driver接受到数据包后,就会调用这个回调函数,然后根据函数中已定义的规则就可以实现对数据包的处理4.2 防火墙系统流程图本文个人防火墙流程图如图4-2所示:图 4-Error! Bookmark not defined. 防火墙工作流程图开始载入Filter-Hook Driver显示过滤结果开始过滤启动防火墙启动驱动服务添加过滤规则是否已载入驱动是否已载入结束NNYY43 防火墙实现的功能本文所诉个人防火墙实现了如下功能:1. 网络数据过滤:这也是防火墙应该实现的主要功能,该功能由本防火墙的过滤钩子驱动(Filter-Hook Driver)和IP过滤驱动来实现,过滤钩子驱动通过向Windows XP系统自带的IP过滤驱动注册它,然后IP过滤驱动使用这个过滤钩子根据过滤钩子驱动的过滤规则对可以对流经计算机的IP数据包、TCP数据包、UDP数据包进行相应处理,以实现对网络数据包的拦截过滤。
2. 自定义过滤规则:添加过滤规则时,可以输入协议类型,源、目端口号,源IP地址、目的IP地址、源、目掩码根据这些用户手动输入的一组信息产生一条规则,启动防火墙后规则生效3. 提供界面显示用户已经设置的所有规则,以方便用户查看和修改4. 日志:防火墙可根据过滤日志生成日志文件一共用户查看5. 提供用户接口实现防火墙的启动、关闭等相关功能.当启动防火墙后,防火墙就开始根据用户定义的规则进行数据过滤,用户也可以根据需要进行添加或修改过滤规则.第五章 个人防火墙的详细设计与实现实现本个人防火墙的关键首先就是实现驱动层的Filter—Hook Driver,其次是驱动控制的实现本章将对个人防火墙的详细实现进行阐述1 驱动层Filter—Hook Driver本防火墙驱动层Filter—Hook Driver属于内核模块,实现后整体结构如下图5—1所示:图 5—1 Filter—Hook Driver整体结构初始化工作请求分发卸载驱动51 初始化Filter—Hook驱动通过入口函数DriverEntry开始运行,DriverEntry也是所有内核模块的入口函数名进入入口函数后的时候需要进行初始化工作,包括创建、初始化设备对象。
创建对象时调用了内核API:IoCreateDevice,其函数原型如下:NTSTATUS IoCreateDevice(IN PDRIVER_OBJECT DriverObject,IN ULONG DeviceExtensionSize,IN PUNICODE_STRING DeviceNameOPTIONAL,IN DEVICE_TYPE DeviceType,IN ULONG DeviceCharacteristics,IN BOOLEAN Exclusive,OUT PDEVICE_OBJECT *DeviceObject);该函数用于创建常规的设备对象,成功时返回STATUS_SUCCESS,失败时返回相应的NTSTATUS错误代码,设备创建成功后,拿到对象句柄device_object设备对象创建成功后,虽然有了设备名称,但该设备只能在内核态可见,而对应用程序不可见,所以需要调用调用内核API:IoCreateSymbolicLink,用以创建符号链接,该链接指向真正的设备名称.函数原型如下: NTSTATUS IoCreateSymbolicLink( IN PUNICODE_STRING SymbolicLinkName, IN PUNICODE_STRING DeviceName )。
5.1.2 请求分发请求分发是驱动的核心部分,负责处理驱动设备接收的各种消息其示意图如下:图 5—1 请求分发示意图请求 驱动设备IRP_MJ_CREATEIRP_MJ_CLOSEIRP_MJ_DEVICE_CONTROLIRP_MJ_CREATE负责请求的生成,IRP_MJ_CLOSE负责请求的关闭请求分发的核心部分是请求的控制,由IRP_MJ_DEVICE_CONTROL负责IRP_MJ_DEVICE_CONTROL又分四种消息(IOCTL码),如图5-3所示:图 5-2 分发请求消息IRP_MJ_DEVICE_CONTROLSTART_IP_HOOKSTOP_IP_HOOKADD_FILTERCLEAR_FilterListADD_FILTER:添加新的过滤规则本文通过定义一个结构体来描述过滤规则,结构体如下:struct filter{ USHORT protocol; //使用的协议 ULONG souceIP //源IPULONG destinationIP; //目的IPULONG souceMASK; //源,掩码ULONG destinationMASK; //目的,掩码USHORT sourcePort; //源端口USHORT destinationPort; //目的端口BOOLEN drop; //是否丢弃}每一个过滤规则就是一个结构体,所有的过滤规则构成了整个过滤规则链表表。
每次接受添加请求时,就往规则链表里加一个结构体Clear_FilterList:删除过滤规则,当接受到该请求时,只需遍历规则链表,释放上面申请的内存即可这样就能清除已添加的过滤规则START_IP_HOOK和STOP_IP_HOOK,当接受这两个请求消息时,就注册过滤函数并开始过滤或注销过滤函数并停止过滤其中这两个消息的处理都实现了IP Filter Driver提供的回调函数(即注册了回调函数)其实现过程如下:1. 首先,需要拿到指向IP Filter Driver驱动的指针,这个驱动必须先安全并执行.本文通过调用IoGetDeviceObjectPointer这个内核API来得到该指针——ipDeviceObject这个函数可以获得设备对象的指针,其原型如下:NTSTATUS IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName,IN ACCESS_MASK DesiredAccess,OUT P *,OUT PDEVICE_OBJECT *DeviceObject); 其中的ObjectName是设备名字。
DesiredAccess是期望访问的权限,实际使用直接填写即可是一个返回参数,即获得这个设备对象的同时会得到的一个文件对象()2. 创建用于设立过滤函数的IRP通过调用IoBuildDeviceIoControlRequest这个内核API进行设定这个API函数主要用来构造一个用于设备I\O请求的IRP包,此包被同步处理,这里我们构造IRP主函数码:IRP_MJ_DEVICE_CONTROL3. 向驱动发送IRP,调用内核API:IoCallDriver,该函数的作用就是向指定对象发送IRP,函数有DeviceObject和Irp两个参数,顾名思义,DeviceObject就是设备对象,Irp就是传入需发送的IRP包4. 实现回调函数.本文定义了一个filterFunction函数实现了对接收到的数据包进行具体处理的方法本文定义了IP包、TCP包和UDP包三个包结构,IP数据包结构体定义如下:typedef struct IPHeader { UCHAR iphVerLen; // 版本号和头长度 UCHAR ipTOS; // 服务类型 USHORT ipLength; // IP数据报长度 USHORT ipID; // 每个数据包的唯一标识 USHORT ipFlags; // 标志 UCHAR ipTTL; // 生存时间 UCHAR ipProtocol; // 协议 USHORT ipChecksum; // 校验和 ULONG ipSource; // 源地址 ULONG ipDestination; // 目的地址 } IPPacket;TCP数据包结构体定义如下:typedef struct _TCPHeader{ USHORT sourcePort; // 源端口号 USHORT destinationPort; // 目的端口号 ULONG sequenceNumber; // 序号 ULONG acknowledgeNumber; // 确认序号 UCHAR dataoffset; // 数据指针 UCHAR flags; // 标志 USHORT windows; // 窗口大小 USHORT checksum; // 校验和 USHORT urgentPointer; // 紧急指针} TCPHeader;UDP数据包结构体定义如下:typedef struct _UDPHeader{ USHORT sourcePort; // 源端口 USHORT destinationPort; // 目的端口 USHORT len; // 总长度 USHORT checksum; // 校验和} UDPHeader;接受到这些数据包后,filterFunction函数就可以对数据包进行解析,然后做出相应处理。
filterFunction函数的流程图如下所示:开始接收到数据包进行包头解析,并与过滤规则列表中的规则进行匹配匹配成功不作处理并放行阻止丢弃结束YN图 5-2 filterFunction函数流程图52 驱动控制模块的实现本文对Filter-Hook驱动的控制是通过编写的控制程序来实现的,驱动控制模块负责用户层对驱动层的交互,向驱动层发送控制信息,实现在用户层对驱动层的控制程序首先进行驱动服务的安装,安装成功后打开驱动设备,然后根据用户操作提供的IOCTL代码对驱动设备进行控制通过该程序,实现了驱动服务的安装,打开驱动设备,整体。