导读:
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主程序对驱动程序中非托管数据类型的获取和处理。
本文转自
http://study.qqcf.com/web/224/24024.htm
分享到:
相关推荐
用C#开发网络防火墙技术分析,在家一起学习一起进步
C#ie实现自动下载示例、C#Socket基本编程、C# WinForm制作异形窗体与控件、C# 编写定时关机程序、C#对注册表的操作...C#开发网络防火墙技术分析、c#读取硬盘序列号、C#编写发送电子邮件、C#版ftp方法实现类的代码.........
里面包含C#语言的多种用法,包括FT平上传,远程抓去WEB缓存,查看硬件序列号,开发网络防火墙技术分析,木马寄存方式收集等等
本报告旨在通过对C#语言开发的网络聊天系统的深入分析,探讨其架构设计、关键技术实现以及未来发展方向等方面的内容。 #### 二、系统架构概述 ##### 2.1 架构设计原则 在进行C#网络聊天系统的架构设计时,遵循...
在本资源中,"C# 数据库系统开发 案例精选 光盘源文件附带sqlserver2005数据库文件" 提供了一系列关于使用C#语言进行数据库系统开发的实战案例,其中包括了源代码和配套的SQL Server 2005数据库文件。这个压缩包显然...
总之,远程防御代码C#开发是一项复杂而重要的任务,它涉及到网络安全的多个层面。理解并熟练运用这些技术和工具,对于构建安全的远程控制系统至关重要。通过不断学习和实践,开发者可以提高系统的安全性,保护用户的...
《C#项目开发实录》-03_企业电话客服系统源码是一个深入探讨C#编程语言在实际项目中的应用的资源,特别是针对企业电话客服系统的构建。这个系统旨在提高企业的客户服务效率,优化客户沟通流程,提升用户体验。下面将...
C#作为.NET框架的主要编程语言,常被用于开发此类系统。本项目以C#为核心,结合Windows 2003 Server服务器操作系统、Visual Studio .NET 2005开发环境以及SQL Server 2000数据库管理系统,构建了一个完整的OA办公...
【C#端口扫描器源码】是一种使用...理解并分析这样的源码可以帮助我们深入学习C#的网络编程,了解Socket通信的细节,以及如何利用多线程或异步编程来优化性能。同时,对于网络安全和网络服务的监控也有一定的实践意义。
通过阅读和分析源代码,可以学习到如何组织代码结构,如何处理网络通信过程中的各种情况,以及如何使用.NET框架提供的类库来简化开发过程。同时,这个项目也可以作为一个基础,进一步扩展到更复杂的功能,如断点续传...
《C#应用程序开发全程演练——从灵感到实现》这一标题暗示了本书将带领读者经历一个完整的C#应用程序开发过程,从最初的概念构思到最终产品的实现,涵盖了创意的萌芽、需求分析、设计架构、编码实现、测试调试、部署...
在IT领域,C#是一种广泛使用的面向对象的编程语言,尤其在开发Windows应用程序和游戏时。本主题聚焦于一个特定的应用实例:一个基于C#的远程控制软件源码。远程控制软件允许用户通过网络从一台计算机操作另一台...
C#是一种强大的面向对象的编程语言,尤其适用于开发Windows应用程序和网络应用。 一、基础知识 1. **TCP/IP协议**:端口扫描依赖于TCP/IP协议栈,它定义了互联网上的数据通信规则。端口是TCP/IP协议中的逻辑通道,...
以上四大案例覆盖了ASP.NET和C#开发的多个方面,从基础的用户认证到复杂的实时通信,涵盖了Web开发的多个核心领域。对于准备毕业设计的大学生而言,这些案例不仅能提供实际的项目经验,也能深入理解Web开发的各个...
在聊天室服务器开发中,你需要了解类、对象、方法、事件等基础知识,以及如何使用C#进行网络编程。 2. **Socket编程**:Socket是网络通信的基本单元,用于实现两台计算机之间的连接。在聊天室服务器端,你需要创建...
在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用和.NET框架相关项目时。本主题聚焦于利用C#实现一个图形化界面FTP(File Transfer Protocol)上传程序。FTP是互联网上用于文件传输的标准协议,...
来电防火墙,也被称为来电过滤,是一种用于管理手机或固定电话接听权限的软件技术。它主要功能是通过设定特定的规则来控制哪些来电可以被接听,哪些需要被阻止或者自动拒接。这样的工具对于个人隐私保护和商业环境下...
在日常开发中,处理Excel文件的需求非常常见,无论是数据导出、报表生成还是数据分析,掌握如何使用C#进行Excel操作都是必不可少的技能。本文将详细介绍一个C#操作Excel的具体实例,并探讨在IIS环境下正确设置Excel...