费尔防火墙源代码阅读

原创 2005年04月25日 23:19:00

费尔防火墙使用了重载系统提供的winsock.dll动态链接库的方法,实现网络数据包的检查;winsock.dll在系统启动时自动加载,ie等网络程序利用了其中提供的WSPSend、WSPRecv等函数实现数据包的收发过程;通过重载这个dll文件,费尔防火墙程序实现了自己的一个动态链接库xfilter.dll(好像是),其中导出了WSPStartup函数和XfIoControl函数,第一个函数将指向winsock.dll的lpWSPSocket、lpWSPCloseSocket、lpWSPConnect、lpWSPAccept、lpWSPSend、lpWSPSendTo、lpWSPRecv、lpWSPRecvFrom函数的指针指向自己实现的函数,名称就是去掉了lp前缀,这样就可以在数据包收发之前进行包检查,从而实现防火墙的功能,达到包过滤目的;这些替换函数称作钩子函数hook function。

ACL(maybe Access Control Link,访问控制链),用来过滤所有进出网络的包的规则库;费尔将规则存在这个链中,对每一个防火墙截获的包,利用规则进行相应的匹配,从而完成转发、丢弃等功能;这里用了一个类:CAclFile;规则类与包检查类的interface是CCheckAcl::GetAccessFromAcl函数。

来看看CAclFile类的内部结构吧!

费尔维护了一个名为xacl.cfg的文件,文件内容就是关于包过滤规则的;这样CAclFile类里就有一个CFile类成员mAclFile;文件内容就是CAclFile类的成员mAclHeader、mAclIntranetIP、mAclTime、mpAclDistrustIP、mpAclTrustIP、mpAclCustomIP、mpAcl这7个,参见XACL_FILE struct结构或者CAclFile::WriteAcl函数。

CAclFile类的其他成员函数大多就是围绕着添加、删除这些数据结构的了,或者是读取ACL、保存ACL等等。

WSPStartup函数是Service Provide Interface入口点,费尔防火墙代码中首先查找系统提供的原始的WSPStartup函数地址,然后调用这个系统提供的函数,获得服务函数列表,然后将其中一些函数替换成自己写的服务函数,并保留原来的函数列表指针,以便以后使用;一共有8个函数被替换。

下面来看看具体的包过滤过程,即对这8个函数一一考察

WSPSocket:

这个当然要先调用系统的lpWSPSocket进行必要的初始化工作,接下来自然是利用此函数的参数调用自己的WSPSocket函数进行具体的协议类型分析工作;譬如,只对address family是internetwork: UDP, TCP, etc. 的进行包过滤;根据protocal参数初始化CCheckAcl类中的成员wProtocal为TCP、UDP等;最后利用wProtocal参数和socket参数创建一个会话session。

WSPCloseSocket:

删除会话,调用系统的lpWSPCloseSocket。

WSPConnect:

设置相应会话的属性,如标识此socket是向外连接的ACL_DIRECTION_OUT,以及端口和远端IP;随后调用GetAccessInfo进行访问判断;GetAccessInfo再进一步调用GetAccessFromAcl;然后GetAccessFromAcl先看防火墙的工作模式是否是passall、denyall等,是的话就直接返回相应策略;否则,根据进程名查找该进程对应的acl文件,从这里可以看出费尔是一个acl文件有一个控制链数组,这个数组每一个元素对应一个进程;找到acl之后,进行5个方面的匹配,进出方向、服务类型、访问时间、网络类型、服务端口,这5个有一个不匹配的,就再次查找acl,再匹配;如果没有acl对应,并且不是win9x系统,就询问用户,剩下的策略没太看懂的说:(

if(bAction == ACL_ACTION_DENY)
    return XF_PASS;
else
    return XF_DENY;

WSPAccept:

接受连接,先调用系统的lpWSPAccept,然后CheckAccept;接下来是设置会话属性,然后类似上面的,调用GetAccessInfo;下略

WSPSend:

CheckSend函数调用;通过函数GetProtocolInfo设置会话属性,然后GetAccessInfo,同上,略

WSPSendTo:

同上,略

WSPRecv:

先调用系统的lpWSPRecv接收数据,然后CheckRecv进行检查;这个过程跟checksend差不多,略

WSPRecvFrom:

同上,略

至此,费尔防火墙的一些核心代码都分析过了,比较粗糙,具体的可以去读源代码了解。

 

to be continued...

公布我的PFW防火墙系统完整源代码

公布我的PFW防火墙系统完整源代码http://download.csdn.net/source/432552
  • qinivy
  • qinivy
  • 2008年04月27日 12:56
  • 553

Xfilter完整源代码

  • 2009年07月21日 16:15
  • 252KB
  • 下载

个人防火墙源代码(专业版)

  • 2009年11月17日 19:53
  • 376KB
  • 下载

费尔个人防火墙2.0源代码

  • 2004年10月11日 09:11
  • 0B
  • 下载

费尔防火墙源代码阅读

费尔防火墙使用了重载系统提供的winsock.dll动态链接库的方法,实现网络数据包的检查;winsock.dll在系统启动时自动加载,ie等网络程序利用了其中提供的WSPSend、WSPRecv等函...
  • unicode1985
  • unicode1985
  • 2005年04月25日 23:19
  • 4639

费尔个人防火墙!

今天试用了费尔个人防火墙。
  • ChrisGu
  • ChrisGu
  • 2005年02月03日 11:08
  • 585

计算机原始时代到现在著名的黑客

鲍勃.阿尔布菜特(BobAlbrecht):人民计算机公思(People’sComputerCompany,PCC)的创始人,非常喜欢把计算机介绍给年轻人。   Altair8800:微型计算机的先驱...
  • oXuYuanShu
  • oXuYuanShu
  • 2016年02月29日 16:17
  • 532

费尔防火墙源代码

  • 2015年01月21日 12:53
  • 4.81MB
  • 下载

费尔防火墙1.0开源VC6,VC2008源代码

  • 2010年07月09日 10:18
  • 110KB
  • 下载

Linux源代码阅读

我要开始认真阅读理解Linux源代码,首先从最简单的Linux-0.11开始。下面转载一篇文章吧,给自己鼓鼓劲。 http://www.51testing.com/html/11/n-817111....
  • wuhua_amazing
  • wuhua_amazing
  • 2013年07月02日 18:38
  • 866
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:费尔防火墙源代码阅读
举报原因:
原因补充:

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