基于FilterHookDriver使用ipfirewallh的IP过滤驱动Word文件下载.docx
- 文档编号:7737954
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:24
- 大小:21.51KB
基于FilterHookDriver使用ipfirewallh的IP过滤驱动Word文件下载.docx
《基于FilterHookDriver使用ipfirewallh的IP过滤驱动Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于FilterHookDriver使用ipfirewallh的IP过滤驱动Word文件下载.docx(24页珍藏版)》请在冰点文库上搜索。
*相关信息:
http:
//www.smatrix.org
*完成Ri期:
2007年1月2Ri
*/
extern"
C"
{
#include<
stdio.h>
string.h>
stdlib.h>
ntddk.h>
ntddndis.h>
pfhook.h>
ndis.h>
ipfirewall.h>
}
#include"
SmatrixIPDiv.h"
protocol.h"
/////////////////////////自定义函数的声明///////////////////////
//关闭打开驱动函数
NTSTATUSDispatchCreateClose(PDEVICE_OBJECTpDevObj,PIRPpIrp);
//驱动卸载函数
voidDriverUnload(PDRIVER_OBJECTpDriverObj);
//IO控制派遣函数(内核消息处理)
NTSTATUSDispatchIoctl(PDEVICE_OBJECTpDevObj,PIRPpIrp);
//向过滤列表中添加一个过滤规则
NTSTATUSAddFilterToList(CIPFilter*pFilter);
//清除过滤列表
voidClearFilterList();
//注册钩子回调函数
NTSTATUSSetFilterFunction(IPPacketFirewallPtrfilterFunction,BOOLEANload);
//包过滤函数
FORWARD_ACTIONFilterPacket(unsignedchar*PacketHeader,
unsignedchar*Packet,
unsignedintPacketLength,
DIRECTION_Edirection,
unsignedintRecvInterfaceIndex,
unsignedintSendInterfaceIndex);
//IP过滤器函数
FORWARD_ACTIONIPFilterFunction(VOID**pData,
UINTRecvInterfaceIndex,
UINT*pSendInterfaceIndex,
UCHAR*pDestinationType,
VOID*pContext,
UINTContextLength,
structIPRcvBuf**pRcvBuf);
//过滤列表首地址
structCFilterList*g_pHeader=NULL;
//驱动内部名称和符号连接名称
#defineDEVICE_NAMEL"
\\Device\\DevSMFltIP"
#defineLINK_NAMEL"
\\DosDevices\\DrvSMFltIp"
//驱动入口函数
NTSTATUSDriverEntry(PDRIVER_OBJECTpDriverObj,PUNICODE_STRINGpRegistryString)
NTSTATUSstatus=STATUS_SUCCESS;
//初始化各个派遣例程
pDriverObj->
MajorFunction[IRP_MJ_CREATE]=DispatchCreateClose;
MajorFunction[IRP_MJ_CLOSE]=DispatchCreateClose;
MajorFunction[IRP_MJ_DEVICE_CONTROL]=DispatchIoctl;
DriverUnload=DriverUnload;
//创建、初始化设备对象
//设备名称
UNICODE_STRINGustrDevName;
RtlInitUnicodeString(&
ustrDevName,DEVICE_NAME);
//创建设备对象
PDEVICE_OBJECTpDevObj;
status=IoCreateDevice(pDriverObj,
0,
&
ustrDevName,
FILE_DEVICE_DRVFLTIP,
FALSE,
pDevObj);
if(!
NT_SUCCESS(status))
{
returnstatus;
}
//创建符号连接名称
//符号连接名称
UNICODE_STRINGustrLinkName;
ustrLinkName,LINK_NAME);
//创建关联
status=IoCreateSymbolicLink(&
ustrLinkName,&
ustrDevName);
IoDeleteDevice(pDevObj);
returnSTATUS_SUCCESS;
voidDriverUnload(PDRIVER_OBJECTpDriverObj)
{
//卸载过滤函数
SetFilterFunction(IPFilterFunction,FALSE);
//释放所有资源
ClearFilterList();
//删除符号连接名称
UNICODE_STRINGstrLink;
strLink,LINK_NAME);
IoDeleteSymbolicLink(&
strLink);
//删除设备对象
IoDeleteDevice(pDriverObj->
DeviceObject);
//处理IRP_MJ_CREATE、IRP_MJ_CLOSE功能代码
NTSTATUSDispatchCreateClose(PDEVICE_OBJECTpDevObj,PIRPpIrp)
pIrp->
IoStatus.Status=STATUS_SUCCESS;
//pIrp->
IoStatus.Information=0;
//完成此请求
IoCompleteRequest(pIrp,IO_NO_INCREMENT);
//I/O控制派遣例程
NTSTATUSDispatchIoctl(PDEVICE_OBJECTpDevObj,PIRPpIrp)
//取得此IRP(pIrp)的I/O堆栈指针
PIO_STACK_LOCATIONpIrpStack=IoGetCurrentIrpStackLocation(pIrp);
//取得I/O控制代码
ULONGuIoControlCode=pIrpStack->
Parameters.DeviceIoControl.IoControlCode;
//取得I/O缓冲区指针和它的长度
PVOIDpIoBuffer=pIrp->
AssociatedIrp.SystemBuffer;
ULONGuInSize=pIrpStack->
Parameters.DeviceIoControl.InputBufferLength;
//响应用户的命令
switch(uIoControlCode)
caseSTART_IP_HOOK:
//开始过滤
status=SetFilterFunction(IPFilterFunction,TRUE);
break;
caseSTOP_IP_HOOK:
//停止过滤
status=SetFilterFunction(IPFilterFunction,FALSE);
caseADD_FILTER:
//添加一个过滤规则
if(uInSize==sizeof(CIPFilter))
status=AddFilterToList((CIPFilter*)pIoBuffer);
else
status=STATUS_INVALID_DEVICE_REQUEST;
caseCLEAR_FILTER:
//释放过滤规则列表
default:
//完成请求
IoStatus.Status=status;
///////////////////////////////////////////////////////////////////
//过滤列表
NTSTATUSAddFilterToList(CIPFilter*pFilter)
//为新的过滤规则申请内存空间
CFilterList*pNew=(CFilterList*)ExAllocatePool(NonPagedPool,sizeof(CFilterList));
if(pNew==NULL)
returnSTATUS_INSUFFICIENT_RESOURCES;
//填充这块内存
RtlCopyMemory(&
pNew->
ipf,pFilter,sizeof(CIPFilter));
//连接到过滤列表中
pNew->
pNext=g_pHeader;
g_pHeader=pNew;
voidClearFilterList()
CFilterList*pNext;
//释放过滤列表占用的所有内存
while(g_pHeader!
=NULL)
pNext=g_pHeader->
pNext;
//释放内存
ExFreePool(g_pHeader);
g_pHeader=pNext;
unsignedintSendInterfaceIndex)
//提取IP头
IPHeader*pIPHdr=(IPHeader*)PacketHeader;
TCPHeader*pTCPHdr=NULL;
UDPHeader*pUDPHdr=NULL;
if(pIPHdr->
ipProtocol==6)//是TCP协议
//提取TCP头
pTCPHdr=(TCPHeader*)Packet;
//我们接受所有已经建立连接的TCP封包
(pTCPHdr->
flags&
0x02))
returnFORWARD;
//与过滤规则相比较,决定采取的行动
CFilterList*pList=g_pHeader;
while(pList!
//比较协议
if(pList->
ipf.protocol==0||pList->
ipf.protocol==pIPHdr->
ipProtocol)
//查看源IP地址
ipf.sourceIP!
=0&
(pList->
ipf.sourceIP&
pList->
ipf.sourceMask)!
=pIPHdr->
ipSource)
pList=pList->
continue;
//查看目标IP地址
ipf.destinationIP!
ipf.destinationIP&
ipf.destinationMask)!
ipDestination)
//如果是TCP封包,查看端口号
ipProtocol==6)
ipf.sourcePort==0||pList->
ipf.sourcePort==pTCPHdr->
sourcePort)
ipf.destinationPort==0
||pList->
ipf.destinationPort==pTCPHdr->
destinationPort)
//现在决定如何处理这个封包
ipf.bDrop)
returnDROP;
//如果是UDP封包,查看端口号
elseif(pIPHdr->
ipProtocol==17)
pUDPHdr=(UDPHeader*)Packet;
ipf.sourcePort==pUDPHdr->
ipf.destinationPort==pUDPHdr->
//对于其它封包,我们直接处理
//比较下一个规则
//我们接受所有没有注册的封包
NTSTATUSSetFilterFunction(IPPacketFirewallPtrfilterFunction,BOOLEANload)
//{变量定义BEGIN}
//内核状态
NTSTATUSwaitStatus=STATUS_SUCCESS;
//受信状态
PDEVICE_OBJECTpDeviceObj=NULL;
//pDeviceObj变量将指向IP过滤驱动设备对象
PFILE_OBJECTpFileObj=NULL;
//内核过滤器设备
IP_SET_FIREWALL_HOOK_INFOfilterData;
//IP_SET_FIREWALL_HOOK_INFO结构
UNICODE_STRINGustrFilterDriver;
//IP过滤驱动的名称
KEVENTevent;
//
IO_STATUS_BLOCKioStatus;
PIRPpIrp;
//{变量定义END}
//初始化IP过滤驱动的名称
ustrFilterDriver,DD_IP_DEVICE_NAME);
//取得设备对象指针
status=IoGetDeviceObjectPointer(&
ustrFilterDriver,STANDARD_RIGHTS_ALL,&
pFileObj,&
pDeviceObj);
///////////使用到IP过滤驱动中设备对象的指针创建一个IRP///////////////////////////
//填充IP_SET_FIREWALL_HOOK_INFO结构
filterData.FirewallPtr=filterFunction;
filterData.Priority=1;
filterData.Add=load;
//我们需要初始化一个事件对象。
//构建IRP时需要使用这个事件内核对象,当IP过滤取得接受到此IRP,完成工作以后会将它置位
KeInitializeEvent(&
event,NotificationEvent,FALSE);
//为设备控制请求申请和构建一个IRP
pIrp=IoBuildDeviceIoControlRequest(IOCTL_IP_SET_FIREWALL_HOOK,//iocontrolcode
pDeviceObj,
(PVOID)&
filterData,
sizeof(IP_SET_FIREWALL_HOOK_INFO),
NULL,
event,
ioStatus);
if(NULL==pIrp)
//如果不能申请空间得到pIrp,返回对应的错误代码
////////////////////////////////////////////////////////////////
///////////////请求安装钩子回调函数/////////////////////////////
//发送此IRP到IP过滤驱动
status=IoCallDriver(pDeviceObj,pIrp);
//等待IP过滤驱动的通知
if(status==STATUS_PENDING)
waitStatus=KeWaitForSingleObject(&
event,Executive,KernelMode,FALSE,NULL);
NT_SUCCESS(waitStatus))//受信状态不成功,返回
returnwaitStatus;
status=ioStatus.Status;
NT_SUCCESS(status))//状态不成功,返回
/////////////////////////////////////////////////////////////////////////
//////////////////////清除内核资源/////////////////////////////////////
if(pFileObj!
ObDereferenceObject(pFileObj);
pDeviceObj=NULL;
//避免产生野指针
pFileObj=NULL;
structIPRcvBuf**pRcvBuf)
FORWARD_ACTIONresult=FORWARD;
unsignedchar*packet=NULL;
intbufferSize=0;
structIPRcvBuf*buffer=(structIPRcvBuf*)*pData;
PFIREWALL_CONTEXT_TfwContext=(PFIREWALL_CONTEXT_T)pContext;
DIRECTION_Edirection=IP_RECEIVE;
//如果包指针不为空,IPRcvBuf中存在数据
if(buffer!
bufferSize=buffer->
ipr_size;
while(buffer->
ipr_next!
=NULL)//得到整个IPRcvBuf缓冲链中数据总长度
buffer=buffer->
ipr_next;
bufferSize+=buffer->
ip
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FilterHookDriver 使用 ipfirewallh IP 过滤 驱动
![提示](https://static.bingdoc.com/images/bang_tan.gif)
链接地址:https://www.bingdoc.com/p-7737954.html