简单分析用SPI实现防火墙

原创 2002年12月09日 09:31:00

                                       简单分析用SPI实现防火墙

  作者:snsins

如有转载,请注明并保持文章的完整

2002.12.5

--------------------------------------------------------------------------------------------------------

 

本来上次写了一个简单的SPI防火墙程序(只做了IP过滤功能,包过滤功能没有去做)后,已经放弃了对SPI的研究,但是最近有朋友问到SPI防火墙的实现,现在就再对SPI做一次详细点的分析和总结。

先看看防火墙的一般实现方式

首先是TCP/IP的结构(OSI7层模型)
--------
|应用层|------exe程序,比如ie
--------
|表示层|-------ws2_32.dll
--------
|会话层|-------SPI
--------        
|传输层|-------TDI(不能截获ICMP等协议的数据)
-------- 
|网络层|-------NDIS(可以截获所有的网络数据)
--------
|链路层|-------设备驱动
--------      
|物理层|-------网卡
--------
从上面我们可以很清楚地看到我们有多种方式实现防火墙,比如用HOOK API在表示层HOOK WINSOCKET的API函数,在会话层用WINDOWS提供的标准的SPI方式实现,SPI相对HOOK API方式要规范多了,而且功能也更强大,但是还是在user model里,。在传输层可以写驱动实现防火墙,虽然已经到了kernel model,但是和上面两种方式一样,过滤不了比如ICMP等协议的数据,因为ICMP等协议的数据并不经过传输层。这样我们可以看到,在WINDOWS里实现防火墙最标准最规范最强大的方式应该是在NDIS(也就是网络层实现),因为NDIS提供了一些规则,只要让我们来调用一些写好的函数来组织数据就可以了,功能不仅强大,而且相对下面链路层的设备驱动要简单,应该说在链路层也可以实现防火墙,但是觉得没有必要,太复杂了。

现在回过头来看看SPI的结构方式
--------------------
|    ws2_32.dll    |
--------------------
|        SPI       |
--------------------
|        SPI       |--------可以有很多层,就是所谓的分层服务提供者
--------------------
|   基础服务提供者 |
--------------------

服务提供者有两种,一种是分层服务提供者,一种是基础服务提供者,上面这个图不是很准确,我们这样来理解,我们写的分层服务提供者必须调用基础服务提供者或者下面一层的分层服务器提供者,然后把请求提交到他上面的一层(上面的一层可能是另外一个分层服务提供者,也可能是ws2_32.dll)。而我们写的基础服务提供者必须调用系统基础服务提供者,然后把请求提交到ws2_32.dll。请注意,系统里可能不仅仅安装了我们的基础服务提供者,也安装了别人写的基础服务提供者。在安装多个分层服务提供者和多个基础服务提供者的情况下,这两者的组织方式是不同的
如下图

-------------------------------------------------------------
|                        ws2_32.dll                        |
-------------------------------------------------------------
          |                         |                      |
---------------------               |                      |
|别人的分层服务提供者|              |                      |
---------------------               |                      |
          |                         |                      |
---------------------               |                      |
|别人的分层服务提供者|              |                      |
----------------------              |                      |
          |                         |                      |
---------------------               |                      |
|我们的分层服务提供者|              |                      |
----------------------              |                      |
          |                         |                      |
---------------------     ----------------------  ---------------
|别人的分层服务提供者|    |别人的基础服务提供者| |我们的基础服务提供者|
----------------------    ----------------------  ---------------------
          |                         |                      |
----------------------------------------------------------------
|                 系统基础服务提供者                            |
————————————————————————————————

如果你连上面这个图看了还是不懂我就没办法了。

从上面可以看出,这个SPI的组织思想就是分层。不过基础服务提供者的层数相对分层服务提供者要少而已,理论上分层服务提供者可以有N层(不知道N是不是无限哦)

那么这些层和层之间是如何组织的呢?通过一个函数来把他们连接起来,这个函数就是
WSPStartup
下面是他的原型
int WSPStartup (
  WORD                     wVersionRequested,              
  LPWSPDATAW               lpWSPData,                
  LPWSAPROTOCOL_INFOW      lpProtocolInfo,  
  WSPUPCALLTABLE           UpcallTable,          
  LPWSPPROC_TABLE          lpProcTable          
);

这里比较重要的是第三个参数lpProtocolInfo和最后一个参数lpProcTable,lpProtocolInfo留到后面再讲,这和服务者的安装有关

现在我们看看ws2_32.dll里的API的,ws2_32里的API被应用程序调用后大部分都最终映射成了SPI里的30个函数,这30个函数都是用WSP开头的。注意,SPI里的30个函数是不能被应用程序直接调用的,而是应该由ws2_32.dll来调用。而LPWSPPROC_TABLE是一个表,里面保存了这30个函数的指针。我们通过调用下一层服务提供者的WSPStarup来得到下一层服务提供者的30个函数指针,同时我们也要EXPORT(SPI是一个DLL)这个函数,以便我们上一层的服务提供者来调用得到这30个函数指针。

例如
int WSPStartup (
  WORD                     wVersionRequested,              
  LPWSPDATAW               lpWSPData,                
  LPWSAPROTOCOL_INFOW      lpProtocolInfo,  
  WSPUPCALLTABLE           UpcallTable,          
  LPWSPPROC_TABLE          lpProcTable          
)
{
  LPWSPSTARUP WSPStarProc=GetProcAddress(LbHandle,"WSPStartup");//得到下一层服务提供者的WSPStatrup函数指针,记得要先LoadLibrary下一层服务提供者的DLL
  
  WSPStarProc(wVersionRequested,lpWSPData,lpProtocolInfo,UpcallTable,lpProcTable )
 
//记得要保留下一层原来的函数指针,有过HOOK API经验的朋友应该知道,就像要保存你HOOK 的API原来的地址一样


  WSPPROC_TABLE SystemProc=*lpProcTable;


//然后就可以设置自己的处理函数了,和HOOK API也差不多,比如
  lpProcTable->lpWSPSend=WSPSend;

  return 1;

然后我们实现自己的WSPSend

int WSPSend (
  SOCKET               s,                                                
  LPWSABUF               lpBuffers,                                      
  DWORD               dwBufferCount,                                     
  LPDWORD               lpNumberOfBytesSent,                             
  DWORD               dwFlags,                                           
  LPWSAOVERLAPPED        lpOverlapped,                            
  LPWSAOVERLAPPED_COMPLETION_ROUTINE   lpCompletionRoutine,  
  LPWSATHREADID          lpThreadId,                                
  LPINT               lpErrno                                            
)
{
  /*++
在这里我们用getsockname等函数和第一个参数可以得到这个套接字的端口和IP这些东西,还有buffer这些东西都可以在这里处理,实现IP过滤包过滤都可以实现,然后再调用下一层服务提供者的相应函数并返回
--*/
   return SystemProc.lpWSPSend(s,lpBuffers,dwBufferCount,lpNumberOfBytesSent,dwFlags,lpOverlapped,lpCompletionRoutine,lpThreaId,lpErrno);
 
}

当然,在具体的实现中没这么简单,对于WINSOCKET 中的复杂的I/O模型和重叠请求中,还要写回调函数等,现在就不讨论这些问题,有兴趣的自己查找资料

还有,用这个也可以实现sniffer功能,分析出比如POP3以及TELNET等明文传输的网络协议中你感兴趣的东西

数据都在LPWSABUF               lpBuffers,这个参数里


下面给出这个结构
该知道怎么解析包了吧?
typedef struct __WSABUF {
  u_long      len;
  char FAR    *buf;
} WSABUF, FAR * LPWSABUF;

-----------------
待续.....

简单分析用SPI实现防火墙

简单分析用SPI实现防火墙 作者:snsins 如有转载,请注明并保持文章的完整 2002.12.5 -------------------------------------------------...
  • zy122
  • zy122
  • 2007年01月04日 15:18
  • 1069

SPI防火墙及应用测试

SPI防火墙设置,防火墙的作用防外不防内,也就是说对不是由你向internet发出的连接一律拦截。他可保证你的计算机的相对安全。如果你已经有软件防火墙了,如瑞星,诺顿什么的,你完全可以不用设置,因为现...
  • wuruixn
  • wuruixn
  • 2014年05月23日 17:43
  • 1854

Linux内核SPI子系统架构分析(清晰)

转载:http://jianbo.de/b/archives/918 SPI总线上有两类设备:一类是主控端,通常作为SOC系统的一个子模块出现,比如很多嵌入式MPU中都常常包含SPI模块。一...
  • win2domain
  • win2domain
  • 2014年08月28日 14:36
  • 352

SPI总线测试和分析

美国力科公司深圳代表处   齐天熠1、SPI总线简介       SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外...
  • Synthesize
  • Synthesize
  • 2011年05月22日 15:27
  • 7759

Linux Platform总线+SPI总线分析

本文以MPC8308(powerpc架构),HX软件包为依据,详细内容可参考源码 CPU: e300c3MPC8308 400MHz BOARD: Freescale MPC8308ERDB D...
  • fzs333
  • fzs333
  • 2015年07月09日 10:45
  • 1316

windows网络防火墙开发二三事

网络防火墙开发二三事- haoxg - 花了近一个月的时间研究 Windows 平台下的网络防火墙相关技术,并实现了一个简单的防火墙。在独自摸索的过程中,由于以往的开发经历从未涉及此领域,所以碰到了不...
  • TANG_XIAO_BIN
  • TANG_XIAO_BIN
  • 2011年05月08日 23:09
  • 4543

MSP430 SPI驱动 代码设计流程

MSP430 SPI驱动 代码设计流程平常工作中,如果使用MSP430作为主控芯片,经常会遇到需要编写SPI 或 I2C 驱动,来读取和控制外设(比如LCD屏幕,一些传感器)的情况。为了减少重复性工作...
  • Dannielyoung
  • Dannielyoung
  • 2017年06月07日 21:07
  • 978

关于 用c写防火墙的讨论

问题:我想知道怎样获得IP包的信息,有获取IP包的函数吗?1.linux(unix)下:libpcap windows下:winpcap(libpcap在windows上的移植)或写windows d...
  • liaxiaosan
  • liaxiaosan
  • 2005年10月03日 16:39
  • 1061

Linux Platform总线+SPI总线分析-SPI驱动

 一、SPI原理模型 如上图所示,主设备对应SOC芯片中的SPI控制器,通常,一个SOC中可能存在多个SPI控制器,像上面的例子所示,SOC芯片中有3个SPI控制器。每个控制器下可以连...
  • doitsjz
  • doitsjz
  • 2017年04月18日 16:40
  • 519

SPI工作原理分析

说明.文章摘自:SPI协议及其工作原理浅析 http://bbs.chinaunix.net/thread-1916003-1-1.html 一、概述.      SPI, Serial ...
  • dddd0216
  • dddd0216
  • 2016年03月15日 09:47
  • 946
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单分析用SPI实现防火墙
举报原因:
原因补充:

(最多只允许输入30个字)