翻译的太垃圾,不建议其它人阅读本文。
Note:LSP现在已经不推荐使用。自windows8和windows Server2012开始,使用Windows Filtering Platform。
Winsock2 允许一种分层协议。分层协议是实现一种更高层级的通信函数,根据下层的传输栈来实现数据的远程交换。一个LSP使用的例子可能是为了安全,他增加一层协议到连接建立处理,以执行认证,并建立在加密方式的相互同意的安全层。这种安全协议通常会需要一个下层的传输协议,类似TCP或SPX的服务。由基提供商实现的术语基础协议是指实现的协议如TCP或SPX,其能够与远程端点进行数据通信的Winsock提供。这个分层协议术语被用来描述不可以单独存在的协议。这些分层协议已经被安装,称为Winsock Layerd Service Provider。
一个LPS使用的例子是 客户端安装在Internet Secutity And Authentication Server中一部分的windows Firewall Client Service Provider。Microsoft Firewall Client Service Provider安装在windows基础协议TCP和UDP之上。一个在ISA FireWall Client软件的 DLL变成一个winsock 的一个分层协议提供者,这样所有winsock程序通信都将经过他。这样,ISA Firewall Client LSP可以拦截从客户端到目标底层服务的 Winsock 函数的调用,然后去请求一个原始底层的服务。一个相似的LPS使用例子是Mrcrosoft Frefront Firewall Service和Theat Management Gateway的一部分,被安装在客户端上。
在LSP初始化的时候,LSP必须提供一系列SPI函数指针。这些函数将被在一般的分层处理中调用(其它的 LSP 或者ws2_32.dll)。
根据一个SPI函数的子集定义一个LSP类别。一个LSP实现和实际处理被这些函数执行。通过LSP的分类,和使用win socket的程序分类类似,他使得你可以在进程运行时有选择的确定一个LSP是否被请求。
在windows vista之后,一个winsock lsp和程序分类的新的方法被提供,所以只有一定的lSP将会被加载。这就是增加这些特性的原因。
一个主要原因是, 一些关键的系统进程如:winlogon和lsass创建socket,但是这些进程不使用这些socket去在网络上传输。所有大部分的LSP不可以被这些进程加载。一些文档已经说明LSP会导致lsass.exe进程崩溃。如果lsass崩溃,系统就会强制关机。另个加载LSP的影响是一些进程从来不退出,当一个LSP安装或移除,如果重启电脑。
还有一些原因就是一些程程序不需要加载指定的LSP。例如,一些程序不需要加载含有加密功能的LSP,这样会导致程序从这个系统到达另一个没有安装LSP的系统时出现问题。
最后,LSP分类可被用于另一些lSP去决定把自己的LSP安装在哪里。一些年,一些LSP开发者已经需要一个方法去知道一个LSP的行为是到底是怎样。例如一个数据流想要在另一个LSP的上层来加密数据。当然,这种LSP分类方法不是十分安全,原因是他依赖于另一个与他相关的第三方LSP分类。
windows vista之后的LSP分类和其它安全机制被设计用来帮助保护用户非故意 的安装恶意的LSP。
LSP 分类:
在windows vista之后,一个LSP是根据与windows socket调用如何配合来分类的。一个LSP是一个唯一标识的一组winsock SPI函数调用。例如 一个http内容过滤的LSP应该被定义为一个数据筛查器(data inspector)(LSP_INSPECTOR 分类)。一个LSP_INSPECTOR分类的LSP将会检测数据参数,但是之后不会修改这些数据。一个程序可以通过查询一个LPS的分类和去选择不加载指定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分类将不会被用于服务和系统进程。
Categorizing LSPs
下面是一些被用于 Categorrizing LSP的一些函数
为了categorize 一个lsp,WSCSetProviderInfo和WSCSetProviderinfo32被调用,他的参数是一个GUID标识这个lSP的隐藏入口 ,这些信息类被设置用于LSP Protocol entry,设置标识用于修改这些函数的行为。
WCSGetProviderInfo和WSCGetProviderInfo32函数经常被用于提取一个LSP相关的数据类和信息。
Categorizing Applications
下面的函数被用于categerizing 一个程序。
为了Categorize an application,WCSSetApplicationCategory function 被调用。他的参数有可执行文件目录,和程序命令行,这标识这个LSP是被被作用于这个程序实例。
判断哪个 LSP被加载
LSP Categorization最后的部分是决定哪引LSP被会加载入哪个进程。当一个进程WINSOCK时,加载LSP时差将会作Application categories和LSP categories的比较。
如果一个程序没有被categorized,允许所有LSP加载入这个进程
如果程序和LSP都被categorized,则必须具备以下条件:
在程序中至少有一个LSP Categories被指定。
Only categories specified in the application's specified categories are specified in the LSPs categories. For example, if the application specifies a category it
If the LSP_SYSTEM category is present in the application's category, it must be present in the LSP's categories.
考虑如下例子:
foo.exe这个程序cateorized为LSP_SYSTEM + LSP_FIREWALL + LSP_CRYPTO_COMPRESS。这个程序bar.exe 的 categorize为LSP_FIREWALL + LSP_CRYPTO_COMPRESS。下面的4个LSP
- LSP1 has set a category of LSP_SYSTEM.
- LSP2 is not categories set, so its category is zero.
- LSP3 has set a category of LSP_FIREWALL.
- LSP4 has set categories of LSP_SYSTEM + LSP_FIREWALL + LSP_CRYPTO_COMPRESS + LSP_INSPECTOR
在这个例子中foo.exe将会只加载LSP2,bar.exe将会加载LSP3。
检测Winsock配置是否被安装
sdk包含一个winsock的程序实例,他演示了如何判定winsock transpot provider是否被安装在当前电脑上。
C:Program FilesMicrosoft SDKsWindowsv7.0SamplesNetDswinsockLSP
这个例子显示了安装一个测试 的LSP。但是他可以被用于编程通信winsock 的详细信息。可以列出所有当前包含winsock providers和layer service provider。用以下命令行执行这个例子
instlsp -p
会输出安装在本地计算机上的winsock provider和layerd service provider。输出的catalog ID和字符串名称。
可以用如下命令行来收集winsock provider的详细信息。
instlsp -p -v
这个输出将会列出一个 WSAPROTOCOL_INFO的结构信息
可以下如下命令行列出本地的layerd service provider
instlsp -l
为了对应LSP结构执行以下命令行
instlsp -m