APP下载

个人防火墙系统内部模块间通讯的设计与实现

2012-03-20谢秀维

网络安全技术与应用 2012年4期
关键词:封包驱动程序缓冲区

谢秀维

中国人民银行沧州中心支行科技科 河北 061001

0 引言

随着Internet不断的发展和普及,网络信息安全问题越来越受到人的关注,时常让人担忧。攻击者利用计算机硬件、软件、网络设备等安全漏洞进行攻击。攻击事件一旦发生就可能导致有关的服务中断、重要商业信息失窃、研究机构的重要数据丢失甚至涉及到国家机密等,其灾难性后果不言而喻。防火墙是网络信息安全的主要技术手段之一,个人防火墙得到了广泛应用。

由于防火墙涉及系统文件SYS、动态连接库DLL和用户界面应用程序EXE,因此,不同进程间数据共享就变得至关重要。DLL安装在应用程序和驱动程序之间,为上层应用程序提供网络连接服务。

DLL与EXE及其它调用它的进程都需要共享控管规则数据,但这些数据都不是固定长度的,因此选用了内存映射的方法。此外,由于DLL和SYS都是对截获的封包缓冲区进行操作,如采用全局变量则会降低模块的独立性,而采用内存映射正好解决了这一问题。

1 数据共享

因为 Windows2000不允许应用层的程序直接访问系统内存的地址空间,为了在EXE,DLL和SYS之间共享内存,实现内存共享的原理是:首先用驱动程序(SYS)申请内存空间,SYS中申请的内存在系统地址空间(>=0x80000000),为了让EXE和DLL能够访问这个空间,需要将系统地址空间映射到用户地址空间(<0x80000000),具体的步骤是:

(1) 在SYS中申请内存空间,代码如下:

SystemVirtualAddress=MmAllocateContiguousMemory(NumberOfBytes,HighestAcceptableAddress );

(2) 申请一个MDL结构,代码如下:

Mdl = IoAllocateMdl (SystemVirtualAddress, NumberOfBytes,FALSE,FALSE, NULL);

(3) 在MDL结构中标识内存页

①如果申请内存时使用了非分页池(non-paged pool),使用下面的代码:

MmBuildMdlForNonPagedPool (Mdl);

②如果申请内存时使用了分页池(paged pool),使用下面的代码:

MmProbeAndLockPages (Mdl, KernelMode, IoWriteAccess);

(4) 将锁定的内存页映射到应用层(EXE或DLL)的用户地址空间,代码如下:

UserVirtualAddress=MmMapLockedPages (Mdl, UserMode);

上面的4个步骤可以在DriverEntry或者DispatchRoutine中运行。

释放内存大致是执行与上面相反的过程。步骤如下:

(1) 在用户进程上下文环境中执行下面的代码,解除到用户地址空间的映射:

MmUnmapLockedPages (UserVirtualAddress, Mdl);

(2) 如果使用MmProbleAndLockPages锁定了内存空间,使用下面的代码解锁:

MmUnlockPages (Mdl);

(3) 释放MDL,代码如下: IoFreeMdl (Mdl);

(4) 释放系统空间,代码如下:

MmFreeContiguousMemory (SystemVirtualAddress);

或者:ExFreePool (SystemVirtualAddress);

在上述四个步骤中,第一步必须在用户进程上下文环境中执行,2, 3, 4步可以在DriverEntry或者DispatchRoutine中运行。

2 EXE与DLL之间的接口

NETLAB.EXE与NETLAB.DLL主要需要进行控管规则数据和封包数据的共享,另外需要一些其它辅助操作。它之间的接口函数为XfIoControl,此函数在NETLAB.DLL的TCPIPDOG.CPP模块。

NETLAB.EXE通过LoadLibrary打开NETLAB.DLL,然后通过GetProcAddress得到XfIoControl函数的地址,以后NETLAB.EXE便通过XfIoControl函数完成与NETLAB.DLL的通信。XfIoControl支持的操作如下:

(1) 控制代码:IO_CONTROL_SET_NETLAB_PROCESS_ID

参数含义:IoControl->DWord:进程ID

IoControl->DWord2:进程完整路径指针

(2) 控制代码:IO_CONTROL_SET_WORK_MODE

参数含义:IoControl->Byte:总工作模式

(3) 控制代码:IO_CONTROL_GET_SESSION_FILE_HANDLE

参数含义:IoControl->DWord:返回封包缓冲区的地址

作用:NETLAB.EXE从NETLAB.DLL得到封包缓冲区的地址,由于内存映射文件不同进程映射的地址不同,所以此参数不能真正作为地址来用,只是用来区分NETLAB.DLL是否成功创建了封包缓冲区,等于0表示否定,大于0表示肯定。

3 SYS与DLL、EXE之间的接口

驱动程序模块或者NETLABPCK.SYS与NETLAB.EXE和NETLAB.DLL之间主要需要进行控管规则数据、封包数据、网上邻居名字列表等数据的共享,另外需要一些其它辅助操作。它们之间的接口函数为OnW32DeviceIoControl,此函数在NETLABPCK 的NETLABPCK.C模块。

NETLAB.EXE通过CreateFile打开NETLABPCK.SYS,然后通过DeviceIoControl完成与NETLABPCK的通信。

Typedef struct tagIOCTLParams {

DWORD dioc_IOCtICode;

PVOID dioc_InBuf;

DWORD dioc_c_cblnBuf;

PVOID dioc_OutBuf;

DWORD dioc_c_bOutBuf;

} IOCTLPARAMS,* PIOCTLPARAMS

设备输入输出处理函数为OnW32Deviceiocontrol(PIOCT LPARAMS,pVtoolsD),根据pVtoolsD-> dioc_IOCtICode不同而进行不同操作,具体分为以下情况:

(1) 控制代码:IOCTL_NETLABPCK_MALLOC_ACL_BUFFER

参数含义:

pVtoolsD->dioc_InBuf: 指向DWORD的指针,需要申请的控管规则内存空间大小。

(2) 控制代码:IOCTL_NETLABPCK_FREE_ACL_BUFFER

作用:NETLAB.EXE通知NETLABPCK释放为控管规则申请的内存空间。

(3)控制代码:IOCTL_NETLABPCK_GET_BUFFER_POINT

参数含义:

pVtoolsD->dioc_dioc_OutBuf:指向 PACKET_BUFFER_POINT结构的缓冲区指针,用来返回封包缓冲区的地址、读/写缓冲区的索引地址和封包缓冲区能容纳封包记录的最大个数。

作用:NETLAB.EXE通过这个控制代码,从NETLABPCK取得封包缓冲区的地址。封包缓冲区由NETLABPCK生成和维护,NETLAB.EXE负责提取信息并用来显示、询问、报警和保存日志。

(4) 控制代码:IOCTL_NETLABPCK_DELETE_SPI_PORT

参数含义:

pVtoolsD->dioc_InBuf:指向WORD类型的指针,保存要删除的SPI端口。

作用:NETLAB.DLL通过NETLABPCK删除共享内存的端口列表。当经过NETLAB.DLL过滤的端口完成通信而释放时,通过这个控制代码删除共享内存的端口列表,告诉驱动程序,这个端口已经不再被NETLAB.DLL过滤,驱动程序需要负责对这个端口进行过滤。

(5) 控制代码:IOCTL_NETLABPCK_GET_NAME_F ROM_IP

参数含义:pVtoolsD->dioc_InBuf: 要查询的IP地址;

pVtoolsD->dioc_OutBuf: 用来返回查询得到的网上邻居名字。

作用:FITLER.EXE通过这个控制代码,从IP地址查询得到网上邻居的名字。

4 总结

随着Internet技术的发展,网络安全将会面临更加严峻的挑战。本文从技术角度出发,对防火墙内部主要模块间的通讯技术进行了详细的分析和介绍,希望能对不同的用户提供参考。

[1] Keith E.Strassberg,Richard J.Gondek,Gary Rollie等著.李昂等译.防火墙技术大全.北京:机械工业出版社.2003.

[2] Terry William Ogletree 著.李之棠等译.防火墙的原理与实施.北京:电子工业出版社.2001.

[3] 博嘉科技.LINUX防火墙技术探秘.北京:国防工业出版社.2002.

[4] 周宏,刘克勤.新型主机防火墙模型的研究.现代电力.2003.

猜你喜欢

封包驱动程序缓冲区
中药封包在急诊老年急性胃肠炎患者中的临床应用
护肤 巧用保鲜膜
阻止Windows Update更新驱动程序
无冲突规则校园网络安全系统的设计
计算机硬件设备驱动程序分析
基于网络聚类与自适应概率的数据库缓冲区替换*
一类装配支线缓冲区配置的两阶段求解方法研究
关键链技术缓冲区的确定方法研究
初涉缓冲区
妙用鼠标驱动