




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
江苏大学学士学位论文第一章第一章引言引言.11.1课题背景与意义.11.2设计实现的主体功能.11.3本课题的研究方法.2第二章第二章WINSOCKWINSOCK22SPISPI编程技术编程技术.42.1WINSOCK2SPI基础.42.2传输服务提供者.4第三章第三章开发平台与开发工具开发平台与开发工具.5第四章第四章系统设计与模块划分系统设计与模块划分.64.1本课题要实现的具体功能.64.2程序工作流程图.64.3模块划分.74.3.1模块划分原则.74.3.2模块结构.84.3.3模块接口定义.94.4编码规则.104.5控管规则文件结构设计.104.5.1控管规则文件需要存储的内容.114.5.2控管规则文件结构.124.6界面设计.134.6.1制定界面风格.134.6.2界面设计文档.13第五章第五章核心功能的代码实现核心功能的代码实现.175.1DLL的封包截获.175.2DLL的访问控管.205.2.1对服务提供者函数做管制的函数.205.2.2封包处理函数.215.2.3管制函数.225.2.4设置函数.25第六章第六章测试测试.26结结论论.28参考文献参考文献.29致致谢谢.301第一章引言1.1课题背景与意义Internet的出现及迅速发展给现代人们的生产和生活都带来了前所未有的飞跃。互连网已经成为扩展个人和企业发展的重要工具,人们已经进入了信息时代.互连网将整个人类社会缩小成了一个村落“地球村”,促进了信息的交流,提高了人们的工作效率,丰富了人们的生活。人们享受着信息时代带来的种种便利,体验着互联网带来的生活上的全新感受。但凡事有利必有一弊,随着对网络的依赖越来越大,网络安全问题也越来越明显。由于黑客攻击和信息泄露并不是直接对系统造成损害,所以往往不能引起人们的注意。人们总是在网络安全问题发生带来严重后果后,才意识到网络安全的重要.随着网络的进一步普及,网络安全产品逐渐地进入人们的视野,而防火墙作为把守用户安全大门的重要工具,越来越受到人们的重视。自从1986年美国Digital公司在Internet上安装了全球第一个商用防火墙系统,提出了防火墙概念后,防火墙技术得到了飞速的发展。国内外已有数家公司推出了功能各不相同的防火墙产品系列。目前的防火墙产品主要有堡垒主机、包过滤路由器、应用层网关(代理服务器)以及电路层网关、屏蔽主机防火墙、双宿主机等类型。作为内部网络与外部公共网络之间的第一道屏障防火墙是最先受到人们重视的网络安全产品之一。虽然从理论上看防火墙处于网络安全的底层负责网络间的安全认证与传输但随着网络安全技术的整体发展和网络应用的不断变化现代防火墙技术已经逐步走向网络层之外的其他安全层次不仅要完成传统防火墙的过滤任务同时还能为各种网络应用提供相应的安全服务。另外还有多种防火墙产品正朝着数据安全与用户认证、防止病毒与黑客侵入等方向发展。虽然防火墙是目前保护网络免遭黑客袭击的有效手段,但也有明显不足:无法防范通过防火墙以外的其它途径的攻击,不能防止来自内部变节者和不经心的用户们带来的威胁,也不能完全防止传送已感染病毒的软件或文件,以及无法防范数据驱动型的攻击。2目前市场上大多数的防火墙产品仅仅是网关型的,虽然它们的功能相当强大,但由于它们基于下述的假设:内部网是安全可靠的,所有的威胁都来自网外。因此,他们防外不防内,难以实现对企业内部局域网内主机之间的安全通信,也不能很好的解决每一个拨号用户所在主机的安全问题,而大多数个人上网之时,并没有置身于得到防护的安全网络内部。个人上网用户多使用Windows操作系统,而Windows操作系统本身的安全性就不高。各种Windows漏洞不断被公布,对主机的攻击也越来越多。一般都是利用操作系统设计的安全漏洞和通信协议的安全漏洞来实现攻击。如假冒IP包对通信双方进行欺骗;对主机大量发送IP数据包进行轰炸攻击,使之崩溃;以及蓝屏攻击等。因此,为了保护主机的安全通信,研究有效的个人防火墙技术很有必要。1.2设计实现的主体功能现在防火墙的花样与种类繁多,让人眼花缭乱。但是防火墙的主要功能是防止外部网络的攻击以达到保护主机的目的。我认为哪些未知的网络IP可能对主机产生攻击可能我们都不知道。只要试验过才知道。所以现在防火墙一般与防病毒软件配合使用。这样才能安全的保护主机。1实现的主要的核心功能如下定义:1.根据应用程序访问规则可对应用程序连网动作进行过滤;2.对应用程序访问规则具有自学习功能;3.可实时监控、监视网络活动。1.3本课题的研究方法本课题由两大模块构成,分别为DLL模块和模块。首先利用Winsock2SPI技术建立winsock钩子用来截获winsock调用从而拦截TCPIP封包,并做相应处理。然后设置控管规则访问控制,通过控管规则的检查认证,确定socket连接是否允许通过。最后是TCPIP的封包分析,利用TIPIP的封包结构分析截获的数据,提取需要的数据。这些封装在DLL里面。模块主要是用户页面的制作。这里介绍与DLL通信的地方。中与DLL直接通信的小模块主要有两个。一个是完成应用程序初始化的类3CPropertyApp它继承自CWinApp,是的入口,其实里面封装了WinMain函数;另一个是主窗口模块CMainFrame,这个主窗口并不是显示出来的那个属性页窗口,而是一个隐藏的窗口,它继承自CMrameWnd,是一个无模式窗口,他隐藏显示,充当接受机,用来接受DLL及其他模块发送过来的消息,然后对消息进行相应的处理。2每一个连网的程序连网之前都会建立一个Socket连接。这时钩子程序就会起作用,把截获的底层服务进行“过滤”。及先调用自定义的函数再转给下层服务提供者函数。我就是在这一层实现封包过滤的。把规则与功能写到这一层。这一层的实现是本课题的核心。34第二章WINSOCK2SPI编程技术Winsock2是WindowsSockets的2.0版本,在此之前的版本是1.1。与1.1版本相比,2.0版本引入了一种新的叫做SPI的编程接口。利用这种技术可以在Socket中插入一曾层,从而可以完成诸如扩展TCPIP协议栈,网络安全控制等功能,所以这是一个非常强大而且有用的接口,下面介绍这种编程技术。42.1Winsock2SPI基础Winsock是为上层应用程序提供的一种标准网络接口,上层应用程序不用关心Winsock实现的细节,它为上层应用程序提供透明的服务。Winsock2引入的一个新的功能就是打破服务提供者的透明,让开发者可以编写自己的服务提供者接口程序,即SPI程序。SPI以动态链接库的形式存在,它工作在应用层,为上层API调用接口函数。Winsock2是一个接口,不是一个协议。作为接口,它只能发现和利用底层传输协议完成通信。5自己编写的SPI程序安装到系统之后,所有的Winsock请求都会发送到这个程序并由它完成网络调用。由于系统提供的SPI已经可以完成网络传输功能,所以自己编写的SPI没有必要重新编写这部分功能。一般可以直接调用系统函数完成网络传输,这样工作的效果就是“钩子程序”。Winsock2SPI除了有完成网络传输的传输服务提供者,还有提供友好名称服务的名字空间服务提供者。传输服务提供者能够提供建立通信、传输数据、流量控制和错误控制等服务。名字空间服务提供者把一个网络协议的地址属性和一个或多个用户友好名称关联起来,这样可以起用与协议无关的名字解析方案。62.2传输服务提供者传输服务提供者又分为基础服务提供者和分层服务提供者。基础服务提供者和分层服务提供者都开放相同的SPI接口,所不同的是基础服务提供者位于提供者的最底层。所以编写基础服务提供者和分层服务提供者基本相同。但安装是却需要将基础服务提供者安装在服务提供者加载顺序链的最底端,而分层服务提供者则根据需要分布在顺序链的中间。5第三章开发平台与开发工具开发平台如题说明,以Windows平台为主,重点讨论开发工具的选择。根据不同的工程选择不同的开发工具,可以有效地提高工作效率。不同的开发工具各有各的优点同时又各有各的不足,在开发中要扬长避短。目前常用的Windows开发工具有VS5.06.0、VS.net(包括VB、BC、VFP、VJ、C#等一组开发工具)、delphi、C+BuilderJBuilder、PB等。在这些开发工具里面,VFP和PB一般用来专门开发数据库系统,它们具有灵活的数据库接口。VB和Delphi既可以方便地做出复杂的数据库管理系统,又能轻松地完成操作系统级的任务。最优秀的是很容易做出漂亮的界面。VC和BorlandC+着重于系统编程,它们开放接口较多,也最为灵活,而且编译出的程序体积较小,所以比较适合做系统工具类软件。缺点是短时间不容易掌握。其中Borland使用的VCL类库是为Delphi准备的,并不是真正用C+实现的。7VJ、Jbuilder和Java语言主要面向互联网应用。最大的优势是跨平台。本课题为防火墙软件,较多的使用系统接口,而且界面简单。另外,防火墙主要传播渠道是互联网,这就要求体积应尽量的小,安装尽量方便。所以选择VC为开发工具。6第四章系统设计与模块划分4.1本课题要实现的具体功能本设计实现的具体功能如下:1.封包监视(1)提供封包监视页面。(2)提供清空监视列表,停止开始监视及停止开始滚动功能。2.控管规则设置(1)手工添加,删除及修改控管规则。(2)自学习添加控管规则。(3)控管规则中目的网络IP地址段的设置。(4)提供控管规则设置页面。3.封包过滤(1)DLL给出设置工作模式和设置控管规则的接口函数。工作模式分为3种形式:放行所有,拒绝所有和过滤。(2)DLL根据工作模式和控管规则对过往封包进行过滤。(3)DLL将通过的网络封包通知取走。64.2程序工作流程图Winsock2SPI是一个DLL程序,它工作在API和DRIVER之间,为上层应用程序提供服务。与DLL构成软件的主题,也是编写软件的主要工作。流程图如图4.1所示。97模块1.1.1控管规则输入界面接口模块1.1.2封包监视界面接口模块1.3读写控管规则模块1.4设置控管规则模块1.5设置工作模式控管规则文件(.cfg)模块2.2控管规则模块2.3工作模式用户界面()模块1.2安装Winsock2SPI(DLL)模块2.1封包过滤模块1.1用户界面接口图4.1防火墙工作流程图4.3模块划分4.3.1模块划分原则模块划分是系统分析中非常重要的一部分,下面是模块划分时的基本原则。1.独立性:让模块直接内的关系减到最少。理想的状态就是模块之间没有关系,但这种情况不符合现实。既然是同一个工程,模块之间自然都会存在一定的联系,只要想办法让模块之间的关系尽量简单就可以了。2.接口简单化:让模块之间的接口尽量单纯、简单、易用。即让公用函数和公用变量尽量地少。3.分层处理:吸取Windows操作系统对模块做分层处理的经验。建立一些中间模块,让两端的模块来完成相互调用的透明化。4.容易合并:容易将划分的模块进行合并。例如将一个工程的各个功能模块分别设计成可执行文件,然后用一个总模块将这些模块关联起来组成一个工程。这种情况下,对模块独立性要求较高,模块之间几乎没有任何关系。5.可测试性:尽量使每个模块都可以单独进行测试10。上面的5条是参考原则,既然是参考原则就不会完全执行,完全按照一个教条去执行真的很困难。只要在做模块划分的时候能经常记起这些原则,然后稍加注意就OK了。另外,在这5条原则中,第一条是根本,能把这一条做好,8下面的一些就容易实现了。在做模块划分时一定要始终贯穿独立性的思想。.2模块结构根据4.1节的功能定义和4.2节的工作流程图,需要对模块做进一步细化,得出更详细的模块结构。这些模块结构是编程的蓝本,在编写代码的过程中,就要以这些结构为指导。111.模块1.1:用户界面,4.5节详细说明。2.模块1.2:的安装模块,。建立CXInstall类,C+源文件Install.h和Install.cpp。安装函数InstallProvider和卸载函数RemoveProvider3.模块1.3:读写控管规则模块,建立CAclFile类,C+源文件File.h和File.cpp。读控管规则文件ReadAcl,保存控管规则文件SaveAcl,增加一条控管规则AddAcl和删除一条控管规则DelAcl。4.模块1.4:设置DLL的控管规则模块,设置控管规则单独的函数,调用模块1.3读写控管规则模块得到控管规则数据,调用DLL的函数FloControl设置DLL的控管规则。5.模块1.5:设置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,发送询问消息到,由提供询问界面函数QueryAccess。截获的8个服务提供者函数。设置工作模式、控管规则等设备工作接口函数FloControl。模块2.1.2:访问控管模块,通过检查工作模式和控管规则得到是否放行的函数GerAccessInfo。模块2.1.3:协议解析模块,得到协议信息处理函数GetProtocolInfo97.模块2.2:DLL更改控管规则模块,设置DLL控管规则数据SetAcl,设置控管规则m_Aclfile设置工作模式m_iWorkMode。8.模块2.3:DLL更改工作模式模块,设置DLL工作模式函数SetWorkMode。.3模块接口定义模块之间接口有3种方式:1.函数接口函数接口是最常用而且独立性和封装性最好的接口方式。函数之间通过参数传递进行模块之间的通信,处理过程保持相互独立,函数处理完成把处理结果返回到调用模块。如果每个函数都有单独的接口,那么,函数多了,接口也就多了,也就越来越复杂了。C+利用类的饿概念解决这个问题。类可以将一组函数和变量封装起来,这样就将许许多多的函数转化成一个对象的形式。外部模块使用这个类的实例来引用封装在里面的成员函数个变量。把功能相似、相关的函数分成一组,然后封装在一起,使接口间的关系清晰了很多。类的成员函数和成员变量有公有和私有之分。对于公有函数和变量,外部模块可以直接调用;对于私有函数和变量,外部模块则不能直接调用。利用这种特性,可以把一些只在类里面使用的函数定义为私有函数;把外部模块需要直接调用的函数定义为公有函数。类似于DLL的导出函数(Export),这样,模块之间的直接接触就会进一步减小,独立性更进一步增加。2.全局变量接口全局变量接口是一种不提倡的方式。虽然它使用起来确实很过瘾。全局变量多了非常容易出问题。任何地方都可能会对全局变量进行赋值,变量的可控性大大降低,不知道什么时候变量的值就被莫名其妙地改掉了。当然,只要不被那些模块执行的先后顺序和循环语句弄昏头,还是可以使用全局变量的。虽然不提倡使用,但是有些地方使用全局变量与是不可避免的,而且有时候可以减少很多麻烦。使用全局变量的时候需要注意一点,读取变量的多少和位置对程序稳定性的影响并不很大,关键是尽量让赋值的地方单一,改变变量的次数和位置应尽量得到控制。3.Windows消息接口10Windows消息接口是一种特殊的接口形式,它是基于Windows操作系统的消息机制。这种接口形式适合于应用程序之间。应用程序是相对独立的模块,如果这两个模块需要通信,则消息接口就是一种理想型的选择。这种接口类似于函数接口,只不过通过操作系统的消息机制来中转一下。Windows消息接口也是一种接口方式,特别是DLL和之间经常用到。在DLL与之间通信使用消息是一种优势,多个应用程序虽然调用同一个DLL,但是它们都拥有独立的模块副本。这时候如果这些模块副本都需要让同一个应用程序做一件事时,就不好处理,因为DLL的重要性和应用程序保护机制导致这些模块副本无法直接调用同一个应用程序的执行模块。这时候就可以通过消息的方式来解决。发送消息是基于窗口句柄的,只要得到这个窗口句柄,不同的DLL副本都向同一个窗口句柄发送消息,自然所有的消息都可以被同一个应用程序接收。以上3种接口方式以函数接口为优先进行考虑,以增强模块的独立性和可读性。4.4编码规则变量命名规则如下:变量采用代表中文意思的英文单词或单词组合。变量一般不用缩写,用英文单词全称。较长的更为习惯的缩写。自定义全局变量用m_开头。自定义过程变量不用m_开头。变量的前缀用变量类型的第一个字母标志变量类型。如,指针类型在前面多加一个字母P。如果是对象,前缀用对象的名称,第一个字母大写。变量中有多个单词时,单词的第一个字母大写,其余用小写。有了自己的编码规则后,不会出现自己的弄不清楚自己定义的函数之类的是什么意思。不知道函数是干什么的。以至于思维混乱。4.5控管规则文件结构设计控管规则文件用来存储控管规则数据,命名为acl.cfg;该数据文件为二进制文件。114.5.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,不可编辑)127:POP3(端口为110,不可编辑)8:SMTP(端口为25,不可编辑)(7)服务端口,数值的含义如下。0:表示全部其他值:表示端口值2.授权访问的远端IP地址记录结构授权访问的远端网络IP地址结构如表4.1所示。表4.1授权访问的远端网络IP地址段记录结构字段类型长度开始IP无符号长整型4结束IP无符号长整型44.5.2控管规则文件结构根据需要存储的内容将控管规则文件划分为3段。文件头用来存储系统设置,IP地址范围记录和控管规则记录的地址偏移量及其他信息;IP地址范围记录存储区用来存储IP地址范围记录;控管规则记录存储区用来存储控管规则记录。1.控管规则结构控管规则结构如表4.2所示。表4.2控管规则记录结构表08162432404856控管规则编号应用程序路径和名称远端网络动作方向服务类型端口2.IP地址结构IP地址段记录结构如表4.3所示。表4.3IP地址段记录结构表08162432404856开始IP地址结束IP地址开始IP地址结束IP地址4.6界面设计4.6.1制定界面风格界面上反映的功能有:封包监视、控管规则设置。这是两个平行的功能,13所以选用Windows的属性页。4.6.2界面设计文档界面设计如下所示。1.封包监视界面封包监视界面用来显示截获的网络封包。每个网络封包的具体内容根据实际需要而定。如图4.2。图4.2封包监视界面封包的字段有:(1)应用程序路径和名称(2)管制动作(放行或拒绝)(3)访问起始结束时间(4)使用网络协议(5)进出流量(6)本地和远端IP地址端口(7)备注信息封包监视界面实时接收DLL发送过来的网络封包并立刻显示。14在封包监视界面上设计了几个附加按钮。“停止开始滚动”用来设置监视列表是否自动滚动;“开始停止监视”用来设置是否实时监视;“清除”按钮用来清除当前列表。这些功能按钮方面操作。2.控管规则界面控管规则界面用来显示和设置控管规则(如图4.3)。需要说明的是,应用程序设置的优先级高于控管规则设置,只是在应用程序设置为询问时,下面的控管规则设置才有效。图4.3控管规则界面控管规则的设计目的是为了制订对网络访问的控制,所以控管规则的字段可以决定防火墙防范的严密性和灵活程度。控管规则的记录结构为:应用程序远端网络管制动作进出方向协议类型使用端口15控管规则界面给出了“增加”、“删除”、“修改”3个功能按钮用来对控管规则进行不同的操作。其中选择增加和修改时都会弹出控管规则设置界面。1.控管规则设置界面控管规则设置界面是用来设置控管规则的各个字段(如图4.4)。在“应用程序”栏输入或选择要进行控管的应用程序的完整路径和文件名。“远端网络”用IP地址范围表示,用来定义网络类型的IP地址范围。本软件工划分为5个类型:所有网络、局域网、受约束的网络、信任的网络和自定义网络。12“动作”用来确定符合这一条控管规则的网络访问动作是放行还是拒绝。“方向”用来确定这一条控管规则适合于网络访问的连接方向。本机向远端服务器发出连接请求就是出;远端主机向本机发出连接请求则为进。“类型”是控管规则约定的协议类型。“端口”是协议所使用的端口。图4.4控管规则设置界面2.网络设置界面网络设置界面用来对各种网络类型的IP地址段进行设置(如图4.5),在上节有关于远端网络类型的介绍。在这个界面上提供对IP地址段的增加、修改和删除功能16图4.5网络设置界面第五章核心功能的代码实现本课题的核心功能实现封装在DLL里面。下面分析DLL的主要内容。5.1DLL的封包截获BOOLWINAPIDllMain是DLL的入口函数,系统调用时的标准接口。做一些初始化工作。主要工作是得到调用这个程序的进程路径和名称并设置DLL调用次数的计数器。WSPStartup是WindowsSockets应用程序调用SPI的初始化函数。是服务提供者的标准入口函数。这里的工作是根据lpProtocolInfo找出已经被替换的服务提供者路径,然后加载,并利用被替换服务提供者的WSPStartup得到30个服务函数指针。需要先保存这些函数指针,然后将lpProcTable结构中的30个服务函数指针都设置成自己的。这样,相应的函数请求会首先经过我们自己的函数,然后用这些函数可以做适当的处理,再调用原来的,将请求转发,完成整个通信。12intWSPAPIWSPStartup(WORDwVersionRequestedLPWSPDATAlpWSPDataLPWSAPROTOCOL_INFOWlpProtocolInfoWSPUPCALLTABLEupcallTable17LPWSPPROC_TABLElpProcTable)ODS(_T(WSPStartup.)if(!m_CheckAcl.m_bIsWin9xm_CheckAcl.CheckStartup()=XF_QUERY!QueryAccess()returnSOCKET_ERRORTCHARsLibraryPath512LPWSPSTARTUPWSPStartupFunc=NULLHMODULEhLibraryHandle=NULLINTErrorCode=0if(!GetHookProvider(lpProtocolInfosLibraryPath)|(hLibraryHandle=LoadLibrary(sLibraryPath)=NULL|(WSPStartupFunc=(LPWSPSTARTUP)GetProcAddress(hLibraryHandleWSPStartup)=NULL)returnWSAEPROVIDERFAILEDINITif(ErrorCode=WSPStartupFunc(wVersionRequestedlpWSPDatalpProtocolInfoupcallTablelpProcTable)!=ERROR_SUCCESS)returnErrorCodeif(!lpProcTable-lpWSPAccept|!lpProcTable-lpWSPAddressToString|!lpProcTable-lpWSPAsyncSelect|!lpProcTable-lpWSPBind|!lpProcTable-lpWSPCancelBlockingCall|!lpProcTable-lpWSPCleanup|!lpProcTable-lpWSPCloseSocket|!lpProcTable-lpWSPConnect|!lpProcTable-lpWSPDuplicateSocket|!lpProcTable-lpWSPEnumNetworkEvents|!lpProcTable-lpWSPEventSelect|!lpProcTable-lpWSPGetOverlappedResult|!lpProcTable-lpWSPGetPeerName|!lpProcTable-lpWSPGetSockName|!lpProcTable-lpWSPGetSockOpt|!lpProcTable-lpWSPGetQOSByName|!lpProcTable-lpWSPIoctl|!lpProcTable-lpWSPJoinLeaf|!lpProcTable-lpWSPListen|!lpProcTable-lpWSPRecv|!lpProcTable-lpWSPRecvDisconnect|!lpProcTable-lpWSPRecvFrom|!lpProcTable-lpWSPSelect|!lpProcTable-lpWSPSend|!lpProcTable-lpWSPSendDisconnect|!lpProcTable-lpWSPSendTo|18!lpProcTable-lpWSPSetSockOpt|!lpProcTable-lpWSPShutdown|!lpProcTable-lpWSPSocket|!lpProcTable-lpWSPStringToAddress)returnWSAEINVALIDPROCTABLEEnterCriticalSection(gCriticalSection)NextProcTable=lpProcTablelpProcTable-lpWSPSocket=WSPSocketlpProcTable-lpWSPCloseSocket=WSPCloseSocketlpProcTable-lpWSPConnect=WSPConnectlpProcTable-lpWSPAccept=WSPAcceptlpProcTable-lpWSPSend=WSPSendlpProcTable-lpWSPSendTo=WSPSendTolpProcTable-lpWSPRecv=WSPRecvlpProcTable-lpWSPRecvFrom=WSPRecvFrom以上是我们截获并要用自己定义的函数。LeaveCriticalSection(gCriticalSection)return0XfIoControl是供调用的。用来设置DLL的配置信息和得到DLL的反馈信息,这个函数为提供接口,通过这个函数来设置工作模式,或得到截获的网络封包信息。QueryAccess是在应用程序提交连网请求时,如果发现控管规则中没有关于这个应用程序的控管规则,并且工作模式为询问,则向拥护发出询问,是否让这个程序通行。GetHookProvider用来读取注册表得到系统的SPI的DLL路径和文件信息。这个信息是安装时自己写入的。根据pProtocolInfo信息取出自己保存的、已经被本程序替换的服务提供者路径。GetRightEntryIdItem是供GetHookProvider()调用的扩展函数,用来得到保存系统服务提供者路径的注册表键名。及得到已经被本程序替换的服务提供者的dwCatalogEntryId。XfShutdown调用系统服务提供者函数WSPShutdown,关闭一个Socket连接。并设置相应的错误代码。截获的服务提供者函数:过滤WSPSocket。WSPSocket是用来创建Socket的函数,首先调用底层函数得到新创建的Socket,然后设置新建Socket的协议信息,并调用自定义函19数CheckSocket为这个Socket建立Session,然后保存相应的信息。过滤WSPCloseSocket。转发之前首先调用自定义函数CheckCloseSocket删除相应的Session。过滤WSPConnect。当一个Socket建立连接后调用这个函数,转发之前先调用访问控制函数CheckConnect,检查是否放行。如果不放行,返回错误;如果放行,调用底层WSPConnect函数进行转发。过滤WSPAccept。用来接受一个连接请求。首先调用底层函数,然后对连接的合法性进行检查,如果不允许通过,关闭这个连接。过滤WSPSend。这个函数用来发送面向连接的数据,先检查是否允许通过,然后进行转发。过滤WSPSendTo。这个函数用来发送面向无连接的数据,先检查是否允许通过,然后进行转发。过滤WSPRecv。这个函数用来接收面向连接的数据。首先判断是不是重叠操作并且设置回调函数。如果设置,则用自定义函数AddOverlapped保存参数信息,然后用自己的回调函数代替原来的并转发。转发后根据返回值判断操作是否成功,如果成功,则调用控管函数对操作的合法性进行判断;否则直接返回。过滤WSPRecvFrom。这个函数用来接收面向连接的数据。首先判断是不是重叠操作并且设置回调函数。如果设置,则用自定义函数AddOverlapped保存参数信息,然后用自己的回调函数代替原来的并转发。转发后根据返回值判断操作是否成功,如果成功,则调用控管函数对操作的合法性进行判断;否则直接返回。5.2DLL的访问控管编写一个CCheckAcl。它封装了一组对访问权限进行控制的函数。访问权限主要是由控管规则设置决定。另外还封装了一组网络封包操作函数。下面是一些主要函数及相应代码。5.2.1对服务提供者函数做管制的函数CheckStartup:应用程序连网前的访问控制权限。在服务提供者函数WSPStartup中对访问权限进行控制。WSPStartup是Winsock2SPI入口函数,20每个应用程序连网时调用且仅调用一次这个函数。CheckSocket:检查WSPSocket函数,Socket用来创建Socket,在Socket创建时没有必要进行控管,所以仅仅用来创建Session并保存协议信息。CheckCloseSocket:WSPCloseSocket函数的预处理函数,用来删除相应的Session。CheckConnet:检查连接是否合法。在服务提供者函数WSPConnet调用系统WSPConnet函数建立之前,用CheckConnet调用SetSession填充一些网络封包信息,然后调用GetAccessInfo判断这个连接是否被允许通过。CheckAccept:检查是否允许接受这个Socket连接。在服务提供者函数WSPAccept调用系统函数WSPAccept接受一个Socket连接后,用CheckAccept调用SetSession设置网络封包信息,然后调用GetAccessInfo检查这个Socket连接是否允许通过。CheckSend:在发送面向连接的数据前检查是否放行。在服务提供者函数WSPSend调用系统函数WSPSend发送数据前,用CheckSend调用SetSessionEx和GetProtocolInfo设置网络封包信息,然后调用GetAccessInfo检查是否允许这个发送操作通过。CheckSendTo:在发送面向连接的数据前检查是否放行。在服务提供者函数WSPSendTo调用系统函数WSPSendTo发送数据前,用CheckSendTo调用SetSessionEx和GetProtocolInfo设置网络封包信息,然后调用GetAccessInfo检查是否允许这个发送操作通过。CheckRecv:在接收面向连接的数据时检查是否放行。在服务提供者函数WSPRecv调用系统函数WSPRecv发送数据后,用CheckRecv调用SetSessionEx和GetProtocolInfo设置网络封包信息,然后调用GetAccessInfo检查是否允许这个接收操作通过。CheckRecvFrom:在接收面向连接的数据时检查是否放行。在服务提供者函数WSPRecvFrom调用系统函数WSPRecvFrom发送数据后,用CheckRecvFrom调用SetSessionEx和GetProtocolInfo设置网络封包信息,然后调用GetAccessInfo检查是否允许这个接收操作通过。215.2.2封包处理函数InitializeSession对网络封包记录进行初始化。CreateSession创建一个新的网络封包记录。根据参数s和nProtocol得出协议信息,并将时间和应用程序信息一并写进这个新建的网络封包记录里。DeleteSession从已有的网络封包记录中删除一条。在删除之前首先调用SendSessionToApp函数,将需要删除的记录发送给。FinallySession将所有没有结束的网络封包记录全部发送到中,有显示在封包监视界面上。SendSessionToApp将传递过来的网络封包记录保存到进程间的共享变量里,然后通过消息告诉从变量中取出封包。GetSessionAndSetSessionNull用来得到封包数据并在得到后将缓冲区清空。5.2.3管制函数IsLocalIP:判断IP地址是否为本机IP,同时判断本次调用DLL的应用程序是否为需要放行的超级进程。GetAccessInfo:得到访问权限信息。调用GetAccessFromAcl扩展函数进一步得到访问的权限信息。GetAccessFromWorkMode:从工作模式判断是否放行。GetAccessFromAcl:用网络封包记录和控管规则进行对比,得到连接的访问权限。这
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物流配送系统设计与管理优化方案
- 教育技术课程期末考试试题集
- 高校招生自荐信与个人陈述模板
- 工业排污口管理规范及环保要求
- 第三方物流业务流程优化
- 大型仓库自动化管理方案解析
- 八年级生物考试真题及解析手册
- 装配式建筑施工方案分类指南
- 初中数学测试卷及详细解析
- 校园美景一角写景作文(12篇)
- 安全生产管理制度-普货运输
- 建设项目日照分析报告
- 2024八年级数学上册第12章一次函数12.1函数第1课时上课课件新版沪科版
- 一年级新生家长会课件(共25张课件)
- 第八届全国职工职业技能大赛(网络和信息安全管理员)安徽选拔赛试题及答案
- 2024年秋新译林版英语三年级上册 Unit 3第1课时 Cartoon time 教学课件
- (部编版)统编版小学语文教材目录(一至六年级上册下册齐全)
- 送教上门记录24篇
- 2025届广东省佛山市南海区数学七上期末统考试题含解析
- JGJT384-2016 钻芯法检测混凝土强度技术规程
- 《大学生美育》 课件 第七章 艺术美
评论
0/150
提交评论