- 浏览: 865831 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (280)
- java相关 (29)
- linux系统 (55)
- ipsec (0)
- ssl (3)
- 信息安全 (13)
- web相关 (35)
- windows (9)
- c,c++ (14)
- log4j (3)
- hibernate (8)
- sqlite (1)
- 程序人生 (2)
- js (2)
- 生活点滴 (3)
- 网络相关 (14)
- 问题积累 (15)
- 数据库相关 (27)
- 软件测试 (2)
- PKI相关 (2)
- 程序设计 (7)
- 犄角旮旯 (0)
- 杂七杂八 (0)
- 硬件相关 (14)
- 防火墙 (2)
- 电子商务 (2)
- 多媒体相关 (1)
- 内存管理 (4)
- 面向对象 (1)
- csp (1)
- 驱动开发 (3)
- 移动开发 (2)
- openssl多线程实例 (1)
最新评论
-
xiaoyao3857:
博主很有探索精神嘛,学习了
Linux主机名Hostname详解 -
hiskyrisa:
言简意赅,好文章。
Flex是什么 -
layznet:
犯了类似错误。使用的是derby数据库。driverClass ...
java.sql.SQLException: No suitable driver -
idision:
你好,文章有一句createSubjectKeyId(keyT ...
bouncycastle 产生证书 -
zheng12tian:
代码有全的不?只贴一部分,,,,
在LOG4J中把日志写入远程数据库
Windows Vista(简称Vista),是微软公司推出的最新的客户端操作系统,内部名称Windows NT 6.0。相对于Windows NT 5.x,其网络结构变化非常大,原有的TDI,NDIS系统挂接方法不再适用。(修改自nrworld.com 作者匿名)
Windows Filtering Platform (WFP) is a set of API and system services that provide a platform for creating firewalls. WFP API allows developers to create code that interacts with the filtering that takes place at several layers in the networking stack and throughout the operating system.
WFP integrates with and provides support for firewall features such as authenticated communication and dynamic firewall configuration based on applications' use of sockets API (application-based policy). Windows Filtering Platform is a development platform and not a firewall itself.
(IN const FWPS_INCOMING_VALUES0* inFixedValues,//WFP传进来的本层特有的数据
IN const FWPS_INCOMING_METADATA_VALUES0* inMetaValues,//本层相关的扩展数据
IN VOID* packet,
IN const FWPS_FILTER0* filter,
IN UINT64 flowContext,
OUT FWPS_CLASSIFY_OUT0* classifyOut//用这个结构里的字段告知WFP对数据包做出处理
)
{
NTSTATUS status = STATUS_SUCCESS;
UINT64 flowHandle;
UINT64 flowContextLocal;
UINT32 index;
UINT32 LocalIPADDRv4,remoteIPADDRv4;
USHORT LocalPort,remotePort;
UNREFERENCED_PARAMETER(packet);
UNREFERENCED_PARAMETER(filter);
UNREFERENCED_PARAMETER(flowContext);
index = FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_LOCAL_ADDRESS;
index = FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_LOCAL_PORT;
LocalPort = inFixedValues->incomingValue[index].value.uint16;
index = FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_REMOTE_ADDRESS;
index = FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_REMOTE_PORT;
remotePort = inFixedValues->incomingValue[index].value.uint16;
DbgPrint("BaseTDI: LocalIP %lx LocalPort %d \n remoteIP %lx remotePort %d",LocalIPADDRv4,LocalPort, remoteIPADDRv4,remotePort);
DbgPrint("BaseTDI: PID %d ,PID's PATH %s",inMetaValues->processId,inMetaValues->processPath->data); DbgPrint("\n");
if (monitoringEnabled)
{ //访问规则代码,在这里通知用户态程序
AskUser(LocalIP, LocalPort, remoteIP, remotePort, PID);
If classifyOut->actionType = FWP_ACTION_PERMIT;//允许发送或接收
else classifyOut->actionType = FWP_ACTION_BLOCK; //不允许发送或接收
}
return status;
}
WFPAppAddCallouts()//向WFP系统添加callout DWORD
{
FWPM_CALLOUT0 callout;
DWORD result;
FWPM_DISPLAY_DATA0 displayData;
HANDLE engineHandle = NULL;
FWPM_SESSION0 session; //初始化一次会话
RtlZeroMemory(&session, sizeof(FWPM_SESSION0));
session.displayData.name= L"TEMP WFP Session";
session.displayData.description = L"For Adding callouts";//创建WFP引擎句柄
result = FwpmEngineOpen0( NULL, RPC_C_AUTHN_WINNT, NULL, &session, &engineHandle );
if (NO_ERROR != result) {goto cleanup;} //开始与引擎交互
result = FwpmTransactionBegin0(engineHandle, 0);
if (NO_ERROR != result) {goto abort; } //ADD CALLOUT
RtlZeroMemory(&callout, sizeof(FWPM_CALLOUT0));
displayData.description = MONITOR_FLOW_ESTABLISHED_CALLOUT_DESCRIPTION;
displayData.name = MONITOR_FLOW_ESTABLISHED_CALLOUT_NAME;
callout.calloutKey = TEMP_MONITOR_FLOW_ESTABLISHED_CALLOUT_V4;
callout.displayData = displayData;
callout.applicableLayer = FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4;
callout.flags = FWPM_CALLOUT_FLAG_PERSISTENT; //flags置这个标志表示callout始终被WFP加载
result = FwpmCalloutAdd0(engineHandle, &callout, NULL, NULL);
if (NO_ERROR != result) {goto abort; } //结束本次会话
result = FwpmTransactionCommit0(engineHandle);
if (NO_ERROR == result) {;} goto cleanup; abort: //说明本次会话失败
result = FwpmTransactionAbort0(engineHandle);
if (NO_ERROR == result) {;} cleanup: //关闭引擎
if (engineHandle) { FwpmEngineClose0(engineHandle); }
return result;
}
WFPAppAddFilters(IN HANDLE engineHandle/*,IN FWP_BYTE_BLOB* applicationPath*/) //向WFP系统添加filter DWORD
{
DWORD result = NO_ERROR;
FWPM_SUBLAYER0 monitorSubLayer;
FWPM_FILTER0 filter;
FWPM_FILTER_CONDITION0 filterConditions[1]; //需要几条规则就定义几条 //初始化过滤条件
RtlZeroMemory(filterConditions, sizeof(filterConditions));
filterConditions[0].fieldKey = FWPM_CONDITION_IP_PROTOCOL;//所有IP协议数据
filterConditions[0].matchType = FWP_MATCH_GREATER_OR_EQUAL;//匹配度,大于,小于,大于等于…
filterConditions[0].conditionValue.type = FWP_UINT8;
filterConditions[0].conditionValue.uint8 = IPPROTO_IP;
RtlZeroMemory(&monitorSubLayer, sizeof(FWPM_SUBLAYER0));//初始化子层
monitorSubLayer.subLayerKey = TEMP_MONITOR_SUBLAYER;
monitorSubLayer.displayData.name = L"TEMP Monitor Sub layer";
monitorSubLayer.displayData.description = L"TEMP Monitor Sub layer";
monitorSubLayer.flags = 0;//FWMP_SUBLAYER_FLAG_PERSISTENT; // We don't really mind what the order of invocation is.
monitorSubLayer.weight = 0; //与WFP引擎开始一次会话
result = FwpmTransactionBegin0(engineHandle, 0);
if (NO_ERROR != result) {goto abort;} //增加一个子层
result = FwpmSubLayerAdd0(engineHandle, &monitorSubLayer, NULL);
if (NO_ERROR != result) {goto abort;} //FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4
RtlZeroMemory(&filter, sizeof(FWPM_FILTER0));
filter.layerKey = FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4;
filter.displayData.name = L"Flow established filter.";
filter.displayData.description = L"Sets up flow for traffic that we are interested in.";
filter.action.type = FWP_ACTION_CALLOUT_INSPECTION; //表示把符合条件数据包交给callout处理
filter.action.calloutKey = TEMP_MONITOR_FLOW_ESTABLISHED_CALLOUT_V4;
filter.filterCondition = filterConditions;
filter.subLayerKey = monitorSubLayer.subLayerKey;
filter.weight.type = FWP_EMPTY; //系统自动设置weight。weight值越大加载越靠前
filter.numFilterConditions = 1;//过滤条件数
result = FwpmFilterAdd0(engineHandle, &filter, NULL, &(filterID[0]));
if (NO_ERROR != result) {goto abort;} //结束本次会话
result = FwpmTransactionCommit0(engineHandle);
if (NO_ERROR == result) {;} goto cleanup; abort: //说明本次会话失败
result = FwpmTransactionAbort0(engineHandle);
if (NO_ERROR == result) {;} cleanup: return result;
}
二、NDISfilter NDISfilter是利用系统提供的NDIS过滤引擎,获得MAC级别的网络数据包(这里可以看出WFP,NDISfilter,还有本文未提到的 FileSystemMiniFilter,他们都是利用了微软提供的过滤引擎,向其注册回调函数,得到数据后处理)。关键代码说明,其中的详细数据结构请参阅微软文档NDISfilter一节,
NDIS_FILTER_DRIVER_CHARACTERISTICS FChars;
NdisZeroMemory(&FChars, sizeof(NDIS_FILTER_DRIVER_CHARACTERISTICS));
FChars.Header.Type = NDIS_OBJECT_TYPE_FILTER_DRIVER_CHARACTERISTICS;
FChars.Header.Size = sizeof(NDIS_FILTER_DRIVER_CHARACTERISTICS);
FChars.Header.Revision = NDIS_FILTER_CHARACTERISTICS_REVISION_1;
FChars.MajorNdisVersion = FILTER_MAJOR_NDIS_VERSION;
FChars.MinorNdisVersion = FILTER_MINOR_NDIS_VERSION;
FChars.MajorDriverVersion = 1;
FChars.MinorDriverVersion = 0;
FChars.Flags = 0;
FChars.FriendlyName = FriendlyName;
FChars.UniqueName = UniqueName;
FChars.ServiceName = ServiceName;
FChars.SetOptionsHandler = FilterRegisterOptions;
FChars.AttachHandler = FilterAttach;//如果是我们想挂接的网络介质,就在这里通知系统挂接
FChars.DetachHandler = FilterDetach;
FChars.RestartHandler = FilterRestart;
FChars.PauseHandler = FilterPause;
FChars.SetFilterModuleOptionsHandler = FilterSetModuleOptions;
FChars.OidRequestHandler = FilterOidRequest;
FChars.OidRequestCompleteHandler = FilterOidRequestComplete;
FChars.CancelOidRequestHandler = FilterCancelOidRequest;
FChars.SendNetBufferListsHandler = FilterSendNetBufferLists;//发送回调函数
FChars.ReturnNetBufferListsHandler = FilterReturnNetBufferLists;
FChars.SendNetBufferListsCompleteHandler = FilterSendNetBufferListsComplete;
FChars.ReceiveNetBufferListsHandler = FilterReceiveNetBufferLists;//接收回调函数
FChars.DevicePnPEventNotifyHandler = FilterDevicePnPEventNotify;
FChars.NetPnPEventHandler = FilterNetPnPEvent;
FChars.StatusHandler = FilterStatus;
FChars.CancelSendNetBufferListsHandler = FilterCancelSendNetBufferLists;
NDIS_FILTER_DRIVER_CHARACTERISTICS这个结构用来组织NDISfilter功能函数供NDIS系统回调,例如 FilterSendNetBufferLists,发送数据回调函数,NDIS发送MAC帧时回调这个函数,相应数据可以在这个函数里得到处理,之后还给NDIS系统继续处理。
VOID FilterSendNetBufferLists( IN NDIS_HANDLE FilterModuleContext, IN PNET_BUFFER_LIST NetBufferLists, IN NDIS_PORT_NUMBER PortNumber, IN ULONG SendFlags )
{
PMS_FILTER pFilter = (PMS_FILTER)FilterModuleContext;
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
PNET_BUFFER_LIST CurrNbl;
BOOLEAN DispatchLevel; //这里开始分析PNET_BUFFER_LIST指向的网络数据,并显示如何获得MAC地址
PNET_BUFFER_LIST pNetBufList,pNextNetBufList;
PMDL pMdl;
PNDISPROT_ETH_HEADER pEthHeader = NULL;
ULONG TotalLength,Offset,BufferLength; pNetBufList = NetBufferLists;
while (pNetBufList != NULL)
{
pNextNetBufList = NET_BUFFER_LIST_NEXT_NBL (pNetBufList); //得到当前和包相关的MDL,MDL里即MAC帧,详细的NET_BUFFER_LIST结构请参阅微软相关文档
pMdl = NET_BUFFER_CURRENT_MDL(NET_BUFFER_LIST_FIRST_NB(pNetBufList));
TotalLength = NET_BUFFER_DATA_LENGTH(NET_BUFFER_LIST_FIRST_NB(pNetBufList));
Offset = NET_BUFFER_CURRENT_MDL_OFFSET(NET_BUFFER_LIST_FIRST_NB(pNetBufList));
BufferLength = 0;
do
{
ASSERT(pMdl != NULL);
if (pMdl)
{
NdisQueryMdl( pMdl, &pEthHeader, &BufferLength, NormalPagePriority);
}
if (pEthHeader == NULL)
{
BufferLength = 0; break;
}
if (BufferLength == 0){ break;}
ASSERT(BufferLength > Offset);
BufferLength -= Offset;
pEthHeader = (PNDISPROT_ETH_HEADER)((PUCHAR)pEthHeader + Offset);
DbgPrint("DstMAC %x-%x-%x-%x-%x-%x",pEthHeader->DstAddr[0], pEthHeader->DstAddr[1],pEthHeader->DstAddr[2], pEthHeader->DstAddr[3],pEthHeader->DstAddr[4], pEthHeader->DstAddr[5]);
DbgPrint("srcMAC %x-%x-%x-%x-%x-%x",pEthHeader->SrcAddr[0], pEthHeader->SrcAddr[1],pEthHeader->SrcAddr[2], pEthHeader->SrcAddr[3],pEthHeader->SrcAddr[4], pEthHeader->SrcAddr[5]);
DbgPrint("\n");
if (BufferLength < sizeof(NDISPROT_ETH_HEADER)) { break;}
}
while (FALSE);
pNetBufList = pNextNetBufList;
}
}
发表评论
-
windows启动方式总结
2010-05-26 14:04 1639首先先说说最简单的查 ... -
网管必须掌握几点!
2010-04-25 20:02 1174网管员在维护和使用电脑时,经常会遇到各种密码丢失的问题,这里, ... -
加快硬盘读写速度
2009-08-10 20:43 3615一、软件篇 1、设定虚 ... -
VC++动态链接库编程之基础慨念
2009-07-18 21:50 14391.概论 先来阐述一下DLL(Dynamic ... -
动态链接库dll 静态链接库lib 动态导入库lib
2009-07-18 21:31 3761目前以lib后缀的库有两种,一种为静态链接库(Static L ... -
lib和dll文件的区别和联系
2009-06-23 19:42 2118lib和dll lib和dll文件的区别和联系 .dl ... -
internet explorer已阻止此站点用不安全方式使用ActiveX控件,怎么办?
2009-06-22 19:02 10777所谓的阻止是因为IE禁止了activex控制在页面的执行.IE ... -
远程桌面(3389)连接至指定会话(session)的方法.
2009-05-15 15:16 2047不知道有没有人遇到过这样的变态问题,在管理服务器的时候,用远程 ...
相关推荐
网络和共享中心是Vista中管理网络连接和共享文件的核心,简化了网络设置和家庭网络的建立,让用户更容易地共享文件和打印机。 九、备份与恢复功能 Vista提供了全面的备份和恢复工具,包括系统映像创建和文件备份,...
系统完整性技术是Windows Vista的一项核心安全机制,它的设计目标是在系统运行时和关机状态下,确保操作系统的完整性和安全性。这一技术主要通过以下几种方式实现: 1. **代码完整性(Code Integrity)**:这是针对...
《Windows Vista内核结构大典》是一本深入探讨Windows Vista操作系统内核数据结构的重要参考资料。这本书基于Windows Vista内核的符号表,详细解析了内核级别的数据结构,为那些进行Windows内核编程的开发者提供了...
Windows Vista的安全改进是其设计的核心部分,旨在为用户提供更安全、更可靠的计算环境。 1. 用户账户控制(User Account Control, UAC): UAC是Windows Vista引入的一项重要安全功能,它强制用户在进行可能影响...
WFP是Windows Vista及更高版本中的一个关键安全特性,它提供了一种统一的框架来实现网络策略和过滤。WFP允许开发者和管理员创建自定义的过滤规则,用于控制网络流量,防止恶意软件入侵,保护数据的隐私和完整性。它...
6. Base Filtering Engine(基础过滤引擎,BFE):BFE是Windows的网络安全组件,负责IPsec策略的执行。如果不需要高级网络保护,可以将其设为手动,但风险是可能导致网络安全降低。 7. Block Level Backup Engine ...
首先,我们要了解的是文件过滤驱动(File System Filter Driver),它是实现文件过滤的核心组件。文件过滤驱动是内核模式驱动,运行在较高的权限级别,能够直接与文件系统交互。常见的文件过滤驱动包括Microsoft的...
在Windows Vista中,WPF引入了许多创新技术,其中数据绑定是核心特性之一,它极大地简化了UI与后台数据之间的交互。本节课程将深入探讨WPF中的数据绑定机制及其应用。 数据绑定是WPF中一个强大的功能,它允许UI元素...
这些文档涵盖了Vista系统的核心使用场景,不仅适合初学者,也对有一定经验的用户有所帮助。通过深入学习,用户可以全面了解Vista的安全机制,提高网页浏览体验,并熟练掌握打印设置,从而更好地利用Windows Vista...
以下将详细介绍Vista的一些核心知识点。 一、Vista概述 Windows Vista是微软公司在2006年发布的一款操作系统,作为Windows XP的后续版本,它引入了全新的界面设计,增强了安全性,并提升了用户体验。Vista引入了 ...
《Vista精品应用黄皮书》是一本专为Windows Vista用户打造的深度指南,旨在帮助读者全面、深入地了解和掌握这一操作系统的核心功能与实用技巧。Windows Vista是微软公司在2006年发布的重要操作系统,它在Windows XP...
WFP是Microsoft从Windows Vista开始引入的一种底层网络过滤框架。它为开发者提供了创建网络策略和控制网络数据包的能力,涵盖了入站、出站、本地以及远程通信的各个层面。WFP的主要特点包括: 1. **深度包检测 ...
【微软官方Vista入门教程】是一份专门为初学者设计的指南,旨在帮助用户熟悉和掌握微软Windows Vista操作系统的基础知识和核心功能。这份教程由微软官方出品,因此具有权威性和准确性,确保用户能够得到最可靠的操作...
WinSock Expert v0.7 是一款专门针对Windows Vista及Windows 7操作系统设计的网络监控工具,它旨在帮助用户捕获、分析和控制网络流量。这个版本在2010年7月2日发布,标志着软件对最新操作系统的兼容性的提升,使用户...
在“vista log TCL”这个场景中,我们可以理解为使用TCL语言来处理Windows Vista操作系统中的日志记录相关任务。下面我们将深入探讨TCL语言以及在Vista系统中如何进行日志操作。 首先,TCL是一种动态类型的解释型...
传统的监控系统往往针对的是Windows XP及其之前的版本,但在Windows Vista之后的操作系统中,由于增加了对内核模式的保护,原有的监控技术可能无法有效运行。为此,本文介绍了一种基于WDF(Windows Driver ...
- **操作系统版本**:本书主要针对Windows Server 2008和Windows Vista两个操作系统进行深入讲解。 - **内容概述**:本书是关于Windows内部机制的经典著作,全面深入地介绍了Windows操作系统的底层架构和技术细节。...
总的来说,XPS Filter是Windows Vista及后续系统中XPSDrv模型的核心组成部分,它们提供了强大的灵活性和可扩展性,使得开发者能够构建更加智能和高效的打印解决方案。通过深入理解XPS Filter的工作原理并参考WDK中的...
全面系统地介绍了串口、键盘、磁盘、文件系统、网络等相关的Windows内核模块的编程技术,以及基于这些技术实现的密码保护、防毒引擎、文件加密、网络嗅探、网络防火墙等信息安全软件的核心组件的具体编程。...
2. **Media Foundation**: Media Foundation是Windows Vista之后引入的多媒体处理框架,取代了DirectShow。它提供了一套更为现代的API,支持高清视频、多声道音频、硬件加速以及数字版权管理(DRM)。Media ...