对分层服务提供程序和应用进行分类

注意

分层服务提供程序已弃用。 从 Windows 8 和 Windows Server 2012 开始,请使用 Windows 筛选平台

 

Winsock 2 兼容分层协议。 分层协议只实现更高级别的通信功能,同时依赖基础传输堆栈与远程终结点进行实际的数据交换。 分层协议或分层服务提供程序的一个示例是安全层,该层将协议添加到连接建立过程,以便执行身份验证并建立相互同意的加密方案。 此类安全协议通常需要基础可靠传输协议(如 TCP 或 SPX)的服务。 术语“基本提供程序实现的基本协议”是指 Winsock 提供程序实现了诸如 TCP 或 SPX 之类的协议,该协议能够与远程终结点执行数据通信。 术语“分层协议”用于描述无法独立运行的协议。 这些分层协议作为 Winsock 分层服务提供程序 (LSP) 安装。

LSP 的一个示例是作为 Internet 安全和身份验证服务器 (ISA) 的一部分在客户端上安装的 Microsoft 防火墙客户端服务提供程序。 Microsoft 防火墙客户端服务提供程序通过 TCP 和 UDP 的 Winsock 基本提供程序进行安装。 ISA 防火墙客户端软件中的动态链接库 (DLL) 将成为所有 Winsock 应用程序透明使用的 Winsock 分层服务提供程序。 这样,ISA 防火墙客户端 LSP 可以截获来自客户端应用程序的 Winsock 函数调用,然后将请求路由到原始基础基本服务提供程序(如果目标为本地)或路由到 ISA 服务器计算机上的防火墙服务(如果目标为远程)。 类似的 LSP 作为 Microsoft Forefront 防火墙服务和威胁管理网关 (TMG) 客户端的一部分安装在客户端上。

在 LSP 初始化期间,LSP 必须提供指向多个 Winsock 服务提供程序接口 (SPI) 函数的指针。 这些函数将在正常处理期间由 LSP 上紧邻的层(另一个 LSP 或 Ws2_32.DLL)调用。

可以根据 LSP 实现的 SPI 函数子集以及针对每个函数执行的额外处理的性质来定义 LSP 类别。 通过对 LSP 进行分类,以及对使用 Winsock 套接字的应用程序进行分类,可以选择性地确定 LSP 是否应在运行时参与给定进程。

在 Windows Vista 及更高版本上,提供了一种用于对 Winsock 分层服务提供程序和应用程序进行分类的新方法,以便仅加载特定的 LSP。 添加这些功能有几个原因。

其中一个主要原因是某些系统关键进程(如 winlogon 和 lsass)会创建套接字,但这些进程不使用这些套接字在网络上发送任何流量。 因此,大多数 LSP 不应加载到这些进程中。 此外,漏洞很多的 LSP 可能导致 lsass.exe 崩溃的情况也多有记录。 如果 lsas 崩溃,系统将强制关闭。 加载 LSP 的这些系统进程的副作用是,这些进程永远不会退出,因此在安装或删除 LSP 时,需要重新启动。

一个次要原因是,在某些情况下,应用程序可能不希望加载某些 LSP。 例如,某些应用程序可能不希望加载加密 LSP,这可能会阻止应用程序与其他未安装加密 LSP 的系统通信。

最后,其他 LSP 可以使用 LSP 类别来确定它们应在 Winsock 协议链中安装的位置。 多年来,各种 LSP 开发人员一直都希望有一种方法来了解 LSP 的行为方式。 例如,检查数据流的 LSP 需要高于加密数据的 LSP。 当然,这种 LSP 分类方法并非万无一失,因为它依赖于第三方 LSP 对自己进行适当的分类。

Windows Vista 及更高版本中的 LSP 分类和其他安全增强功能旨在帮助防止用户无意中安装恶意 LSP。

LSP 类别

在 Windows Vista 及更高版本上,可以根据 LSP 与 Windows 套接字调用和数据交互的方式对 LSP 进行分类。 LSP 类别是 Winsock SPI 函数子集上一组可识别的行为。 例如,HTTP 内容筛选器将分类为数据检查器(LSP_INSPECTOR 类别)。 LSP_INSPECTOR 类别将检查(但不更改)数据传输 SPI 函数的参数。 应用程序可以查询 LSP 的类别,并基于 LSP 类别和应用程序允许的 LSP 类别集,选择不加载 LSP。

下表列出了 LSP 可划分的类别。

LSP 类别 说明
LSP_CRYPTO_COMPRESS LSP 是加密或数据压缩提供程序。
LSP_FIREWALL LSP 是防火墙提供程序。
LSP_LOCAL_CACHE LSP 是本地缓存提供程序。
LSP_INBOUND_MODIFY LSP 修改入站数据。
LSP_INSPECTOR LSP 检查或筛选数据。
LSP_OUTBOUND_MODIFY LSP 修改出站数据。
LSP_PROXY LSP 充当代理并重定向数据包。
LSP_REDIRECTOR LSP 是网络重定向程序。
LSP_SYSTEM LSP 可用于服务和系统进程。

 

LSP 可能属于多个类别。 例如,防火墙/安全 LSP 可以同时属于检查器 (LSP_INSPECTOR) 和防火墙 (LSP_FIREWALL) 类别

如果 LSP 没有类别集,则被视为属于“所有其他”类别。 此 LSP 类别不会加载到服务或系统进程中(例如 lsass、winlogon 和许多 svchost 进程)。

对 LSP 进行分类

Windows Vista 及更高版本提供了多个新函数,用于对 LSP 进行分类:

为了对 LSP 进行分类,将使用 GUID 调用 WSCSetProviderInfoWSCSetProviderInfo32 函数,以标识 LSP 隐藏条目、要为此 LSP 协议条目设置的信息类,以及一组用于修改函数行为的标志

WSCGetProviderInfoWSCGetProviderInfo32 函数同样用于检索与 LSP 的信息类关联的数据。

对应用程序进行分类

Windows Vista 及更高版本提供了多个新函数,用于对应用程序进行分类:

为了对应用程序进行分类,将使用可执行映像的加载路径调用 WSCSetApplicationCategory 函数来标识应用程序、启动应用程序时使用的命令行参数以及此应用程序的所有实例允许的 LSP 类别

WSCGetApplicationCategory 函数同样用于检索与应用程序关联的分层服务提供程序 (LSP) 类别。

确定加载哪些 LSP

LSP 分类的最后一部分是确定将哪些 LSP 加载到哪些进程中。 当进程加载 Winsock 时,对所有已安装的 LSP 的应用程序类别和 LSP 类别进行了以下比较:

  • 如果应用程序未分类,则允许将所有 LSP 加载到进程中。
  • 如果应用程序和 LSP 都分配了类别,则以下所有项都必须为真:
    应用程序指定的类别中至少有一个 LSP 类别存在。
    只有应用程序指定类别中指定的类别才在 LSP 类别中指定。 例如,如果应用程序指定一个类别,则它必须位于 LSP 的类别中。
    如果 LSP_SYSTEM 类别存在于应用程序的类别中,则它必须存在于 LSP 的类别中。

注意

如果未对 LSP 进行分类,则其类别实际上为零。 要进行匹配,所有 LSP 的指定类别都必须存在于应用程序的类别中(应用程序的类别必须是 LSP 类别的超集),并注意,如果 LSP_SYSTEM 存在于应用程序类别中,则它也必须存在于 LSP 的类别中。

 

请考虑以下示例:

Foo.exe 应用程序分类为 LSP_SYSTEM + LSP_FIREWALL + LSP_CRYPTO_COMPRESS。 应用程序 Bar.exe 分类为 LSP_FIREWALL + LSP_CRYPTO_COMPRESS。 系统上安装了四个 LSP:

  • LSP1 已设置 LSP_SYSTEM 类别。
  • LSP2 未设置类别,因此其类别为零。
  • LSP3 已设置 LSP_FIREWALL 类别。
  • LSP4 已设置 LSP_SYSTEM + LSP_FIREWALL + LSP_CRYPTO_COMPRESS + LSP_INSPECTOR 类别

在此示例中,Foo.exe 应用程序将仅加载 LSP1,而 Bar.exe 应用程序将加载 LSP3。

确定已安装的 Winsock 提供程序

Microsoft Windows 软件开发工具包 (SDK) 包括一个可用于确定本地计算机上安装的 Winsock 传输提供程序的示例 Winsock 程序。 默认情况下,此 Winsock 示例的源代码安装在 Windows SDK for Windows 7 的以下目录中:

C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\NetDs\winsock\LSP

此示例是用于安装和测试分层服务提供程序的实用工具。 但它还可用于以编程方式从本地计算机上的 Winsock 目录收集详细信息。 若要列出所有当前的 Winsock 提供程序(包括基本提供程序和层服务提供程序),请生成此 Winsock 示例并执行以下控制台命令:

instlsp -p

输出将是本地计算机上安装的 Winsock 提供程序的列表,其中包括分层服务提供程序。 输出列出了 Winsock 提供程序的目录 ID 和字符串名称

若要收集有关所有 Winsock 提供程序的更多详细信息,请执行以下控制台命令:

instlsp -p -v

输出将是本地计算机上支持的 WSAPROTOCOL_INFO 结构的列表

如需获取仅包含本地计算机上安装的分层服务提供程序的列表,请执行以下控制台命令:

instlsp -l

若要映射 LSP 结构,请执行以下控制台命令:

instlsp -m

注意

TDI 功能已弃用,将在 Microsoft Windows 的未来版本中删除。 根据 TDI 的使用方式,请使用 Winsock 内核 (WSK) 或 Windows 筛选平台 (WFP)。 有关 WFP 和 WSK 的详细信息,请参阅 Windows 筛选平台Winsock 内核。 有关 WSK 和 TDI 的 Windows 核心网络博客文章,请参阅 Winsock 内核 (WSK) 简介