用C#开发网络防火墙技术分析

来源:互联网 发布:程序员最喜欢的编辑器 编辑:程序博客网 时间:2024/04/30 12:00

  N-Byte网络守望者是一款单机版网络安全工具,简言之,就是一个用.NET开发的个人版防火墙。在N-Byte网络守望者1.0版的开发中,使用了NDIS Hook Driver技术来实现网络封包过滤功能,这使N-Byte网络守望者能够在网络层过滤网络封包,从而实现强大的功能。   由于软件的主程序是用C#写的,C#中没有提供具有类似DeviceIoControl函数功能的驱动设备控制函数,而NDIS Hook Driver技术下的驱动程序是用DDK下的C语言写的,为了能够实现主程序对驱动程序的控制和相互通信,采用了以下设计方案:

  在以上方案中,需要一个负责主程序与NDIS Hook Driver驱动程序通信与控制的模块DriverDll.dll,并用C#编写的一个封装驱动程序中封包信息的模块,可以发送这个驱动程序信息到主程序,主程序可识别并操作模块中的数据类型。

  在.NET应用程序使用驱动程序的问题上,面临着两个问题:

  1.怎样实现.NET应用程序控制驱动程序的功能?

  2.怎样从驱动程序向.NET应用程序传递非托管的数据类型?

  以下是我们就这些问题的详细解决方法:

  怎样实现.NET应用程序控制驱动程序的功能?

  使用托管C++编写的DriverDll.dll来实现对驱动程序的直接控制,而主程序通过调用其中的方法来实现对驱动程序的间接控制。比如在NByte.h文件中定义了START_IP_HOOK常数用来作为传给驱动程序用来开启驱动程序封包过滤功能的参数,下面在托管C++模块中定义了IoCtrl托管类并定义了下面的向缓冲区写入参数的方法:

  //向缓冲区写入数据。

  DWORD WriteIo(DWORD code,PVOID buffer,DWORD count)

  {

  if(hDriverHandle == NULL)

  return ERROR_DRIVER_HANDLE;

  DWORD bytesReturned;

  BOOL returnCode = DeviceIoControl(hDriverHandle,

  code,

  buffer,

  count,

  NULL,

  0,

  &bytesReturned,

  NULL);

  if(!returnCode)

  return ERROR_IO_CTRL;

  return SUCCESS;

  }

  当然直接使用这个方法不太方便,所以定义一个公有函数,用来提供给主程序调用:

http://www.zhoushan.cn/yy/mhjk/1225659.html
http://www.zhoushan.cn/yy/mhjk/1225649.html
http://www.zhoushan.cn/yy/mhjk/1225645.html
http://www.zhoushan.cn/yy/mhjk/1225803.html
http://www.zhoushan.cn/yy/mhjk/1225671.html
http://www.zhoushan.cn/yy/mhjk/1225669.html
http://www.zhoushan.cn/yy/mhjk/1225665.html
http://www.zhoushan.cn/yy/mhjk/1225662.html
http://www.zhoushan.cn/yy/mhjk/1225657.html
http://www.zhoushan.cn/yy/mhjk/1225655.html
http://www.zhoushan.cn/yy/mhjk/1225653.html
http://www.zhoushan.cn/yy/mhjk/1225651.html
http://www.zhoushan.cn/yy/mhjk/1225646.html
http://www.zhoushan.cn/yy/mhjk/1225800.html
http://www.zhoushan.cn/yy/mhjk/1225793.html
http://www.zhoushan.cn/yy/mhjk/1225743.html
http://www.zhoushan.cn/yy/mhjk/1225742.html
http://www.zhoushan.cn/yy/mhjk/1225738.html
http://www.zhoushan.cn/yy/mhjk/1225736.html
http://www.zhoushan.cn/yy/mhjk/1225732.html
http://www.qdxw.com.cn/yx/dwwf/1980242.html
http://www.qdxw.com.cn/yx/dwwf/1980217.html
http://www.qdxw.com.cn/yx/dwwf/1980165.html
http://www.qdxw.com.cn/yx/dwwf/1980144.html
http://www.qdxw.com.cn/yx/dwwf/1980122.html
http://www.qdxw.com.cn/yx/dwwf/1980105.html
http://www.qdxw.com.cn/yx/dwwf/1980251.html
http://www.qdxw.com.cn/yx/dwwf/1980359.html
http://www.qdxw.com.cn/yx/dwwf/1980347.html
http://www.qdxw.com.cn/yx/dwwf/1980334.html
http://www.qdxw.com.cn/yx/dwwf/1980330.html
http://www.qdxw.com.cn/yx/dwwf/1980316.html
http://www.qdxw.com.cn/yx/dwwf/1980299.html
http://www.qdxw.com.cn/yx/dwwf/1980296.html
http://www.qdxw.com.cn/yx/dwwf/1980280.html
http://www.zhiyin.cn/yx/yyqy/3302674.html
http://www.zhiyin.cn/yx/yyqy/3302660.html
http://www.zhiyin.cn/yx/yyqy/3302651.html
http://www.zhiyin.cn/yx/yyqy/3302637.html
http://www.zhiyin.cn/yx/yyqy/3302632.html
http://www.zhiyin.cn/yx/yyqy/3302625.html
http://www.zhiyin.cn/yx/yyqy/3302717.html
http://www.zhiyin.cn/yx/yyqy/3302710.html
http://www.zhiyin.cn/yx/yyqy/3302705.html
http://www.zhiyin.cn/yx/yyqy/3302727.html
http://www.zhiyin.cn/yx/yyqy/3302505.html
http://www.zhiyin.cn/yx/yyqy/3302480.html
http://www.zhiyin.cn/yx/yyqy/3302472.html
http://www.zhiyin.cn/yx/yyqy/3302452.html
http://www.zhiyin.cn/yx/yyqy/3302447.html
http://www.js0573.com/yx/dzdy/3684122.html
http://www.js0573.com/yx/dzdy/3682385.html
http://www.js0573.com/yx/dzdy/3682359.html
http://www.js0573.com/yx/dzdy/3682371.html
http://www.js0573.com/yx/dzdy/3682352.html
http://www.js0573.com/yx/dzdy/3682346.html
http://www.js0573.com/yx/dzdy/3682341.html
http://www.js0573.com/yx/dzdy/3682336.html
http://www.js0573.com/yx/dzdy/3682319.html
http://www.js0573.com/yx/dzdy/3682303.html
http://www.js0573.com/yx/dzdy/3682337.html
http://www.js0573.com/yx/dzdy/3682332.html
http://www.js0573.com/yx/dzdy/3682325.html
http://www.js0573.com/yx/dzdy/3682333.html
http://www.js0573.com/yx/dzdy/3682330.html

  //开始进行封包过滤

  bool StartIpHook()

  {

  return (WriteIo(START_IP_HOOK, NULL, 0)==SUCCESS);

  }

  这样,只要在主程序中声明IoCtrl的对象ic,就可以通过ic.StartIpHook()就可以实现对驱动程序过滤功能的开启,用同样的方法也可以实现对驱动程序进行其它操作,比如添加、修改封包过滤规则等。

0 0