资源预览内容
第1页 / 共24页
第2页 / 共24页
第3页 / 共24页
第4页 / 共24页
第5页 / 共24页
第6页 / 共24页
第7页 / 共24页
第8页 / 共24页
第9页 / 共24页
第10页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
基于Filter-HookDriver(使用ipfirewallh)的IP过滤驱动49770基于Filter-HookDriver(使用ipfirewallh)的IP过滤驱动.txt原创基于Filter-HookDriver(使用ipfirewall.h)的IP过滤驱动文章标题:原创基于Filter-HookDriver(使用ipfirewall.h)的IP过滤驱动顶部 fleshwound 发布于:2007-02-2716:02 楼主原创基于Filter-HookDriver(使用ipfirewall.h)的IP过滤驱动文章作者:fleshwoundsmatrix(fleshwound126.com)信息来源:邪恶八进制信息安全团队(www.eviloctal.com)注意:本文章首发安全矩阵(www.smatrix.org),后由原创作者友情提交到邪恶八进制信息安全团队。IP过滤驱动可以广泛的应用于网络安全产品的研发,NDIS和TDI的驱动资料很多,有比较成熟的代码可以参考,但是使用IPFIREWALL.h开发的IP过滤驱动的资料非常少,这次自己做一个软件的时候参考VCKBASE上的一篇文章开发Windows2000/XP下的防火墙(作者:JessO)的基础上,写了一个驱动,代码都做了详细的注释了,只要稍微有点驱动设计基础的都可以看得懂,我把自己的特殊的回调函数去掉了,保留了基本的完整框架,牛人就不需要看了,初学者都可以在此基础上继续快速开发。1SmatrixIPDiv.cpp文件2protocol.h头文件3SmatrixIPDiv.h头文件Copycode/*Copyright(c)2007,安全矩阵(SecurityMatrix)*Allrightsreserved.*文件名称:SmatrixIPDiv.cpp*文件标识:S*摘 要:IP过滤驱动,利用ipfirewall捕获包、分析包、过滤包*开始时间:2006年12月26Ri*当前版本:1.0*作 者:fleshwound126.com*相关信息:http:/www.smatrix.org*完成Ri期:2007年1月2Ri*/externC #include #include #include #include #include #include #include #include#includeSmatrixIPDiv.h#includeprotocol.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, UINT RecvInterfaceIndex, UINT *pSendInterfaceIndex, UCHAR *pDestinationType, VOID *pContext, UINT ContextLength, structIPRcvBuf*pRcvBuf);/过滤列表首地址structCFilterList*g_pHeader=NULL;/驱动内部名称和符号连接名称#defineDEVICE_NAMELDeviceDevSMFltIP#defineLINK_NAMELDosDevicesDrvSMFltIp/驱动入口函数NTSTATUSDriverEntry(PDRIVER_OBJECTpDriverObj,PUNICODE_STRINGpRegistryString) NTSTATUSstatus=STATUS_SUCCESS; /初始化各个派遣例程 pDriverObj-MajorFunctionIRP_MJ_CREATE=DispatchCreateClose; pDriverObj-MajorFunctionIRP_MJ_CLOSE=DispatchCreateClose; pDriverObj-MajorFunctionIRP_MJ_DEVICE_CONTROL=DispatchIoctl; pDriverObj-DriverUnload=DriverUnload; /创建、初始化设备对象 /设备名称 UNICODE_STRINGustrDevName; RtlInitUnicodeString(&ustrDevName,DEVICE_NAME); /创建设备对象 PDEVICE_OBJECTpDevObj; status=IoCreateDevice(pDriverObj, 0, &ustrDevName, FILE_DEVICE_DRVFLTIP, 0, FALSE, &pDevObj); if(!NT_SUCCESS(status) returnstatus; /创建符号连接名称 /符号连接名称 UNICODE_STRINGustrLinkName; RtlInitUnicodeString(&ustrLinkName,LINK_NAME); /创建关联 status=IoCreateSymbolicLink(&ustrLinkName,&ustrDevName); if(!NT_SUCCESS(status) IoDeleteDevice(pDevObj); returnstatus; returnSTATUS_SUCCESS;voidDriverUnload(PDRIVER_OBJECTpDriverObj) /卸载过滤函数 SetFilterFunction(IPFilterFunction,FALSE); /释放所有资源 ClearFilterList(); /删除符号连接名称 UNICODE_STRINGstrLink; RtlInitUnicodeString(&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); returnSTATUS_SUCCESS;/I/O控制派遣例程NTSTATUSDispatchIoctl(PDEVICE_OBJECTpDevObj,PIRPpIrp) NTSTATUSstatus=STATUS_SUCCESS; /取得此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); break; caseADD_FILTER: /添加一个过滤规则 if(uInSize=sizeof(CIPFilter) status=AddFilterToList(CIPFilter*)pIoBuffer); else status=STATUS_INVALID_DEVICE_REQUEST; break; caseCLEAR_FILTER: /释放过滤规则列表 ClearFilterList(); break; default: status=STATUS_INVALID_DEVICE_REQUEST; break; /完成请求 pIrp-IoStatus.Status=status; pIrp-IoStatus.Information=0; IoCompleteRequest(pIrp,IO_NO_INCREMENT); returnstatus;
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号