EMAIL:flashsky@xfocus.org
站点:www.xfocus.net www.shopsky.com
转载请注明原作者安全焦点
在普通的WINDOWS 2000下实现实现包过滤的方法主要是书写NDIS过滤驱动程序,需要的技巧比较高,而且烦琐,需要考虑很多细节。但是对于很多应用而言,只需要能更方便的对ip包进行过滤处理,其实NDIS对于ip包的过滤提供一种书写过滤钩子驱动的方式,主要方法是:
驱动中建立一个普通的设备,然后通过IOCTL_PF_SET_EXTENSION_POINTER操作将你的内核模式的过滤钩子挂接到系统默认的ip过滤驱动上,这样你就可以在自己的过滤钩子里面实现完整的基于包的各种分析和过滤的处理了。
下面就是一个完整的NDIS过滤钩子驱动的代码拒绝所有外来的TCP带S的建立连接的请求。
注意事项:
1。需要在DDK环境中编译
2。需要修改注册表中LMHK\System\\CurrentControlSet\\Services\\IPFILTERDRIVER的START类型为3,让他随系统启动而启动
3。编译生成了sys文件后需要拷贝到winnt\system32\drivers目录下
4。需要运行一个程序后手动生成注册表项
5。使用时用net start fxfilthook启动驱动,用net stop fxfilthook停止驱动
6。此方法只能对ip包进行过滤,其他的协议不会经过这个过滤钩子进行处理。
//驱动程序的头文件
#include "ntddk.h"
#include "ntddndis.h"
#include "pfhook.h"
#ifndef __NTHANDLE_H
#define __NTHANDLE_H
#define NT_DEVICE_NAME L"\\Device\\Fxfilthook"
#define DOS_DEVICE_NAME L"\\DosDevices\\Fxfilthook"
#define PROT_TCP 6
#include "ntddk.h"
#include "xfilthook.h"
typedef struct IPHeader {
UCHAR iph_verlen; // Version and length
UCHAR iph_tos; // Type of service
USHORT iph_length; // Total datagram length
USHORT iph_id; // Identification
USHORT iph_offset; // Flags, fragment offset
UCHAR iph_ttl; // Time to live
UCHAR iph_protocol; // Protocol
USHORT iph_xsum; // Header checksum
ULONG iph_src; // Source address
ULONG iph_dest; // Destination address
} IPHeader;
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath);
NTSTATUS
CreateFilterHook
(IN PDRIVER_OBJECT DriverObject);
VOID
DriverUnload
(IN PDRIVER_OBJECT DriverObject);
PF_FORWARD_ACTION
IpFilterHook(
IN unsigned char *PacketHeader,
IN unsigned char *Packet,
IN unsigned int PacketLength,
IN unsigned int RecvInterfaceIndex,
IN unsigned int SendInterfaceIndex,
IN IPAddr RecvLinkNextHop,
IN IPAddr SendLinkNextHop);
#endif
//驱动程序的c文件
#define PROT_TCP 6
#include "ntddk.h"
#include "ntddndis.h"
#include "pfhook.h"
#include "fxfilthook.h"
PDEVICE_OBJECT deviceObject;
UNICODE_STRING win32DeviceName;
//住驱动入口点
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
NTSTATUS status = STATUS_SUCCESS;
UNICODE_STRING ntDeviceName;
RtlInitUnicodeString(&ntDeviceName,NT_DEVICE_NAME);
//建立一个过滤钩子驱动设备
status = IoCreateDevice (DriverObject,0,&ntDeviceName,FILE_DEVICE_UNKNOWN,0,TRUE,&deviceObject);
if (!NT_SUCCESS (status)) {
goto ERROR;
}
RtlInitUnicodeString(&win32DeviceName, DOS_DEVICE_NAME);
//建立一个过滤钩子驱动设备符号连接
status = IoCreateSymbolicLink( &win32DeviceName, &ntDeviceName );
if (!NT_SUCCESS(status)) // If we couldn't create the link then
{ // abort installation.
goto ERROR;
}
//申明卸载例程
DriverObject->DriverUnload = DriverUnload;
//建立钩子挂接
status = CreateFilterHook(DriverObject);
if (!NT_SUCCESS(status)) // If we couldn't create the link then
{ // abort installation.
IoDeleteSymbolicLink(&win32DeviceName);
goto ERROR;
}
return(STATUS_SUCCESS);
ERROR:
if(deviceObject)
IoDeleteDevice(deviceObject);
//DbgPrint( "Leave DriverEntry failed\n" );
return status;
}
NTSTATUS
CreateFilterHook(IN PDRIVER_OBJECT DriverObject)
{
PIRP nirp;
NTSTATUS status = STATUS_SUCCESS;
PFILE_OBJECT filtfileob;
UNICODE_STRING ntDeviceName;
PDEVICE_OBJECT filtdeviceob;
PF_SET_EXTENSION_HOOK_INFO filthook;
IO_STATUS_BLOCK filtstatus;
RtlInitUnicodeString(&ntDeviceName,L"\\Device\\IPFILTERDRIVER");
//将钩子挂接函数放入结构中
filthook.ExtensionPointer = IpFilterHook;
//获得系统ipfilterdriver驱动的设备指针
status = IoGetDeviceObjectPointer(&ntDeviceName,FILE_GENERIC_READ|FILE_GENERIC_WRITE,&filtfileob,&filtdeviceob);
if(status!=STATUS_SUCCESS)
return status;
//绑定过滤钩子到系统ipfilterdriver驱动的设备指针
nirp = IoBuildDeviceIoControlRequest(
IOCTL_PF_SET_EXTENSION_POINTER,
filtdeviceob,
&filthook,
sizeof(PF_SET_EXTENSION_HOOK_INFO),
NULL,
0,
FALSE,
NULL,
&filtstatus);
if(nirp==NULL)
return filtstatus.Status;
//调度系统ipfilterdriver设备重新操作irp
return (IoCallDriver(filtdeviceob,nirp));
}
VOID
DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
//与加载一样,只是钩子函数结构中放NULL,让系统ipfilterdriver卸载加载的钩子函数
PIRP nirp;
NTSTATUS status = STATUS_SUCCESS;
PDEVICE_OBJECT filtdeviceob;
PFILE_OBJECT filtfileob;
PF_SET_EXTENSION_HOOK_INFO filthook;
IO_STATUS_BLOCK filtstatus;
UNICODE_STRING ntDeviceName;
RtlInitUnicodeString(&ntDeviceName,L"\\Device\\IPFILTERDRIVER");
filthook.ExtensionPointer = NULL;
status = IoGetDeviceObjectPointer(&ntDeviceName,FILE_GENERIC_READ|FILE_GENERIC_WRITE,&filtfileob,&filtdeviceob);
if(status==STATUS_SUCCESS)
{
nirp = IoBuildDeviceIoControlRequest(
IOCTL_PF_SET_EXTENSION_POINTER,
filtdeviceob,
&filthook,
sizeof(PF_SET_EXTENSION_HOOK_INFO),
NULL,
0,
FALSE,
NULL,
&filtstatus);
if(nirp!=NULL)
IoCallDriver(filtdeviceob,nirp);
}
IoDeleteSymbolicLink(&win32DeviceName);
IoDeleteDevice(deviceObject);
return;
}
PF_FORWARD_ACTION
IpFilterHook(
unsigned char *PacketHeader,
unsigned char *Packet,
unsigned int PacketLength,
unsigned int RecvInterfaceIndex,
unsigned int SendInterfaceIndex,
IPAddr RecvLinkNextHop,
IPAddr SendLinkNextHop
)
{
//过滤钩子函数,这儿只简单判断属于TCP协议且数据是抵达而且带SYN标志则过滤。大家可以根据需要修改自己的过滤判断和处理。
if(((IPHeader *)PacketHeader)->iph_protocol == PROT_TCP)
{
//Packet[13]==0x2就是TCP中SYN的标志
//SendInterfaceIndex==INVALID_PF_IF_INDEX说明包是抵达而不是发送的,因此这样过滤就不会影响自己的包出去,但是外来带SYN请求的包则会拒绝。
if(Packet[13]==0x2 && SendInterfaceIndex==INVALID_PF_IF_INDEX)
return PF_DROP;
}
return PF_FORWARD;
}
//简单的建立注册表项的程序
unsigned char sysdir[256];
unsigned char drivcedir[256];
int RegHandelDev(char * exename)
{
//修改注册表启动一个NTHANDLE驱动程序
char subkey[200];
int buflen;
HKEY hkResult;
char Data[4];
DWORD isok;
buflen = sprintf(subkey,"System\\CurrentControlSet\\Services\\%s",exename);
subkey[buflen]=0;
isok = RegCreateKey(HKEY_LOCAL_MACHINE,subkey,&hkResult);
if(isok!=ERROR_SUCCESS)
return FALSE;
Data[0]=3;
Data[1]=0;
Data[2]=0;
Data[3]=0;
isok=RegSetValueEx(hkResult,"Start",0,4,(const unsigned char *)Data,4);
Data[0]=1;
isok=RegSetValueEx(hkResult,"Type",0,4,(const unsigned char *)Data,4);
isok=RegSetValueEx(hkResult,"ErrorControl",0,4,(const unsigned char *)Data,4);
GetSystemDirectory(sysdir,256);
buflen = sprintf(drivcedir,"%s\\Drivers\\FxFiltHook.sys",sysdir);
buflen = sprintf(subkey,"\\??\\%s",drivcedir);
subkey[buflen]=0;
isok=RegSetValueEx(hkResult,"ImagePath",0,1,(const unsigned char *)subkey,buflen);
RegCloseKey(hkResult);
buflen = sprintf(subkey,"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\%s",exename);
subkey[buflen]=0;
return TRUE;
}
int main(int argc,char *argv[])
{
//注册驱动程序
if(RegHandelDev("Fxfilthook")==FALSE)
return FALSE;
return TRUE;
}
分享到:
相关推荐
NDIS Protocol驱动则是一种高层协议驱动,用于实现具体的网络协议栈,例如TCP/IP协议栈。而NDIS Intermediate驱动,也就是中间层驱动,则介于Miniport驱动和Protocol驱动之间,用于处理数据包的路由和过滤。 在中间...
NDIS中间层驱动,也称为过滤驱动,位于NDIS协议驱动和微型端口驱动之间,用于扩展或修改网络数据包处理流程。在这个场景中,我们将探讨如何在NDIS中间层驱动中获取并处理IP和MAC地址。 首先,我们需要理解NDIS驱动...
在广域网络会话劫持防范技术中,NDIS过滤驱动扮演着至关重要的角色,因为它能够实现在网络层面的深度包检测和流量控制。 会话劫持是一种网络攻击手段,攻击者通过中间人攻击或欺骗技术获取并控制网络会话,进而窃取...
基于NDIS中间层驱动的网络数据过滤程序开发概括 NDIS中间层驱动程序是基于DDK中passthru框架扩展的,用于网络数据过滤和拦截。NDIS中间层驱动程序可以拦截和过滤网络数据,使得网络数据的传输更加安全。 NDIS中间...
NDIS驱动,捕获过滤数据包,防火墙 好东西,分享
### NDIS小端口驱动实现概述 #### 一、引言 随着无线局域网(Wireless Local Area Network, WLAN)技术的不断发展与成熟,特别是IEEE制定的802.11-1999及802.11b标准的推出,使得WLAN的应用越来越广泛。WLAN的实现...
描述中提到的"NDIS过滤驱动 小端口驱动 参考文章,DOC类型",暗示了我们有两个文档资料,分别是"NDISWDM驱动学习笔记.doc"和"NDIS驱动框架探究.doc",这两份文档可能是深入解析NDIS驱动技术,特别是小端口驱动和过滤...
- **实验4**:**NDIS中间层驱动中IP、MAC地址的获取与存放**。教授学生如何在中间层驱动中正确地处理和存储网络地址信息。 - **实验5**:**基于NDIS中间层驱动的报文捕获、重组与再发送**。学习如何在中间层驱动中...
NDIS驱动开发涉及到网络驱动的多个层次,包括协议驱动、过滤驱动和微型端口驱动等。本开发指南将深入探讨NDIS驱动开发,特别是中间层驱动程序(IMD)的开发。 一、NDIS概述 NDIS作为网络驱动程序的基础,定义了上层...
5. NDIS过滤驱动:除了基本的MINIPORT和PROTOCOL驱动,NDIS还支持过滤驱动,它们可以插入到驱动堆栈中,对数据包进行拦截、修改或转发,以实现额外的功能,如网络安全、性能优化等。 6. NDIS版本:随着Windows操作...
4. **数据包过滤和修改**:中间层驱动可以拦截数据包,在其发送到物理网络之前或从物理网络接收后进行处理,如添加、删除或修改报头,实现流量控制、安全过滤等功能。 5. **同步和锁定机制**:由于驱动程序运行在多...
"基于PassThru的NDIS中间层驱动程序扩展"是一个专门的话题,涉及如何利用NDIS中间层驱动来实现特定的网络功能增强。 首先,我们要理解什么是NDIS中间层驱动。NDIS中间层驱动位于协议驱动和微型端口驱动之间,它能够...
### NDIS中间层驱动包截获技术解析 #### 一、NDIS驱动模型简介 **NDIS**(Network Driver Interface Specification)是一种由微软定义的标准网络驱动程序接口规范,它跨越了传输层、网络层和数据链路层,为网卡驱动...
协议驱动位于最高层,它们通常实现特定的网络协议,如TCP/IP,负责处理网络数据的发送和接收。 NDIS PDF文档很可能是关于NDIS驱动开发的详细教程,对于初学者来说极其宝贵。在学习NDIS驱动开发时,你需要理解以下...
NDIS驱动程序分为三类:微型端口驱动、过滤驱动和协议驱动。在本主题中,我们将重点关注NDIS中间层驱动,它在这些类别中起到承上启下的作用。 中间层驱动(也称为筛选器驱动)是NDIS驱动模型中的一个重要部分,它们...
基于中间层驱动的个人防火墙实现,包括ndis实现的框架,对网络包过滤的实现。
NDIS(Network Driver Interface Specification,网络驱动程序接口规范)是微软为网络适配器驱动程序提供的一种接口标准,它位于操作系统内核层和网络适配器驱动层之间,作为一个通信桥梁,使得上层的网络协议栈(如...
NDIS驱动分为协议驱动、微型端口驱动和中间驱动,其中,中间驱动常用于实现网络数据包的过滤或处理,如防火墙、安全代理等。 基于Windows文件系统过滤驱动的文件加解密技术研究与实现.pdf,这份文档可能详细讲解了...