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;

}

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

//开始进行封包过滤

bool StartIpHook()

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

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

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

  为了能够输出安全日志,必须让主程序获得驱动程序中的封包信息。使用信号量机制可以很方便的实现驱动程序和非托管代码间的信息传递,那么对托管代码呢?这需要向.NET应用程序传递非托管的数据类型ACCESS_INFO。在NByte.h中,是这样定义这个ACCESS_INFO结构的:

typedef struct _ACCESS_INFO

{
 USHORT protocol;
 ULONG sourceIp;
 ULONG destinationIp;
 USHORT sourcePort;
 USHORT destinationPort;
}ACCESS_INFO;

  显然,直接传递非托管数据类型是不可以的,需要转换一下。首先,在IoCtrl类中定义了几个要传递的封包信息参数:

public __gc class IoCtrl
{
 public:
  USHORT protocol; //网际协议类型
  ULONG sourceIp; //源IP地址
  ULONG destinationIp; //目的IP地址
  USHORT sourcePort; //源端口
  USHORT destinationPort; //目的端口
  ………………
}

  然后,在GetAccessInfo()函数中来给这些参数赋值:

void GetAccessInfo()
{
 ACCESS_INFO ai;
 bool result=(ReadIo(GET_INFO,&ai,sizeof(ai))==SUCCESS);
 this->protocol=ai.protocol;
 this->sourceIp=ai.sourceIp;
 this->destinationIp=ai.destinationIp;
 this->sourcePort=ai.sourcePort;
 this->destinationPort=ai.destinationPort;
}

  既然在IoCtrl类中获得了这些信息,但是需要把它们封装成主程序容易处理的数据类型,这样,用C#实现了InfoEvent类用来封装这些信息:

//本类封装了数据包的详细信息,可以通过事件实现对它的模块间传递。

public class InfoEvent:EventArgs
{
 string sInfo; //用来存放输出信息的私有成员
 public int pLength; //CommonFunction.sPort数组的长度
 public ushort protocol; //网络通信协议类型
 public uint sourceIp; //数据包的源IP
 public uint destinationIp; //数据包的目的IP
 public ushort sourcePort; //数据包的源端口
 public ushort destinationPort; //数据包的目的端口
 ………………………………
}

  下面在用托管C++实现的InfoProvider驱动程序信息提供者类中把个InfoEvent类的对象传递给主程序,需要使用一个委托生成一个事件:

//声明委托事件,用来向主程序传递数据。

__delegate void DriverInfo(Object* sender, InfoEvent* e);

//声明响应事件函数。

__event DriverInfo* OnDriverInfo;

  然后在InfoProvider驱动程序信息提供者类中定义一个方法,在主程序中以线程的方式运行这个方法,在这个方法中使用了事件函数OnDriverInfo:

//用来获得驱动程序信息的进程,在主程序中将开启该进程。

void GetInfoThreadProc()
{
 this->hEvent=OpenEvent(SYNCHRONIZE,FALSE,"NBEvent");
 if(!ic->GetDriverHandle())
 {
  return;
 }

 while(true)
 {
  f(!hEvent)
  ExitThread(0);
  WaitForSingleObject(this->hEvent,INFINITE);
  nPackets++;
  ic->GetAccessInfo();
  ic->ResetEvent();
  //定义一个主程序可以识别的对象,通过OnDriverInfo传给主程序。
  InfoEvent*ie=new InfoEvent(ic->protocol,ic->sourceIp,ic->destinationIp,ic->sourcePort,ic->destinationPort);

  OnDriverInfo(this,ie);
 }

 ic->CloseDriverHandle();
 return;
}

  在主程序中,会开启这个进程并定义了OnDriverInfo的处理函数DealWithInfo:

pInfo=new InfoProvider();

//开启与驱动交换信息的进程

FilterThread=new Thread(new ThreadStart(pInfo.GetInfoThreadProc));
FilterThread.IsBackground=true;
FilterThread.Start();
pInfo.OnDriverInfo+=new InfoProvider.DriverInfo(DealWithInfo);

  这样主程序就可以在DealWithInfo函数中加入对InfoEvent对象的处理了。可见,通过中间模块IoCtrl的转换,便实现了.NET主程序对驱动程序中非托管数据类型的获取和处理。

转载于:https://www.cnblogs.com/spdevelop/archive/2005/10/31/265430.html

用C#开发网络防火墙技术分析相关推荐

  1. 网络尖兵技术分析及应对

    网络尖兵技术分析及应对 转载于:https://blog.51cto.com/306869/58308

  2. python写炒股软件_在线配资,【原创】用python开发股票自动技术分析的软件(

    一.准备一个沪深股市的股票代码和简称的对照表,存在csv文件或者txt文件中. 二.读取这个文件,循环将所有股票的历史数据都下载到本地,保存为名字为股票代码的csv文件. 三.逐个读取所有这些csv文 ...

  3. python网络爬虫_python小知识,基于Python 的网络爬虫技术分析

    在现阶段大数据的时代中,想要实现对数据的获取和分析,要先具备足够的数据源,网络爬虫技术就为其数据获取提供了良好的条件,且还能够实现对数据源的目的性采集. 在网络爬虫技术应用中,Python 脚本语言的 ...

  4. 网络防火墙技术及其发展趋势

    防火墙是由软件.硬件构成的系统,是一种特殊编程的路由器,用来在两个网络之间实施接入控制策略.接入控制策略是由使用防火墙的单位自行制订的,为的是可以最适合本单位的需要.它对两个或多个网络之间传输的数据包 ...

  5. 四川智汇蓝图科技有限公司的四大网络防火墙技术

    大家都知道网络防火墙分为四种类型,第一种:集成防火墙功能的路由器,第二种:集成防火墙功能的代理服务器,第三种专用的软件防火墙,第四种:专用的软硬件结合的防火墙.下面就让我们来分别了解一下这些防火墙技术 ...

  6. python股票分析源码_用python开发股票自动技术分析的软件

    一.配置环境 python是个强大的工具,还有很多插件包可以用,所以完全可以考虑用python来编程实现股票的自动技术分析. 第一步就是实现股票历史数据的获取,这个有安装包TuShare可以用.首先是 ...

  7. SDVN(软件定义虚拟网络)技术分析

    SDVN(软件定义虚拟网络)技术旨在构建承载于现有的和未来的Internet之上的全球分布式智能边缘网络,实现人与物的可靠.高速.安全.互利连接,让数据因网而连通,价值因链而流动. SDVN通过通过M ...

  8. iOS开发——网络使用技术OC篇网络爬虫-使用正则表达式抓取网络数据

    网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看 ...

  9. HTTP Live Streaming直播源代码软件开发(iOS直播)技术分析与实现

    HLS技术要点分析 HTTP Live Streaming(HLS)是苹果公司(Apple Inc.)实现的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播,主要应用在iOS系统,为iOS设备( ...

最新文章

  1. 如何将Mac OS X10.9下的Python2.7升级到最新的Python3.3
  2. Android Jetpack组件之ViewModel使用
  3. 使用 MDT2008 轻量部署进行 Windows XP SP2 简单部署
  4. windows主机防护
  5. maven使用testng_使用Maven Failsafe和TestNG分别运行单元测试和集成测试
  6. 国资委发文!10本书讲透数字化时代新机遇
  7. 我花了一年时间来学机器学习
  8. Direct3D提高篇:HLSL编程实现PhotoShop滤镜效果 - 锐化模糊
  9. 【java读书笔记】——java开篇宏观把控 + HelloWorld
  10. Spark Streaming 源码详解
  11. Section 2.2
  12. jenkins根据已打包的镜像,自动生成正式镜像
  13. Migrate to vc8(vs2005)
  14. 挑战性题目DSCT401:全源最短路径Floyd算法的并行实现
  15. 实现xml和json接口(第一篇)
  16. AiLight – A hackable RGBW light bulb
  17. 小麦(Wheat)-玉米(Maize)-水稻(Rice) 数粒软件
  18. 区块链三加一告诉你如何快速了解区块链入门技术?
  19. 专题详解-5G接入控制:CAG新特性(3)-end
  20. R语言基于方差分析ANOVA检验模型拟合度(Fit Test)实战:检验同一数据集简单模型和复杂模型的拟合度差异

热门文章

  1. TCP和UDP的最完整的区别
  2. HEOI 2012 旅行问题
  3. AS整理代码快捷键 ctl+alt+L
  4. hbase源码系列(十二)Get、Scan在服务端是如何处理?
  5. java通过url读取远程数据并保持到本地
  6. 36.Linux软件管理--YUM工具
  7. C标准库stdlib.h概况
  8. 部署 instance 到 VXLAN - 每天5分钟玩转 OpenStack(112)
  9. 特殊的Windows消息
  10. OpenSuse Linux 的单用户模式