N-Byte网络守望者是一款由我们团队开发的单机版网络安全工具,简言之,就是一个用.NET开发的个人版防火墙。在N-Byte网络守望者1.0版的开发中,我们使用了NDIS Hook Driver技术来实现网络封包过滤功能,这使我们的N-Byte网络守望者能够在网络层过滤网络封包,从而实现强大的功能。
在以上方案中,我们需要一个负责主程序与NDIS Hook Driver驱动程序通信与控制的模块DriverDll.dll,并用C#编写的一个封装驱动程序中封包信息的模块,可以发送这个驱动程序信息到主程序,主程序可识别并操作模块中的数据类型。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
在.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主程序对驱动程序中非托管数据类型的获取和处理。
相关推荐
- 许多大型企业和组织都在其内部系统中使用.NET框架来构建稳定可靠的应用程序。 ### .NET框架程序设计基础 1. **基本概念**: - 类:.NET框架中的所有数据都是通过类的形式来表示的,每个类都定义了一组特定的...
【面向.NET的Web应用程序设计】是针对微软技术栈中的一项重要技能,主要涉及使用.NET框架构建高效、可扩展且安全的Web应用。这个主题涵盖了多种技术和概念,包括ASP.NET、Web Forms、MVC、Web API以及.NET Core。在...
.NET框架是微软推出的一个重要软件开发平台,它为构建和运行各种类型的应用程序提供了丰富的类库和运行时环境。这本书通过通俗易懂的语言,帮助读者理解和掌握.NET框架的核心概念和技术。 首先,本书会介绍.NET框架...
在.NET开发环境中,与MySQL数据库进行交互通常需要借助特定的驱动程序,这使得应用程序能够执行SQL语句、读取数据以及管理数据库。标题提到的".net连接MYSQL驱动类"主要涉及两个关键的驱动类,它们是.NET Framework...
VB.NET是.NET框架支持的一种面向对象的编程语言,以其简洁明了的语法深受开发者喜爱。 在使用.NET精简框架和VB.NET进行程序设计时,开发者需要注意以下关键知识点: 1. **精简框架特性**:了解.NET精简框架与完整...
《MFC应用程序在.NET框架下的扩展》这本书着重探讨了如何将传统的MFC(Microsoft Foundation Classes)应用程序与现代的.NET框架相结合,以实现更强大的功能和更高效的开发。MFC是微软提供的一套C++库,用于构建...
在IT行业中,开发高效、可维护的软件系统是至关重要的,而Ibatis.net和Spring.Net框架就是这样的工具,它们能够帮助开发者实现数据访问层的高效管理。本文将深入探讨这两个框架,并结合提供的"IbatisNetTest"文件名...
为了更好地管理和控制硬件资源,Windows CE.NET提供了一套完整的设备驱动程序开发框架。本文将详细介绍基于Windows CE.NET环境下的设备驱动程序开发,包括其概念、结构、特点及常用开发工具,并以触摸屏驱动程序为例...
此外,.NET框架的跨平台能力也日益增强,通过.NET Core和.NET 5/6等版本的发布,使得基于.NET的应用程序可以在Windows、Linux和macOS等多种操作系统上无缝运行,极大地拓宽了.NET技术的应用范围。 总之,...
ASP.NET框架是由微软开发的一种强大的Web应用程序开发框架,它基于.NET Framework,主要使用C#语言进行编程。这个框架为开发者提供了构建动态、数据驱动的Web应用程序所需的全部工具和功能。 在ASP.NET中,你可以...
ASP.NET框架是微软公司推出的一款用于构建Web应用程序的强大工具,其设计目的是为了简化Web开发过程,提高开发效率。在本文中,我们将深入探讨ASP.NET框架的核心特性,以及"龙博"这一富客户端开发框架如何为开发者...
标题中的“一个应用程序框架,您可以将它集成到任何 .NET/C# 应用程序中”指的是一种软件开发工具,这种框架旨在简化.NET和C#的开发过程,提供了一种可扩展和模块化的方式来构建应用程序。这样的框架通常包括一套...
64位操作系统与.NET框架4.0是计算机技术中的重要组成部分,它们之间的关系密切,尤其在软件开发和执行环境中起着关键作用。64位操作系统是专为在64位处理器上运行而设计的,其核心特性是能够处理更大的内存地址空间...
.NET框架支持构建不同类型的应用程序,包括控制台应用、Windows窗体应用、Web表单应用以及Web服务等。此外,.NET框架还提供了强大的数据访问和XML处理能力,使开发者能够轻松处理数据库连接、数据检索、XML解析等...
Ext.NET框架的核心在于其丰富的UI组件集合,这些组件包括表格、面板、窗口、菜单、表单、图表等,它们为开发者提供了构建功能丰富的Web应用程序所需的一切。通过这些组件,开发者可以轻松地创建交互性强、响应速度快...
ASP.NET Web应用程序开发是Microsoft .NET框架中的一个关键组成部分,用于构建动态、交互式的Web应用程序。这个领域涵盖了大量的技术和概念,旨在提供一个高效且安全的平台,让开发者能够创建功能丰富的网页应用。...
标题 "托管ORACLE驱动" 指的是在.NET框架中使用Oracle数据库的托管驱动程序,这意味着开发者无需在服务器或开发环境中安装完整的Oracle客户端软件。在.NET 4.0环境下,Oracle提供了一种名为ODP.NET(Oracle Data ...
在编程领域,Visual C++.NET 是一款强大的开发工具,尤其在构建系统级应用程序,如驱动程序方面,它具有显著的优势。本篇文章将深入探讨Visual C++.NET 在开发驱动程序方面的核心概念、步骤以及最佳实践。 驱动程序...
ASP.NET(C#)小程序是基于微软的.NET框架开发的Web应用程序。.NET框架是一个全面的开发平台,提供了构建、运行各种类型的应用程序所需的服务。C#是.NET框架的主要编程语言,以其面向对象的特性、丰富的库支持以及现代...
VB.NET是Visual Basic的现代版本,特别适用于构建Web应用程序,因为它支持ASP.NET框架,该框架是.NET Framework中用于构建Web应用的组件。同时,"Web"标签表明我们将探讨如何将VB.NET应用于创建Web应用程序,包括...