⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csdn_文档中心_开发基于windows2000-xp的防火墙.htm

📁 csdn10年中间经典帖子
💻 HTM
📖 第 1 页 / 共 4 页
字号:
            IRP\n"</SPAN>);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            }<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN 
            class=cpp-keyword>if</SPAN>(ipFileObject != 
            NULL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            ObDereferenceObject(ipFileObject);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            ipFileObject = NULL;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            ipDeviceObject = NULL;<BR>&nbsp;&nbsp;&nbsp; 
            }<BR><BR>&nbsp;&nbsp;&nbsp; <SPAN 
            class=cpp-keyword>else</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            dprintf(<SPAN class=cpp-string>"Error while getting the 
            pointer\n"</SPAN>);<BR><BR>&nbsp;&nbsp;&nbsp; <SPAN 
            class=cpp-keyword>return</SPAN> status;<BR>}</FONT></P>
            <P>当我们完成处理过滤功能函数后你能看到,我们必须引用文件对象来获取设备驱动指针。当IpFilter</P>
            <P>驱动完成IRP处理时我使用了一个事件来通知。<BR>过滤函数<BR>&nbsp;&nbsp;&nbsp; 
            我们明白了如何开发驱动以及如何安装过滤函数,但我们还不知道过滤函数呢。<BR>&nbsp;&nbsp;&nbsp; 
            早先我已经说过这个函数总是当传出或发送数据包时被调用。系统跟据它的返回值来决定如何处理数</P>
            <P>据包。<BR>&nbsp;&nbsp;&nbsp; 下面是函数的申明</P>
            <P><FONT face="Courier New"><SPAN 
            class=cpp-keyword>typedef</SPAN>&nbsp; PF_FORWARD_ACTION 
            <BR>(*PacketFilterExtensionPtr)(<BR>&nbsp; <FONT color=#3cc472><SPAN 
            class=cpp-comment>// Ip Packet Header</SPAN><BR></FONT>&nbsp; IN 
            <SPAN class=cpp-keyword>unsigned</SPAN> <SPAN 
            class=cpp-keyword>char</SPAN> *PacketHeader,<BR>&nbsp; <SPAN 
            class=cpp-comment><FONT color=#3cc472>// Packet. Don't include 
            Header</FONT> </SPAN><BR>&nbsp; IN <SPAN 
            class=cpp-keyword>unsigned</SPAN> <SPAN 
            class=cpp-keyword>char</SPAN> *Packet, <BR>&nbsp; <SPAN 
            class=cpp-comment><FONT color=#3cc472>// Packet length. Don't 
            Include length of ip header</FONT></SPAN><BR>&nbsp; IN <SPAN 
            class=cpp-keyword>unsigned</SPAN> <SPAN class=cpp-keyword>int</SPAN> 
            PacketLength, <BR>&nbsp; <FONT color=#3cc472><SPAN 
            class=cpp-comment>// Index number for the interface adapter 
            </SPAN><BR>&nbsp; </FONT><SPAN class=cpp-comment><FONT 
            color=#3cc472>//over which the packet 
            arrived</FONT>&nbsp;&nbsp;&nbsp; </SPAN><BR>&nbsp; IN <SPAN 
            class=cpp-keyword>unsigned</SPAN> <SPAN class=cpp-keyword>int</SPAN> 
            RecvInterfaceIndex, <BR>&nbsp; <FONT color=#3cc472><SPAN 
            class=cpp-comment>// Index number for the interface adapter 
            </SPAN><BR>&nbsp; <SPAN class=cpp-comment>//over which the packet 
            will be transmitted</SPAN><BR></FONT>&nbsp; IN <SPAN 
            class=cpp-keyword>unsigned</SPAN> <SPAN class=cpp-keyword>int</SPAN> 
            SendInterfaceIndex,&nbsp;&nbsp;&nbsp; <BR>&nbsp; <FONT 
            color=#3cc472><SPAN class=cpp-comment>//IP address for the interface 
            </SPAN><BR>&nbsp; <SPAN class=cpp-comment>//adapter that received 
            the packet</SPAN></FONT><BR>&nbsp; IN IPAddr 
            RecvLinkNextHop,<BR>&nbsp; <FONT color=#3cc472><SPAN 
            class=cpp-comment>//IP address for the interface adapter 
            </SPAN><BR>&nbsp; </FONT><SPAN class=cpp-comment><FONT 
            color=#3cc472>//that will transmit the packet</FONT>&nbsp; 
            </SPAN><BR>&nbsp; IN IPAddr SendLinkNextHop <BR>&nbsp; ); 
</FONT></P>
            <P><FONT face="Courier New" 
            size=3><STRONG>PF_FORWARD_ACTION</STRONG></FONT>是一个枚举类型<BR>&nbsp;&nbsp;&nbsp; 
            <FONT face="Courier New" 
            size=3><STRONG>PF_FORWARD</STRONG></FONT>:指定IP过滤驱动立即将数据包返回到IP栈。对于送到本地的包,IP将被送到栈顶。如果</P>
            <P>是要发送到其他机算机,IP包也将会被立即发送走。<BR>&nbsp;&nbsp;&nbsp; <STRONG><FONT 
            face="Courier New" 
            size=3>PF_DROP</FONT></STRONG>:指定IP过滤驱动立即将该数据包从IP栈里丢弃掉。该IP数据包将会被丢失。<BR>&nbsp;&nbsp;&nbsp; 
            <STRONG><FONT face="Courier New" 
            size=3>PF_PASS</FONT></STRONG>:指定IP过滤驱动过滤该包并返回响应结果到IP栈。IP过滤驱动如何处理该数据包取决于他对</P>
            <P>包过滤API的设置。当过滤钩子发觉他不能处理该数据包就得交给IP过滤驱动去处理此包时就返回该参数。<BR>&nbsp;&nbsp;&nbsp; 
            虽然DDK的文只介绍了上面三个返回值,但当你查看pfhook.h文件时会发现还有另一个供返回的数值。</P>
            <P>那就是<STRONG><FONT 
            face="Courier New">PF_ICMP_NO_DROP</FONT></STRONG>。我猜想这个值与丢弃包相似并提供ICMP包错误信息。<BR>&nbsp;&nbsp;&nbsp; 
            正如你在过滤功能函数的定义中所看到的,包和他的包头都是以指针方式传递的。因此你可以修改包</P>
            <P>头或内容然后再将其传送走。这在写比如NAT程序时是非常有用的。如果我们更改其目标地址,那么数据包</P>
            <P>将向你所更改的方向传送。<BR>&nbsp;&nbsp;&nbsp; 
            在我的实现在,过滤功能函数会与规则链表中的每个过滤规则函数所定义的规则进行比对。这个规则</P>
            <P>链表会在运行时收到START_IP_HOOK控制码时创建。这个你会在源码中看到它。<BR><FONT face=黑体 
            size=6>代码</FONT><BR>&nbsp;&nbsp;&nbsp; 
            在我的第一个版本中,我只实现了一个相对简单的版本,因此好多人都在询问我是否能帮助他们开发</P>
            <P>一个更为实用的应用。所以我现在升级了一个相对复杂的版本。在这个新的例子中有一个小的包过滤应用</P>
            <P>。在这个新的应用程序中,你可以加入你的一些通用防火墙的规则。<BR>&nbsp;&nbsp;&nbsp; 
            在第一个版本中,这个应用有两个部分组成。<BR>&nbsp;&nbsp;&nbsp; 
            用户应用程序:它是一个MFC应用程序来管理各种过滤规则。这个应用程序发送各种过滤规则到应用中</P>
            <P>并决定何时开始起动过滤。过滤动作分三步<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            按照你的需要定一个过滤规则。发送添加或删除命令来增加或删除这个过滤规则。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            安装规则。当你定义好一个过滤规则后,按下安装按扭来发送他到驱动中。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            开始过滤。你只需要按下开始按扭就可以开始过滤了。<BR>&nbsp;&nbsp;&nbsp; 
            过滤驱动程序:驱动程序按照用户应用程序发来的过滤规则来过滤发送和收到的各数据包。<BR>&nbsp;&nbsp;&nbsp; 
            过滤钩子驱动程序必须和用户应用程序在同一目录中。<BR><FONT face=黑体 
            size=6>为什么要用这种方法来开发防火墙?</FONT><BR>&nbsp;&nbsp;&nbsp; 
            当然,它并不是Windows下开发防火墙的唯一方法,还有其它NDIS防火墙、TDI防火墙、WinSock层防火</P>
            <P>墙、包过滤API等等从多方法。因此我将说明用过滤钩子驱动开发防火墙的一些优缺点。<BR>&nbsp;&nbsp;&nbsp; 
            基于过滤钩子方法来开发防火墙程序有较好的弹性。你可以在进入到IP栈前过滤所有的IP包。当然了</P>
            <P>,你不能再过滤更底层的数的数据,例如网卡硬件帧。那么你需要写NDIS驱动去过滤它,那你将获得更好</P>
            <P>的灵活性但也更难开发。<BR>&nbsp;&nbsp;&nbsp; 
            基于过滤钩子方法来开发防火墙程序不失为一个简单有效的方法。安装及实现防火墙只需几个简单的</P>
            <P>过程。当然,包过滤API将更简单,但那样你将失去更多的灵活性,你再不能随意更改包内容了。<BR>&nbsp;&nbsp;&nbsp; 
            结论:过滤钩子驱动算不上开发防火墙的最好方法,但也不是最差的。那么为什么不能把它列为开发</P>
            <P>商业软件的一部分呢?<BR>&nbsp;&nbsp;&nbsp; 
            回答是简单的,但这个驱动算不上最好的,但也不是最差的。我再次提及它只因为过滤钩子驱动只能</P>
            <P>一次安装一个。我们可以开发一个更好的,它可以任意装载来为成百上千的应用程序过滤包并不会与其它</P>
            <P>过滤程序相冲突。<BR>&nbsp;&nbsp;&nbsp; 
            在微软件的文档中,该方法还有另一个缺点。那就是虽然DDK文档说你可以对所有发送和收到的数据包</P>
            <P>为所欲为但那并不是真的。你能任意更改所有收到的数据包,但只能对IP、TCP、UDP以及ICMP包头时行更</P>
            <P>改。我也不知道那是为什么?<BR>&nbsp;&nbsp;&nbsp; 
            微软公司还为WindowsXP系统引入了另一个无限制的防火墙钩子驱动。它的装载非常的简单,但微软并</P>
            <P>不建议你去用它来开发。因为它运行在网络栈的上层,太高了。可能这个驱动将会在下一版本的Windows中</P>
            <P>消失。<BR><FONT face=黑体 size=6>结论</FONT><BR>&nbsp;&nbsp;&nbsp; 
            OK,所有的都讲完了。我知道这不是开发防火墙的最佳方法(我已经提及它的优缺点)。但我想这是为</P>
            <P>所有对防火墙开发感性趣的朋友一个很好的起点,或是因为看了这篇文章对防火墙开发更感性趣了。<BR>&nbsp;&nbsp;&nbsp; 
            我希望你现已经有些明白了Filter-Hook 
        Driver,并准备开发一个功能更为强大的防火墙了。</P><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE align=center bgColor=#006699 border=0 cellPadding=0 cellSpacing=0 
width=770>
  <TBODY>
  <TR bgColor=#006699>
    <TD align=middle bgColor=#006699 id=white><FONT 
    color=#ffffff>对该文的评论</FONT></TD>
    <TD align=middle>
      <SCRIPT src="CSDN_文档中心_开发基于Windows2000-XP的防火墙.files/readnum.htm"></SCRIPT>
    </TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16 
      hspace=1 src="CSDN_文档中心_开发基于Windows2000-XP的防火墙.files/ico_pencil.gif" 
      width=16> </SPAN>&nbsp;&nbsp;&nbsp;&nbsp; ggg82 <I>(2004-4-16 
      12:44:26)</I> </TD></TR>
  <TR>
    <TD bgColor=#ffffff colSpan=3 width=532><BR>ntddk.h找不到 
      firewall.exe无法启动,提示:error loading the driver <BR></TD></TR></TBODY></TABLE><BR>
<DIV align=center>
<TABLE align=center bgColor=#cccccc border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TH bgColor=#006699 id=white><FONT 
color=#ffffff>我要评论</FONT></TH></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE border=0 width=770>
  <TBODY>
  <TR>
    <TD>你没有登陆,无法发表评论。 请先<A 
      href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=26721">登陆</A> 
      <A 
href="http://www.csdn.net/expert/zc.asp">我要注册</A><BR></TD></TR></TBODY></TABLE></DIV><BR>
<HR noShade SIZE=1 width=770>

<TABLE border=0 cellPadding=0 cellSpacing=0 width=500>
  <TBODY>
  <TR align=middle>
    <TD height=10 vAlign=bottom><A 
      href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A> - <A 
      href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A> - <A 
      href="http://www.csdn.net/map/map.shtm">网站地图</A> - <A 
      href="http://www.csdn.net/help/help.asp">帮助信息</A> - <A 
      href="http://www.csdn.net/intro/intro.asp?id=2">联系方式</A> - <A 
      href="http://www.csdn.net/english">English</A> </TD>
    <TD align=middle rowSpan=3><A 
      href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG 
      border=0 height=48 
      src="CSDN_文档中心_开发基于Windows2000-XP的防火墙.files/biaoshi.gif" 
  width=40></A></TD></TR>
  <TR align=middle>
    <TD vAlign=top>百联美达美公司 版权所有 京ICP证020026号</TD></TR>
  <TR align=middle>
    <TD vAlign=top><FONT face=Verdana>Copyright &copy; CSDN.net, Inc. All rights 
      reserved</FONT></TD></TR>
  <TR>
    <TD height=15></TD>
    <TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--内容结束//--><!--结束//--></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -