翻译的太垃圾,不建议其它人阅读本文。

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 Files\Microsoft SDKs\Windows\v7.0\Samples\NetDs\winsock\LSP

这个例子显示了安装一个测试 的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

[翻译]LSP程序的分类的更多相关文章

  1. C/C++程序内存分类

    程序中内存分类主要有下面几种: (1)栈存储区:主要存储局部变量.函数參数.函数返回值等. 栈内存由编译器在须要时自己主动分配,使用完后自己主动释放. (2)堆存储区:由new.malloc申请到的空 ...

  2. CS231n课程笔记翻译3:线性分类笔记

    译者注:本文智能单元首发,译自斯坦福CS231n课程笔记Linear Classification Note,课程教师Andrej Karpathy授权翻译.本篇教程由杜客翻译完成,巩子嘉和堃堃进行校 ...

  3. 百度翻译api 实现简易微信翻译小程序

    介绍 口袋翻译 口袋翻译 微信小程序 翻译功能 含7类语言的相互翻译 包含最近10条的翻译历史回溯功能 微信搜索:简e翻译 功能展示   使用百度翻译api需要申请 appid 与 key 并在 ap ...

  4. Android | 教你如何用代码开发一个拍照翻译小程序

    引子   想必有很多小伙伴喜欢外出旅游,能去海外玩一圈那是更好不过了,旅游前大家一定会对吃.穿.住.行.游玩路线做各种攻略,然后满怀期待的出发- 想象中的旅游   出发前,想象中的旅游目的地可能有漂亮 ...

  5. 微信小程序 左右分类滚动列表

    今天需求个类似得到app分类的功能,效果如图: 左右分别滚动,互不干扰,先把简单的布局和样式搭好. <view class="page"> <view class ...

  6. 微信小程序 左右分类列表

    分类界面,左边是一级目录,右边是一级目录对应的二级目录,根据这个需求,我们数据设计的结构一定是数组嵌套数组,第一个数组包含一级目录数据,嵌套的数组包含的是二级目录的数据. wxml代码: <vi ...

  7. HTML5之appcache语法理解/HTML5应用程序缓存/manifest缓存文件官方用法翻译

    习惯性的贴几个参考链接: W3School-HTML 5 应用程序缓存 官方 MDN window.applicationCache 接口文档 官方 MDN 用法示例 看所有的教程不如直接看最原始的官 ...

  8. NIPS 2018 | 程序翻译新突破:UC伯克利提出树到树的程序翻译神经网络

    NIPS 2018 | 程序翻译新突破:UC伯克利提出树到树的程序翻译神经网络 机器之心 ​ 已认证的官方帐号 49 人赞同了该文章 选自arXiv,作者:Xinyun Chen.Chang Liu. ...

  9. 微信小程序分类的实现

    微信小程序的分类功能思路 实现思路 1.把屏幕当成一个固定的盒子,然后把盒子分成两边,并让盒子的每一边都能够滚动. 2.通过将左侧边栏元素的id和右边内容的categoryId进行匹配,渲染展示相同i ...

随机推荐

  1. matlab练习程序(SUSAN检测)

    matlab练习程序(SUSAN检测) SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny.不过思想还是有点意思的. 主要思想就是:首先做一个和原图像 ...

  2. Linux下动态库(.so)和静态库(.a) 的区别

    静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.编译之后程序文件大,但加载快,隔离性也好.动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还 ...

  3. 【iCore3 双核心板_FPGA】例程十二:Modelsim仿真实验

    实验指导书及代码包下载: http://pan.baidu.com/s/1bnQEldl iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  4. C#写的CRC16检验算法

    /// <summary> /// CRC校验 /// </summary> public class CRC { #region CRC16 public static by ...

  5. swift 2.x学习笔记(一)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #008400 } p.p2 { margin: 0.0px 0. ...

  6. linux 解压xz包

    1.下载xz包 http://tukaani.org/xz/xz-4.999.9beta.tar.bz2   2.解压安装包 $tar -jxvf xz-4.999.9beta.tar.bz2   3 ...

  7. array_diff的参数前后循序的区别

    //如果两个参数之间有区别.array_diff会返回第二个参数的差值 $oldData = array(0=>'德国',1=>'deguo'); $newData = array(0=& ...

  8. hgrjhgkjh

    #include<stdio.h> int step[5]={13,5,1,4,11}; int sum; int min=999; void ji() {  int i;  int j; ...

  9. 便捷从使用git开始

    每次浏览网站上传代码,实在过于不便,为此我们引入git来管理我们的代码. 查看帮助手册是了解其的最佳路径,coding.net也不例外.通过浏览https://coding.net/help/,你会发 ...

  10. python3中urllib2的问题

    import urllib from urllib import request a = urllib.request.Request(url) b = urllib.request.urlopen( ...