费尔防火墙源代码阅读

来源:互联网 发布:unity3d 获取物体坐标 编辑:程序博客网 时间:2024/05/01 10:37

费尔防火墙使用了重载系统提供的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...

原创粉丝点击