您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > Windows防火墙设计
Windows防火墙设计梅松教学目的随着网络安全问题日益严重,广大用户对网络安全产品也越来越关注。防火墙作为一种网络安全工具,早已普遍应用,成为广大网络用户的安全保护者。本课程设计的目的是学习Windows下防火墙设计技术,并实现一个简单的Windows下的防火墙软件。教学内容1.学习Windows下SPI的数据报过滤原理2.读懂一个简单的SPI过滤程序3.设计和实现一个简单的Windows应用层防火墙基础知识1.了解WindowsAPI程序的一般结构2.掌握Windows下Socket编程3.了解Windows下DLL的概念(重要)4.了解Windows下访问注册表函数参考书目Windows防火墙与网络封包截获技术电子工业出版社,朱雁辉ProgrammingWindows程式开发设计指南作者:CharlesPetzoldWindows95程式设计指南作者:侯捷WINDOWS网络编程技术MSDN相关资料讲课内容讲课时间2学时,实验20学时Windows下Hook技术Windows下报文截获技术Windows下SPI原理介绍一个简单的SPI截获程序课程设计要求开发环境操作系统为WindowsXP编程工具为VC++6.0提供例子代码和相关工具。1.Windows的Hook技术Hook分为两种Hook消息Windows是消息驱动的运行模式,所以Hook消息可以进行很多特殊的处理。这里不详细介绍。参见SetWindowsHookEx函数。(Windows95程式设计指南)Hook函数调用Hook函数调用是指截获特定进程或者系统对某个API函数的调用,使得API的执行流程转向特定的代码,后者称为注入代码,注入代码一般保存在注入DLL中。1.Windows的Hook技术Hook函数调用技术1.利用Hook消息技术,会自动将注入DLL装入,修改目标程序的导入表,替换为注入函数。2.使用注册表注入DLL,主要是某些特定注册表项会被Windows自动调用。3.使用远程线程注入DLL,利用LoadLibrary伪装为线程函数,装载注入DLL。4.通过覆盖代码进行Hook,即修改一个函数在内存中的映像,嵌入汇编代码,使该函数一执行就转跳到注入函数执行,最霸道的方法。1.我们学习的Hook技术比较简单的Hook技术使用注册表,修改注册表项,安排注入DLL。在DLL中,利用函数指针来实现Hook。2.Windows报文截获技术——应用层1、原始套结字(RawSocket)。Winsock2以后提供了原始套结字功能,可以在用户态用Winsock函数接收所有流经Winsock的IP包。这种方法在MSDN里面有叙述,是MS官方支持的方法,在网上也有很多资料。但是这种方法只能监听但是不能拦截数据报,所以可以作为网络监视器的选择技术,但是不能实现防火墙等更高要求的功能。另外最致命的缺点就是只能在Winsock层次上进行,而对于网络协议栈中底层协议的数据包例如TDI无法进行处理。对于一些木马和病毒来说很容易避开这个层次的监听。2、替换系统自带的WINSOCK动态连接库。这种方法可以在很多文章里面找到详细的实现细节。通过替换系统Winsock库的部分导出函数,实现数据报的监听和拦截。2.Windows报文截获技术——应用层3、Winsock服务提供者(SPI)。SPI是Winsock的另一面,是Winsock2的一个新特性。起初的Winsock是围绕着TCP/IP协议运行的,但是在Winsock2中却增加了对更多传输协议的支持。Winsock2不仅提供了一个供应用程序访问网络服务的Windowssocket应用程序编程接口(API),还包含了由传输服务提供者和名字解析服务提供者实现的Winsock服务提供者接口(SPI)和ws2_32.dll。4、Windows2000包过滤接口。由于过滤规则限制太多不灵活而应用不多。5、网络监视器SDK。MS官方的实时监视分析网络数据的方法。但是由于封装的太复杂使用起来不灵活。2.Windows报文截获技术——核心层1、TDI接口2、firewallfilter接口3、NDIS中间层驱动接口2.Windows报文截获技术我们重点学习应用层报文截获的第三种方法(SPI),这种方法简单、稳定、可靠、功能也比较强大。3.WindowsSPI原理在MicrosoftWindows环境下的网络编程接口就是Windows套接字(WindowsSocket,简称Winsock)。Winsock提供了包括TCP/IP、IPX等多种通信协议下的编程接口。Windows98、WindowsNT4.0、Windows2000则直接支持Winsock2.0(32位)。Winsock2.0引入的一个功能就是允许开发者可以编写自己的服务提供者接口程序,即SPI程序。SPI以DLL方式存在,工作在应用层,为上层程序提供结构函数。3.WindowsSPI原理即用户程序是通过WS2_32.dll来调用实际的Winsock函数,这些函数都由服务提供者来提供。管理者3.WindowsSPI原理服务提供者又有两种方式,一种是基础服务提供者(BaseServiceProvider),另外一种是分层服务提供者(LayerServiceProvider)。两者功能相同,但是插入Winsock体系的方式不同。基础服务者在最底层,而分层服务提供者在一个链式结构中。3.WindowsSPI原理无论那种服务提供者,其信息都保存在注册表的分支:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Winsock2\Parameters\Protocol_Catalog9\Catalog_entries中。3.WindowsSPI原理上图中PackedCatalogItem中到底保存的是什么呢?由于我们可以看到是以REG_BINARY表示二进制方式保存(而REG_SZ表示以0结尾的字符串),保存的是一个结构:typedefstruct_WSAPROTOCOL_INFOW{DWORDdwServiceFlags1;DWORDdwServiceFlags2;DWORDdwServiceFlags3;DWORDdwServiceFlags4;DWORDdwProviderFlags;GUIDProviderId;DWORDdwCatalogEntryId;WSAPROTOCOLCHAINProtocolChain;//这个结构中的域决定是否LSPintiVersion;intiAddressFamily;intiMaxSockAddr;intiMinSockAddr;intiSocketType;intiProtocol;intiProtocolMaxOffset;intiNetworkByteOrder;intiSecurityScheme;DWORDdwMessageSize;DWORDdwProviderReserved;WCHARszProtocol[WSAPROTOCOL_LEN+1];}WSAPROTOCOL_INFOW,FAR*LPWSAPROTOCOL_INFOW;typedefstruct_PACKEDCATALOGITEM{CharsSpiPathName[MAX_PATH];WSAPROTOCOL_INFOWProtocolInfo;}PACKETCATALOGITEM;结构中每个字段含义在MSDN中可以找到typedefstruct_WSAPROTOCOLCHAIN{intChainLen;/*thelengthofthechain,*//*length=0meanslayeredprotocol,*//*length=1meansbaseprotocol,/*length1meansprotocolchain*/DWORDChainEntries[MAX_PROTOCOL_CHAIN];/*alistofdwCatalogEntryIds*/}WSAPROTOCOLCHAIN,FAR*LPWSAPROTOCOLCHAIN;3.WindowsSPI原理由于SPI程序可以截获所有通过的报文,所以反倒成为很多木马监视用户流量或者进行进程保护的地方,例如ccnic就会在此增加一个自己的LSP。所以反木马软件也有监控该注册表项的功能,图中为一个反木马软件对注册表项的监控。通过工具DumpSPI也可以查看详细信息。3.WindowsSPI原理另外一个监视所有可能自动启动程序的安全工具界面,也将SPI列为监视对象。3.WindowsSPI原理我们重点学习如何设计一个Windows防火墙,该防火墙替换掉TCP协议的基础服务提供者,然后运行安全功能,当安全功能运行完成后,再运行原有的Winsock功能。对于如何编写一个分层服务提供者,MSDN有例子文档,可以参考,原理接近。4.介绍一个简单的防火墙程序工程名:MiniSPI演示效果实现流程介绍4.IP_Moniter.dll具体代码效果演示:4.介绍一个简单的防火墙程序程序分为两个部分:1.install程序,为命令行程序,负责修改注册表,替换掉TCP基础服务提供者的某些信息,使得WS2_32.dll启动的是注入DLL。2.一个DLL即注入DLL,名称为IP_Moniter.dll完成安全功能,同时遵守SPI接口。4.介绍一个简单的防火墙程序install程序流程:1.从命令行中参数判断是安装还是卸载IP_Moniter.dll2.如果为安装,调用CInstall类的InstallPriovider()方法,该方法负责修改注册表,达到注入新的SPIDLL目的。3.如果为卸载,调用CInstall类的RemoveProvider()方法,该方法恢复原来的注册表。4.CInstall类方法介绍InstallPriovider()流程:1.IsInstalled()方法判断是否已经修改注册表,如果已经生成了新的注册表项:SYSTEM\\CurrentControlSet\\Services\\WinSock2\\MiniSpi就认为已经安装,那么退出。2.调用EnumHookKey(FALSE),该方法遍历SYSTEM\\CurrentControlSet\\Services\\WinSock2\\Parameters\\Protocol_Catalog9\\Catalog_Entries下所有的基础服务提供者,判断是否TCP/IP协议,如果是,则替换调注册表中DLL名字为IP_Moniter.dll,并将原来的DLL名字,保存到SYSTEM\\CurrentControlSet\\Services\\WinSock2\\MiniSpi下和dwCatalogEntryId对应的值中。4.CInstall类方法介绍RemovePriovider()流程:基本是InstallProvider的逆过程,负责将原来的基础服务提供者的DLL名字恢复。注意install程序仅仅修改了注册表,将原基础服务提供者的DLL指向IP_Moniter.dll,没有完成任何安全功能。4.效果演示没有Install之前的注册表:4.效果演示Install之后的注册表:4.IP_Moniter.dll功能IP_Moniter.dll功能:1.按照要求,输出WSPStartup函数,该函数负责初试化,该函数也是所有使用Winsock程序首先调用的程序。2.WSPStartup()调用GetHookProvider()得到原来的基础服务者的DLL位置,然后装载,并调用其WSPStartup(),然后得到Winsock的lpProcTable,该table指向所有的Winsock函数。3.替换lpProcStartup中的WSPSocket函数,并打印调试信息,即截获了WSPSocket函数的调用。4.IP_Moniter.dll具体代码intWSPAPIWSPStartup(WORD
本文标题:Windows防火墙设计
链接地址:https://www.777doc.com/doc-1840758 .html