
下载 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.