开发基于Windows2000/XP的防火墙[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 zgce 的 blog

下载  downloadsource    downloadfirewallapplication

介绍
    如果你决定为linux系统开发一个防火墙,你将会找到好多相关的信息及各式免费代码。但当人们想要

在windows平台上开发防火墙时可就有点困难了,就那么可怜的一点点资料信息,至于免费代码,几乎是不

可能的。
    所以我决定写这篇关于在windows 2000/xp平台上开发一个简单功能的防火墙文章去帮助那些个对这方

面有兴趣的人。
 
背景
    微软公司在它发布的windows 2000 ddk中,已经包含了一个新的网络驱动类:filter-hook driver。

用它你可以建立过滤所有通信的接口。
 
filter-hook driver
    正如我刚才所说的,filter-hook driver是在微软的windows 2000 ddk中被引入进来。但实际上它并

不是一个新的网络驱动类,它只是一个ip过滤功能的驱动。
    事实上filter-hook driver不是一个网络驱动类,它是属于核心驱模型。在这个filter-hook driver

中我们只实现了一个回调函数,我们只是在filter-hook driver中注册这个回调函数。当我们实现并注册

好回调函数后,ip过滤驱动就会在数据包到达和发送的时候调用它。
我们把实现步骤归纳为如下几步:
1、建立一个filter-hook driver。在这里你必须建立一个核心模式驱动,你将任选名字,dos名字以及其

它一些个属性,不一定是必须的,但我建议你这样做。
2、如果我们想安装过滤功能,首先我们必须得到一个ip过滤驱动的指针。这便是第二步。
3、我们已经得到了指针,现在我们能正确的安装我们的过滤功能函数。我们将发送一个特定的ipr,里面

将包括我们的过滤函数的指针。
4、过滤包!!!
5、当我们完成过滤后,我们必须注销过滤功能函数。我们可以注册一个空指针来替换我们的过滤函数指针


哦,就上面五个步骤,看起来似乎很简单,但是我如何生成一个核心模式驱动呢?如何得到ip过滤驱动的

指针呢?如何…………,稍等一下,我将会解释上面所有的步骤并列出源码例子。
 
建立核心模式驱动
    filter-hook driver是一个核心模式驱动,因此我们将要建立一个核心模式的驱动程序。但这篇文章

不是“教你在5分钟内如何开发核心驱动程序”的指南,所以我将假设读者已据有以上知识。
    filter-hook驱动据有一个典型的核心驱动结构。
1、我们将为驱动程序建立一个典型的驱动入口(driverentry),为irp设置标准分发例程(dispatch, load,

unload, create...),为方便与应用程序通讯建立一个符号连接。
2、标准分发例程将管理irp。在你开使编写代码前,我建议你先建立ioctl以便应用程序来操纵驱动。在我

的例子里,我实现了4个ioctl编码:start_ip_hook(注册一个过滤功能函数),stop_ip_hook(注销过滤功

能函数),add_filter(安装一个新的过滤规则),clear_filter(清空所有过滤规则)
3、为了我们的驱动,我们必须实现一个或更多的过滤功能函数。
    我建议你用一个程序来生成典型的核心驱动程序框架,因此你只须在里面填上你的功能代码既可,比

如我就用了 quicksys 来生成我的例子工程。
    你将看到我自己产现的驱动结构,如下代码所示:

ntstatus driverentry(in pdriver_object driverobject,
                in punicode_string registrypath)
{

    //....

    dprintf("drvfltip.sys: entering driverentry\n");

    //we have to create the device
    rtlinitunicodestring(&devicenameunicodestring, nt_device_name);

    ntstatus = iocreatedevice(driverobject,
                0,
                &devicenameunicodestring,
                file_device_drvfltip,
                0,
                false,
                &deviceobject);



    if ( nt_success(ntstatus) )
    {
        // create a symbolic link that win32 apps can specify to gain access
        // to this driver/device
        rtlinitunicodestring(&devicelinkunicodestring, dos_device_name);

        ntstatus = iocreatesymboliclink(&devicelinkunicodestring,
                                        &devicenameunicodestring);

        //....

        // create dispatch points for device control, create, close.

本文关键:网络 防火墙
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top