基于Windows平台的个人防火墙设计学士学位论文.docx
《基于Windows平台的个人防火墙设计学士学位论文.docx》由会员分享,可在线阅读,更多相关《基于Windows平台的个人防火墙设计学士学位论文.docx(44页珍藏版)》请在冰点文库上搜索。
基于Windows平台的个人防火墙设计学士学位论文
分类号:
TP311.1UDC:
D10621-408-(2007)5914-0
密级:
公开编号:
2003032050
成都信息工程学院
学位论文
基于Windows平台下的个人防火墙设计
论文作者姓名:
申请学位专业:
网络工程
申请学位类别:
工学学士
指导教师姓名(职称):
论文提交日期:
毕业设计(论文)原创性声明和使用授权说明
原创性声明
本人郑重承诺:
所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:
日 期:
指导教师签名:
日 期:
使用授权说明
本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:
按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:
日 期:
学位论文原创性声明
本人郑重声明:
所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:
日期:
年月日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权 大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:
日期:
年月日
导师签名:
日期:
年月日
基于Windows平台下的个人防火墙设计
摘要
网络安全问题长期威胁着网络终端用户,需要有有效的安全工具解决这个问题,个人防火墙就是其中的一种常用的安全工具。
为了实现个人防火墙软件,选用VC++6.0开发工具。
软件系统主要包括两项工程,一是核心模块设计,即DLL工程,实现了封包截获、管制动作和协议封包的解析任务,主要利用Winsock2SPI技术实现网络封包截获,之后利用控管规则对过往封包进行合法性检查和过滤,方法是首先利用Winsock2SPI技术建立winsock钩子,用它来截获winsock的调用,然后作出相应动作处理,动作处理需通过控管规则的检查后,确定socket连接是否允许通过,其中控管规则由用户层设置;二是用户模块设计,即EXE工程,实现用户界面和负责与DLL模块的通信,提供了3个主要界面,即封包监视、控管规则、控管规则设置。
最后通过测试和应用,基本解决了终端用户的网络连接安全问题。
关键词:
过滤;动态连接库;Winsock2SPI;网络封包;协议封包
TheDesignofthePersonalFirewallBasedonWindows
Abstract
Theterminalusersofnetworkarealwaysthreatenbytheproblemsofsecurityofnetwork,soweneedaeffectivetooltosolvethisproblem.Thepersonalfirewallisoneofthecommontoolsofsecurity.VC++isselectedtoimplementthepersonalfirewall.Thesystemhastwoprojectsmainly.OneoftheprojectsisthedesignofcoremodulewhichcanbecalledtheprojectofDLL.Thisprojectimplementsbehaviorsofmanagementandtheanalysisofpacketsofprotocols.ThetechnologyofWinsock2SPIisusedtocaptureofpakcetsofnetwork.Afterthat,thenthecheckingandfilteringofthepacketsaredoneusingtherulesofcontrolandmanagement.Atthebeginning,thecontrolrulesbuilduptheHookofwinsockwhichisusedtocapturethetranferofwinsock,andthenitimplementsrelativebehaviors.Thelinkofsocketwillbeornotgetthroughcheckingbytherulesofcontrolandmanagement.Therulesofcontrolandmanagementaresetbythelayerofuser.Then,weshoulddesignthemoduleofuserwhichcanbecalledtheprojectofexe.ItimplementstheinterfaceofuserandthemoduleofcommunicationwithDLL.Itprovidesthreemaininterfaces,theyarethewatchingoffilteringpacket,therulesofcontrolandmanagementandthesettingofrulesofcontrolandmanagement.Finally,ithassolvedtherequirementofsecurityofterminalusersafterthefinaltestingandapplication.
Keywords:
Filter;DLL;Winsock2SPI;Networkpackets;Protocolpackets
论文总页数:
25页
1引言
1.1课题背景与意义
目前,随着网络向各个领域的扩展,网络安全的重要性日益被人们所认知。
ISP提供商担心网络被攻击,因为这种事情发生太频繁;使用网上交易的用户担心帐户密码被盗,因为窃取密码的工具比比皆是;软件公司担心源代码泄露,就连微软也没逃脱厄运。
种种现象都表明网络安全越来越重要,这种事情随时都可能发生在我们自己身上。
这也正是网络安全快速发展的原因。
所以防火墙和防病毒软件格外的重要,也被现在的人们强烈的需要。
1.2设计实现的主体功能
现在防火墙的花样与种类繁多,让人眼花缭乱。
但是防火墙的主要功能是防止外部网络的攻击以达到保护主机的目的。
我认为哪些未知的网络IP可能对主机产生攻击可能我们都不知道。
只要试验过才知道。
所以现在防火墙一般与防病毒软件配合使用。
这样才能安全的保护主机。
实现的主要的核心功能如下定义:
1.根据应用程序访问规则可对应用程序连网动作进行过滤;
2.对应用程序访问规则具有自学习功能;
3.可实时监控、监视网络活动。
1.3本课题的研究方法
本课题由两大模块构成,分别为DLL模块和EXE模块。
首先利用Winsock2SPI技术建立winsock钩子用来截获winsock调用从而拦截TCP/IP封包,并做相应处理。
然后设置控管规则访问控制,通过控管规则的检查认证,确定socket连接是否允许通过。
最后是TCP/IP的封包分析,利用TIP/IP的封包结构分析截获的数据,提取需要的数据。
这些封装在DLL里面。
EXE模块主要是用户页面的制作。
这里介绍与DLL通信的地方。
EXE中与DLL直接通信的小模块主要有两个。
一个是完成应用程序初始化的类CPropertyApp,它继承自CWinApp,是EXE的入口,其实里面封装了WinMain函数;另一个是主窗口模块CMainFrame,这个主窗口并不是EXE显示出来的那个属性页窗口,而是一个隐藏的窗口,它继承自CMrameWnd,是一个无模式窗口,他隐藏显示,充当接受机,用来接受DLL及其他模块发送过来的消息,然后对消息进行相应的处理。
每一个连网的程序连网之前都会建立一个Socket连接。
这时钩子程序就会起作用,把截获的底层服务进行“过滤”。
及先调用自定义的函数再转给下层服务提供者函数。
我就是在这一层实现封包过滤的。
把规则与功能写到这一层。
这一层的实现是本课题的核心。
2Winsock2SPI编程技术
Winsock2是WindowsSockets的2.0版本,在此之前的版本是1.1。
与1.1版本相比,2.0版本引入了一种新的叫做SPI的编程接口。
利用这种技术可以在Socket中插入一曾层,从而可以完成诸如扩展TCP/IP协议栈,网络安全控制等功能,所以这是一个非常强大而且有用的接口,下面介绍这种编程技术。
2.1Winsock2SPI基础
Winsock是为上层应用程序提供的一种标准网络接口,上层应用程序不用关心Winsock实现的细节,它为上层应用程序提供透明的服务。
Winsock2引入的一个新的功能就是打破服务提供者的透明,让开发者可以编写自己的服务提供者接口程序,即SPI程序。
SPI以动态链接库的形式存在,它工作在应用层,为上层API调用接口函数。
Winsock2是一个接口,不是一个协议。
作为接口,它只能发现和利用底层传输协议完成通信。
自己编写的SPI程序安装到系统之后,所有的Winsock请求都会发送到这个程序并由它完成网络调用。
由于系统提供的SPI已经可以完成网络传输功能,所以自己编写的SPI没有必要重新编写这部分功能。
一般可以直接调用系统函数完成网络传输,这样工作的效果就是“钩子程序。
Winsock2SPI除了有完成网络传输的传输服务提供者,还有提供友好名称服务的名字空间服务提供者。
传输服务提供者能够提供建立通信、传输数据、流量控制和错误控制等服务。
名字空间服务提供者把一个网络协议的地址属性和一个或多个用户友好名称关联起来,这样可以起用与协议无关的名字解析方案。
2.2传输服务提供者
传输服务提供者又分为基础服务提供者和分层服务提供者。
基础服务提供者和分层服务提供者都开放相同的SPI接口,所不同的是基础服务提供者位于提供者的最底层。
所以编写基础服务提供者和分层服务提供者基本相同。
但安装是却需要将基础服务提供者安装在服务提供者加载顺序链的最底端,而分层服务提供者则根据需要分布在顺序链的中间。
3开发平台与开发工具
开发平台如题说明,以Windows平台为主,重点讨论开发工具的选择。
根据不同的工程选择不同的开发工具,可以有效地提高工作效率。
不同的开发工具各有各的优点同时又各有各的不足,在开发中要扬长避短。
目前常用的Windows开发工具有VS5.0/6.0、VS.net(包括VB、BC、VFP、VJ、C#等一组开发工具)、delphi、C++Builder,JBuilder、PB等。
在这些开发工具里面,VFP和PB一般用来专门开发数据库系统,它们具有灵活的数据库接口。
VB和Delphi既可以方便地做出复杂的数据库管理系统,又能轻松地完成操作系统级的任务。
最优秀的是很容易做出漂亮的界面。
VC和BorlandC++着重于系统编程,它们开放接口较多,也最为灵活,而且编译出的程序体积较小,所以比较适合做系统工具类软件。
缺点是短时间不容易掌握。
其中Borland使用的VCL类库是为Delphi准备的,并不是真正用C++实现的。
VJ、Jbuilder和Java语言主要面向互联网应用。
最大的优势是跨平台。
本课题为防火墙软件,较多的使用系统接口,而且界面简单。
另外,防火墙主要传播渠道是互联网,这就要求体积应尽量的小,安装尽量方便。
所以选择VC为开发工具。
4系统设计与模块划分
4.1本课题要实现的具体功能
本设计实现的具体功能如下:
1.封包监视
(1)提供封包监视页面。
(2)提供清空监视列表,停止/开始监视及停止/开始滚动功能。
2.控管规则设置
(1)手工添加,删除及修改控管规则。
(2)自学习添加控管规则。
(3)控管规则中目的网络IP地址段的设置。
(4)提供控管规则设置页面。
3.封包过滤
(1)DLL给出设置工作模式和设置控管规则的接口函数。
工作模式分为3种形式:
放行所有,拒绝所有和过滤。
(2)DLL根据工作模式和控管规则对过往封包进行过滤。
(3)DLL将通过的网络封包通知EXE取走。
4.2程序工作流程图
Winsock2SPI是一个DLL程序,它工作在API和DRIVER之间,为上层应用程序提供服务。
EXE与DLL构成软件的主题,也是编写软件的主要工作。
流程图如图1所示。
模块1.1用户界面接口
图1防火墙工作流程图
4.3模块划分
4.3.1模块划分原则
模块划分是系统分析中非常重要的一部分,下面是模块划分时的基本原则。
1.独立性:
让模块直接内的关系减到最少。
理想的状态就是模块之间没有关系,但这种情况不符合现实。
既然是同一个工程,模块之间自然都会存在一定的联系,只要想办法让模块之间的关系尽量简单就可以了。
2.接口简单化:
让模块之间的接口尽量单纯、简单、易用。
即让公用函数和公用变量尽量地少。
3.分层处理:
吸取Windows操作系统对模块做分层处理的经验。
建立一些中间模块,让两端的模块来完成相互调用的透明化。
4.容易合并:
容易将划分的模块进行合并。
例如将一个工程的各个功能模块分别设计成可执行文件,然后用一个总模块将这些模块关联起来组成一个工程。
这种情况下,对模块独立性要求较高,模块之间几乎没有任何关系。
5.可测试性:
尽量使每个模块都可以单独进行测试[2]。
上面的5条是参考原则,既然是参考原则就不会完全执行,完全按照一个教条去执行真的很困难。
只要在做模块划分的时候能经常记起这些原则,然后稍加注意就OK了。
另外,在这5条原则中,第一条是根本,能把这一条做好,下面的一些就容易实现了。
在做模块划分时一定要始终贯穿独立性的思想。
4.3.2模块结构
根据4.1节的功能定义和4.2节的工作流程图,需要对模块做进一步细化,得出更详细的模块结构。
这些模块结构是编程的蓝本,在编写代码的过程中,就要以这些结构为指导。
1.模块1.1:
用户界面,4.5节详细说明。
2.模块1.2:
EXE的安装模块,。
建立CXInstall类,C++源文件Install.h和Install.cpp。
安装函数InstallProvider和卸载函数RemoveProvider
3.模块1.3:
EXE读写控管规则模块,建立CAclFile类,C++源文件File.h和File.cpp。
读控管规则文件ReadAcl,保存控管规则文件SaveAcl,增加一条控管规则AddAcl和删除一条控管规则DelAcl。
4.模块1.4:
EXE设置DLL的控管规则模块,设置控管规则单独的函数,调用模块1.3读写控管规则模块得到控管规则数据,调用DLL的函数FloControl设置DLL的控管规则。
5.模块1.5:
EXE设置DLL的工作模式,设置工作模式单独的函数,调用模块1.3读写控管规则模块得到控管规则数据,调用DLL的函数FloControl设置DLL的工作模式。
6.模块2.1:
DLL封包过滤模块,有分为3块,2.1.1一组Winsock2SPI钩子函数C++源文件TcpipDog.h和TcpipDog.cpp;模块2.1.2根据控管规则判断是否可以通行的类CCheckAcl,C++源文件CheckAcl.h和CheckAcl.cpp;模块2.1.3对网络数据包进行分析的类CProtocolInfo,C++源文件ProtocolInfo.h和ProtocolInfo.cpp。
●模块2.1.1:
服务提供者函数模块,入口函数WSPSartup,发送询问消息到EXE,由EXE提供询问界面函数QueryAccess。
截获的8个服务提供者函数。
设置工作模式、控管规则等设备工作接口函数FloControl。
●模块2.1.2:
访问控管模块,通过检查工作模式和控管规则得到是否放行的函数GerAccessInfo。
●模块2.1.3:
协议解析模块,得到协议信息处理函数GetProtocolInfo
7.模块2.2:
DLL更改控管规则模块,设置DLL控管规则数据SetAcl,设置控管规则m_Aclfile,设置工作模式m_iWorkMode。
8.模块2.3:
DLL更改工作模式模块,设置DLL工作模式函数SetWorkMode。
4.3.3模块接口定义
模块之间接口有3种方式:
1.函数接口
函数接口是最常用而且独立性和封装性最好的接口方式。
函数之间通过参数传递进行模块之间的通信,处理过程保持相互独立,函数处理完成把处理结果返回到调用模块。
如果每个函数都有单独的接口,那么,函数多了,接口也就多了,也就越来越复杂了。
C++利用类的饿概念解决这个问题。
类可以将一组函数和变量封装起来,这样就将许许多多的函数转化成一个对象的形式。
外部模块使用这个类的实例来引用封装在里面的成员函数个变量。
把功能相似、相关的函数分成一组,然后封装在一起,使接口间的关系清晰了很多。
类的成员函数和成员变量有公有和私有之分。
对于公有函数和变量,外部模块可以直接调用;对于私有函数和变量,外部模块则不能直接调用。
利用这种特性,可以把一些只在类里面使用的函数定义为私有函数;把外部模块需要直接调用的函数定义为公有函数。
类似于DLL的导出函数(Export),这样,模块之间的直接接触就会进一步减小,独立性更进一步增加。
2.全局变量接口
全局变量接口是一种不提倡的方式。
虽然它使用起来确实很过瘾。
全局变量多了非常容易出问题。
任何地方都可能会对全局变量进行赋值,变量的可控性大大降低,不知道什么时候变量的值就被莫名其妙地改掉了。
当然,只要不被那些模块执行的先后顺序和循环语句弄昏头,还是可以使用全局变量的。
虽然不提倡使用,但是有些地方使用全局变量与是不可避免的,而且有时候可以减少很多麻烦。
使用全局变量的时候需要注意一点,读取变量的多少和位置对程序稳定性的影响并不很大,关键是尽量让赋值的地方单一,改变变量的次数和位置应尽量得到控制。
3.Windows消息接口
Windows消息接口是一种特殊的接口形式,它是基于Windows操作系统的消息机制。
这种接口形式适合于应用程序之间。
应用程序是相对独立的模块,如果这两个模块需要通信,则消息接口就是一种理想型的选择。
这种接口类似于函数接口,只不过通过操作系统的消息机制来中转一下。
Windows消息接口也是一种接口方式,特别是DLL和EXE之间经常用到。
在DLL与EXE之间通信使用消息是一种优势,多个应用程序虽然调用同一个DLL,但是它们都拥有独立的模块副本。
这时候如果这些模块副本都需要让同一个应用程序做一件事时,就不好处理,因为DLL的重要性和应用程序保护机制导致这些模块副本无法直接调用同一个应用程序的执行模块。
这时候就可以通过消息的方式来解决。
发送消息是基于窗口句柄的,只要得到这个窗口句柄,不同的DLL副本都向同一个窗口句柄发送消息,自然所有的消息都可以被同一个应用程序接收。
以上3种接口方式以函数接口为优先进行考虑,以增强模块的独立性和可读性。
4.4控管规则文件结构设计
控管规则文件用来存储控管规则数据,命名为acl.cfg;该数据文件为二进制文件。
4.4.1控管规则文件需要存储的内容
控管规则文件需要存储的内容如下:
(1)系统设置
(2)控管设置
(3)控管规则附加数据,授权访问的远端网络IP地址记录
1.控管规则记录结构
控管规则记录结构说明
(1)规则编号字段是控管规则的唯一性编号。
保留字段,没有使用。
(2)应用程序名称及路径字段用来保持应用程序的名称和路径。
(3)远端网络类型,数值的含义如下。
0:
表示所有网络
1:
局域网
2:
约束的网络(自定义)
3:
信任的网络(自定义)
4:
自定义的网络(自定义)
(4)管制动作,数值的含义如下。
0:
放行
1:
拒绝
(5)进出方向,数值的含义如下。
0:
出
1:
入
2:
双向
(6)服务类型,数值的含义如下。
0:
全部
1:
TCP(端口为任意,可编辑)
2:
UDP(端口为任意,可编辑)
3:
FTP(端口为21,不可编辑)
4:
TELNET(端口为23,不可编辑)
5:
HTTP(端口为任意,可编辑)
6:
NNTP(端口为119,不可编辑)
7:
POP3(端口为110,不可编辑)
8:
SMTP(端口为25,不可编辑)
(7)服务端口,数值的含义如下。
0:
表示全部
其他值:
表示端口值
2.授权访问的远端IP地址记录结构
授权访问的远端网络IP地址结构如表1所示。
表1授权访问的远端网络IP地址段记录结构
字段
类型
长度
开始IP
无符号长整型
4
结束IP
无符号长整型
4
4.4.2控管规则文件结构
根据需要存储的内容将控管规则文件划分为3段。
文件头用来存储系统设置,IP地址范围记录和控管规则记录的地址偏移量及其他信息;IP地址范围记录存储区用来存储IP地址范围记录;控管规则记录存储区用来存储控管规则记录。
1.控管规则结构
控管规则结构如表2所示。
表2控管规则记录结构表
0
8
16
24
32
40
48
56
控管规则编号
应用程序路径和名称
远端网络
动作
方向
服务类型
端口
2.IP地址结构
IP地址段记录结构如表3所示。
表3IP地址段记录结构表
0
8
16
24
32
40
48
56
开始IP地址
结束IP地址
…
…
开始IP地址
结束IP地址
4.5界面设计
4.5.1制定界面风格
界面上反映的功能有:
封包监视、控管规则设置。
这是两个平行的功能,所以选用Windows的属性页。
4.5.2界面设计文档
界面设计如下所示。
1.封包监视界面
封包监视界面用来显示截获的网络封包。
每个网络封包的具体内容根据实际需要而定。
如图2。
图2封包监视界面
封包的字段有:
(1)应用程序路径和名称
(2)管制动作(放行或拒绝)
(3)访问起始/结束时间
(4)使用网络协议
(5)进/出流量
(6