一、简介

LSP即分层服务提供商,Winsock 作为应用程序的 Windows 的网络套接字工具,可以由称为“分层服务提供商”的机制进行扩展。Winsock LSP 可用于非常广泛的实用用途,包括 Internet 家长控制 (parental control) 和 Web 内容筛选。在以前版本的 Windows XP 中,删除不正确的(也称为“buggy”)LSP 可能会导致注册表中的 Winsock 目录损坏,潜在地导致所有网络连接的丢失。 LSP就是TCP/IP等协议的接口.LSP用在正途上可以方便程序员们编写监视系统网络通讯情况的Sniffer,可是现在常见的LSP都被用于浏览器劫持。

二、LSP操作

netsh winsock

option:
    ?              - 显示命令列表。
    audit          - 显示已经安装和删除的 Winsock LSP 列表。
    dump           - 显示一个配置脚本。
    help           - 显示命令列表。
    remove         - 从系统中删除 Winsock LSP。
    reset          - 重置 Winsock 目录为清除状态。
    set            - 设置 Winsock 选项。
    show           - 显示信息。

若需要命令的更多帮助信息,请键入命令,接着是空格,
后面跟 ?。

常用指令

netsh winsock show catalog        #显示已经安装LSP 列表
netsh winsock reset               #重置Winsock LSP 

三、实现LSP

步骤如下:

1、安装分层协议入口,以便获取系统分配的目录ID号。2、安装一个或者多个协议链,安装的数量取决于要分层的下层协议的数量。3、在结尾进行目录排序。

参考:http://www.cnblogs.com/xing901022/archive/2012/10/23/2736259.html

四、示例

////
// InstDemo.cpp

#include <Ws2spi.h>
#include <Sporder.h>                // 定义了WSCWriteProviderOrder函数

#include <windows.h>
#include <stdio.h>#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "Rpcrt4.lib")    // 实现了UuidCreate函数// 要安装的LSP的硬编码,在移除的时候还要使用它
GUID  ProviderGuid = {0xd3c21122, 0x85e1, 0x48f3, {0x9a,0xb6,0x23,0xd9,0x0c,0x73,0x07,0xef}};LPWSAPROTOCOL_INFOW GetProvider(LPINT lpnTotalProtocols)
{DWORD dwSize = 0;int nError;LPWSAPROTOCOL_INFOW pProtoInfo = NULL;// 取得需要的长度if(::WSCEnumProtocols(NULL, pProtoInfo, &dwSize, &nError) == SOCKET_ERROR){if(nError != WSAENOBUFS)return NULL;}pProtoInfo = (LPWSAPROTOCOL_INFOW)::GlobalAlloc(GPTR, dwSize);*lpnTotalProtocols = ::WSCEnumProtocols(NULL, pProtoInfo, &dwSize, &nError);return pProtoInfo;
}void FreeProvider(LPWSAPROTOCOL_INFOW pProtoInfo)
{::GlobalFree(pProtoInfo);
}// 将LSP安装到UDP协议提供者之上
int InstallProvider(WCHAR *wszDllPath)
{WCHAR wszLSPName[] = L"TinyLSP";    // 我们的LSP的名称int nError = NO_ERROR;LPWSAPROTOCOL_INFOW pProtoInfo;int nProtocols;WSAPROTOCOL_INFOW UDPLayeredInfo, UDPChainInfo; // 我们要安装的UDP分层协议和协议链
    DWORD dwUdpOrigCatalogId, dwLayeredCatalogId;// 在Winsock目录中找到原来的UDP协议服务提供者,我们的LSP要安装在它之上// 枚举所有服务程序提供者pProtoInfo = GetProvider(&nProtocols);for(int i=0; i<nProtocols; i++){if(pProtoInfo[i].iAddressFamily == AF_INET && pProtoInfo[i].iProtocol == IPPROTO_UDP){memcpy(&UDPChainInfo, &pProtoInfo[i], sizeof(UDPLayeredInfo));// UDPChainInfo.dwServiceFlags1 = UDPChainInfo.dwServiceFlags1 & ~XP1_IFS_HANDLES;  // 保存原来的入口IDdwUdpOrigCatalogId = pProtoInfo[i].dwCatalogEntryId;break;}}  // 首先安装分层协议,获取一个Winsock库安排的目录ID号,即dwLayeredCatalogId// 直接使用下层协议的WSAPROTOCOL_INFOW结构即可memcpy(&UDPLayeredInfo, &UDPChainInfo, sizeof(UDPLayeredInfo));// 修改协议名称,类型,设置PFL_HIDDEN标志
    wcscpy(UDPLayeredInfo.szProtocol, wszLSPName);UDPLayeredInfo.ProtocolChain.ChainLen = LAYERED_PROTOCOL;        // LAYERED_PROTOCOL即0UDPLayeredInfo.dwProviderFlags |= PFL_HIDDEN;// 安装if(::WSCInstallProvider(&ProviderGuid, wszDllPath, &UDPLayeredInfo, 1, &nError) == SOCKET_ERROR)return nError;// 重新枚举协议,获取分层协议的目录ID号
    FreeProvider(pProtoInfo);pProtoInfo = GetProvider(&nProtocols);for(i=0; i<nProtocols; i++){if(memcmp(&pProtoInfo[i].ProviderId, &ProviderGuid, sizeof(ProviderGuid)) == 0){dwLayeredCatalogId = pProtoInfo[i].dwCatalogEntryId;break;}}// 安装协议链// 修改协议名称,类型WCHAR wszChainName[WSAPROTOCOL_LEN + 1];swprintf(wszChainName, L"%ws over %ws", wszLSPName, UDPChainInfo.szProtocol);wcscpy(UDPChainInfo.szProtocol, wszChainName);if(UDPChainInfo.ProtocolChain.ChainLen == 1){UDPChainInfo.ProtocolChain.ChainEntries[1] = dwUdpOrigCatalogId;}else{for(i=UDPChainInfo.ProtocolChain.ChainLen; i>0 ; i--){UDPChainInfo.ProtocolChain.ChainEntries[i] = UDPChainInfo.ProtocolChain.ChainEntries[i-1];}}UDPChainInfo.ProtocolChain.ChainLen ++;// 将我们的分层协议置于此协议链的顶层UDPChainInfo.ProtocolChain.ChainEntries[0] = dwLayeredCatalogId; // 获取一个Guid,安装之
    GUID ProviderChainGuid;if(::UuidCreate(&ProviderChainGuid) == RPC_S_OK){if(::WSCInstallProvider(&ProviderChainGuid, wszDllPath, &UDPChainInfo, 1, &nError) == SOCKET_ERROR)return nError;}elsereturn GetLastError();// 重新排序Winsock目录,将我们的协议链提前// 重新枚举安装的协议
    FreeProvider(pProtoInfo);pProtoInfo = GetProvider(&nProtocols);DWORD dwIds[20];int nIndex = 0;// 添加我们的协议链for(i=0; i<nProtocols; i++){if((pProtoInfo[i].ProtocolChain.ChainLen > 1) &&(pProtoInfo[i].ProtocolChain.ChainEntries[0] == dwLayeredCatalogId))dwIds[nIndex++] = pProtoInfo[i].dwCatalogEntryId;}// 添加其它协议for(i=0; i<nProtocols; i++){if((pProtoInfo[i].ProtocolChain.ChainLen <= 1) ||(pProtoInfo[i].ProtocolChain.ChainEntries[0] != dwLayeredCatalogId))dwIds[nIndex++] = pProtoInfo[i].dwCatalogEntryId;}// 重新排序Winsock目录nError = ::WSCWriteProviderOrder(dwIds, nIndex);FreeProvider(pProtoInfo);return nError;
}void RemoveProvider()
{    LPWSAPROTOCOL_INFOW pProtoInfo;int nProtocols;DWORD dwLayeredCatalogId;// 根据Guid取得分层协议的目录ID号pProtoInfo = GetProvider(&nProtocols);int nError;for(int i=0; i<nProtocols; i++){if(memcmp(&ProviderGuid, &pProtoInfo[i].ProviderId, sizeof(ProviderGuid)) == 0){dwLayeredCatalogId = pProtoInfo[i].dwCatalogEntryId;break;}}if(i < nProtocols){// 移除协议链for(i=0; i<nProtocols; i++){if((pProtoInfo[i].ProtocolChain.ChainLen > 1) &&(pProtoInfo[i].ProtocolChain.ChainEntries[0] == dwLayeredCatalogId)){::WSCDeinstallProvider(&pProtoInfo[i].ProviderId, &nError);}}// 移除分层协议::WSCDeinstallProvider(&ProviderGuid, &nError);}
}////int binstall = 0;
void main()
{if(binstall){if(InstallProvider(L"lsp.dll") == ERROR_SUCCESS){printf(" Install successully \n");}else{printf(" Install failed \n");}}elseRemoveProvider();
}

转载于:https://www.cnblogs.com/274914765qq/p/4729410.html

LSP(分层服务提供程序)相关推荐

  1. 无法启动ASP.NET状态服务 错误0x8007277a;无法加载或初始化请求的服务提供程序

    问题:无法启动ASP.NET状态服务 错误0x8007277a;无法加载或初始化请求的服务提供程序 解决:如果在启动ASP.NET State Service服务时遇到问题0x8007277a 即无法 ...

  2. 十年一遇的奇葩故障--Windows网络编程接口故障:telnet显示无法加载或初始化请求的服务提供程序...

    现象:某同事的笔记本win7x64系统,当初故障是无法使用小乌龟连接到svn服务器,但又可以正常上网,并且svn服务器端是正常的. 后来我进一步测试,发觉该电脑也不能连接到远程windows. net ...

  3. ftpwebrequest 无法加载或初始化请求的服务提供程序_jvm之类加载机制

    什么是类加载 每个编写的".java"拓展名类文件都存储着需要执行的程序逻辑,这些".java"文件经过Java编译器编译成拓展名为".class&q ...

  4. jupyter notebook OSError: [WinError 10106] 无法加载或初始化请求的服务提供程序, 错误提示解决方法

    win+R 输入cmd 打开命令窗口 输入 netsh winsock reset 后重启电脑即可.

  5. 如何删除 MOSS 共享服务提供程序 (SSP, Shared Service Provider)

    在 MOSS 2007 管理中心站点找了半天也没有发现一个可以删除 SSP 的入口,难道不能删除?google 到这里 How to delete a default SSP (Shared Serv ...

  6. java spi_Java SPI(服务提供商接口)和ServiceLoader

    java spi Java SPI (Service Provider Interface) is the mechanism to load services dynamically. We can ...

  7. 先传递高八位,后传递低八位_高电子邮件可传递性的7个最佳SMTP服务提供商(2020)

    先传递高八位,后传递低八位 Are you looking for the best SMTP service providers? 您在寻找最佳的SMTP服务提供商吗? An SMTP servic ...

  8. DCMTK:基本工作清单管理服务类提供程序基于一组文件作为数据源

    DCMTK:基本工作清单管理服务类提供程序基于一组文件作为数据源 基本工作清单管理服务类提供程序基于一组文件作为数据源 基本工作清单管理服务类提供程序基于一组文件作为数据源 #include &quo ...

  9. DCMTK:表示基于文件系统的基本工作列表管理服务类提供程序的控制台引擎的类

    DCMTK:表示基于文件系统的基本工作列表管理服务类提供程序的控制台引擎的类 表示基于文件系统的基本工作列表管理服务类提供程序的控制台引擎的类 表示基于文件系统的基本工作列表管理服务类提供程序的控制台 ...

最新文章

  1. SSH-publickey
  2. docker 启动mongodb
  3. Hihocoder 1370 快乐数字
  4. 跟小静读《jQuery权威指南》——目录
  5. spark之4:基础指南(源自官方文档)
  6. Ubuntu14.04LST安装weblogic11g
  7. C++语言基础 —— 控制结构
  8. efi引导文件_你们心心念念的oc通用EFI来了!
  9. 3.15 晚会—「饿了么」之殇
  10. Python 批量生成中文姓名(百家姓)
  11. Atitit  循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate).
  12. C# CommandName四个属性
  13. 教孩子学编程python 代码_天津哪有教孩子学编程python
  14. 华硕fl5600l重装系统
  15. cuda/cudnn/cuda 10.1安装教程
  16. 完形填空生成器 1-1 打开文本框与提取文本字符
  17. 覆盖vue.js样式_使用Vue.js和Cloudinary在化身上覆盖眼镜/面罩
  18. HasS Python 温湿度检测系统及小程序实现 (一) 温湿度检测及数据上云
  19. long long整型
  20. 更换Tomcat默认主页

热门文章

  1. Mongoose 中使用 populate 实现关联查询
  2. 五、scrapy爬虫框架——logging 模块的使用
  3. LeetCode 2071. 你可以安排的最多任务数目(二分查找)
  4. LeetCode 1707. 与数组中元素的最大异或值(Trie树)
  5. LeetCode MySQL 1174. 即时食物配送 II
  6. LeetCode 30. 串联所有单词的子串(字符串哈希)
  7. 程序员面试金典 - 面试题 04.02. 最小高度树(二叉搜索树中序遍历)
  8. LeetCode 671. 二叉树中第二小的节点
  9. NumPy快速入门--基础知识
  10. php aura,AuraPHP路由器没有拿起参数