运行原理:
套接字创建函数会在winsock目录中寻找第一个合适的协议
找到后调用此协议的WSPStartup函数,导出该LSP的DLL
LSP导出的send,recv等函数通过调用下层分层协议或基础协议来完成各种功能。
编写目的:
让用户调用自定义的服务提供者,由自定义的服务提供者调用下层提供者,这样便可以截获所有的winsock调用了。
LSP本身是DLL,导出一些与winsock API相对应的SPI函数(send、recv等)祥碧。winsock库加载该服务提供者时,便调用该服务提供者提供的这些函数来实现winsockAPI。
LSP也是如此,它向上导出所有的SPI函数供 Ws2_32.dll调用,在内部通过调用基础提供者实现这些SPI。
安装LSP:
实现LSP之前,要先将分层提供者安装到winsock目录,安装包括一个WSAPPROTOCOL_INFOW结构,定义了分层提供者的特性和LSP填写链的方式。(也叫做协议入口)
协议链:
协议链描述了 分层提供者 加入winsock的目谨洞举录的顺序。
typedef struct _WSAPROTOCOLCHAIN{
int ChainLen
DWORD ChainEntries[Max_PROTOCOL_CHAN]
}WSAPROTOCOLCHAIN,*LPWSAPROTOCOLCHAIN
ChainLen为0:分层协议为1 基础协议 大于1 协议链
当ChainLen为0或者1时,ChainEntries数组无意义
大于1时,各个服务提供者的目录ID就包含在数组中。
实现LSP的DLL要么被另一个LSP加载,要么直接被WS2_32.DLL加载。取决于它的位置。
如果LSP没有在协议链的顶端,就会被链中位于它上层的LSP加载,否则的话,将被WS2_32.DLL加载。
安装LSP时,必须在winsock目录中安装两种协议:一个分层协议,一个协议链。
安装分层协议是为了获取winsock库分配的目录ID号,以便在协议链中标识自己的位置。
协议链才是winsock目录中LSP的真正入口,协议链中包含了自己分层协议的目录ID号和下层提供者的目录ID号。
在安装时,要先安装一个分层协议,用系统分配给此分层协议的目录ID和下层提供者的目录ID构建一个 ChainEntries数组,进而构建一个WSAPROTOCOL_INFOW结构,然后再安装这个协议链。
安装函数:
提供LSP GUID DLL WSAPROTOCOL_INFOW结构便可。
int WSCInstallProvider(
const LPGUID lpProviderId,
const LPWSTR lpszProviderDllPath,
const LPWSAPROTOCOL_INFOW lpProtocolInfoList,
DWORD dwNumberOfEntries,
LPINT lpErrno
)
每一个安装提供者需要一个GUID来标识它的入口,颤碧GUID可以通过命令行工具UUIDGEN或者在编程使用UuidCreate函数来生成。
LSP的WSAPROTOCOL_INFOW结构通常从它要分层的下层提供者拷贝
1 szProtocol域要修改,以包含新提供者的名称
2 如果包含XP1_IFS_HANDLES标识,要从dwServiceFlags1域移除。
重新目录排序WSCWriteProviderOrder
新安装的LSP会默认安装到winsock目录的结尾,这样系统调用的时候,还是会调用原先调用的LSP,因此只有进行重新的排序才能让系统调用到新安装的LSP。
总结:
1 安装分层协议入口,以便获取系统分配的目录ID号。
2 安装一个或者多个协议链,安装的数量取决于要分层的下层协议的数量。
3 在结尾进行目录排序。
示例代码:
// 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=0i<nProtocolsi++)
{
if(pProtoInfo[i].iAddressFamily == AF_INET &&pProtoInfo[i].iProtocol == IPPROTO_UDP)
{
memcpy(&UDPChainInfo, &pProtoInfo[i], sizeof(UDPLayeredInfo))
//
UDPChainInfo.dwServiceFlags1 = UDPChainInfo.dwServiceFlags1 &~XP1_IFS_HANDLES
// 保存原来的入口ID
dwUdpOrigCatalogId = 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即0
UDPLayeredInfo.dwProviderFlags |= PFL_HIDDEN
// 安装
if(::WSCInstallProvider(&ProviderGuid,
wszDllPath, &UDPLayeredInfo, 1, &nError) == SOCKET_ERROR)
return nError
// 重新枚举协议,获取分层协议的目录ID号
FreeProvider(pProtoInfo)
pProtoInfo = GetProvider(&nProtocols)
for(i=0i<nProtocolsi++)
{
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.ChainLeni>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
}
else
return GetLastError()
// 重新排序Winsock目录,将我们的协议链提前
// 重新枚举安装的协议
FreeProvider(pProtoInfo)
pProtoInfo = GetProvider(&nProtocols)
DWORD dwIds[20]
int nIndex = 0
// 添加我们的协议链
for(i=0i<nProtocolsi++)
{
if((pProtoInfo[i].ProtocolChain.ChainLen >1) &&
(pProtoInfo[i].ProtocolChain.ChainEntries[0] == dwLayeredCatalogId))
dwIds[nIndex++] = pProtoInfo[i].dwCatalogEntryId
}
// 添加其它协议
for(i=0i<nProtocolsi++)
{
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=0i<nProtocolsi++)
{
if(memcmp(&ProviderGuid, &pProtoInfo[i].ProviderId, sizeof(ProviderGuid)) == 0)
{
dwLayeredCatalogId = pProtoInfo[i].dwCatalogEntryId
break
}
}
if(i <nProtocols)
{
// 移除协议链
for(i=0i<nProtocolsi++)
{
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")
}
}
else
RemoveProvider()
}
打开CSDN APP,看更多技术内容
分层服务提供者(LSP)_acmumw248662的博客
实现LSP之前,将分层提供者安装到Winsock目录,安装一个LSP包括安装一个WSAPROTOCOL_INFOW结构(协议的入口),让创建套接字的应用程序可以枚举到它. WSAPROTOCOL_INFOW结构:定义了分层提供者的特性和LSP是如何填写"链"的. (1)协议链 LSP和...
继续访问
网络封包过滤之分层服务提供者(LSP)_weixin_41454036的博客
实现LSP之前,将分层提供者安装到Winsock目录,安装一个LSP包括安装一个WSAPROTOCOL_INFOW结构(协议的入口),让创建套接字的应用程序可以枚举到它. WSAPROTOCOL_INFOW结构:定义了分层提供者的特性和LSP是如何填写"链"的. (1) 协议链 LSP...
继续访问
网络封包过滤之分层服务提供者(LSP)(1)
<br />开发过滤数据包的LSP程序可以定义过滤规则,恩,先看看<br />LSP本身是DLL,可以将它安装至Winsock目录,创建套接字的应用程序不必知道此LSP的任何信息就能调用它<br />1. 运行原理 <br />用户创建套接字<br />1) 套接字创建函数(如socket)在Winsock目录寻找合适的协议<br />2) 此协议的提供者导出的函数完成各种功能<br />我们的目的:<br />1) 将自己编写的提供者安装到Winsock目录中,让用户调用我们的服务提供者<br />2)
继续访问
分层服务提供者(LSP)
分层服务提供者(LSP) -分层服务提供者(LSP) 开发过滤数据包的LSP程序可以定义过滤规则,恩,先看看 LSP本身是DLL,可以将它安装至Winsock目录,创建套接字的应用程序不必知道此LSP的任何信息就能调用它 1. 运行原理 用户创建套接字 1) 套接字创建函数(如socket)在Winsock目录寻找合适的协议 2) 此协议的提供
继续访问
LSP分层服务提供者的认识_HIT1180300216的博客
LSP分层服务提供者的认识 LSP本身是DLL,可以将它安装到winsock目录,以便创建套接字的应用程序不必知道此LSP的任何信息就能调用它。 运行原理: 套接字创建函数会在winsock目录中寻找合适的协议
继续访问
网络编程之编写LSP进行Winsock API监控拦截或LSP注入_htpidk的博客-CSD...
二、开始编写LSP分层服务提供者的DLL: 【开始编写】 1、步骤 :创建Win32程序 -->DLL开发 2、新建一个.def文件: EXPORTS WSPStartup @2 【代码步骤分析】 1、网络程序加载LSP分层服务提供者的DLL,并调用了DLL里的WSPStartup初始化函...
继续访问
LSP分层服务提供者管理
用于windows LSP的维护管理 可检测恶意LSP网络拦截程序
LSP分层服务提供程序
包含LSP分层服务提供者过滤DLL源码、LSP安装程序源码、测试程序源码
分层服务提供者LSP
windows 分层服务提供者实现,安装、卸载等管理, 可用于监控网络应用
LSP(分层服务提供程序)
一、简介 LSP即分层服务提供商,Winsock 作为应用程序的 Windows 的网络套接字工具,可以由称为“分层服务提供商”的机制进行扩展。Winsock LSP 可用于非常广泛的实用用途,包括 Internet 家长控制 (parental control) 和 Web 内容筛选。在以前版本的 Windows XP 中,删除不正确的(也称为“buggy”)LSP 可能会导致注册表中的 Win...
继续访问
热门推荐 网络编程之Winsock2 服务提供者接口(SPI)
【1】全称Winsock2 服务提供者接口(SPI): [描述] 1、一般用于提供给 *** 作系统开发商、传输堆栈商在基础协议的基础上,开发更高级的服务. 2、因为[Winsock服务体系]符合[Windows开放服务体系],所以,它支持[第三方服务提供者]插入到其中. 3、只要上层和下层的边缘支持Winsock2 SPI,即可向他们中间安装[提供者程序]. 4、普通开发者一般都是开发SPI的LSP(分层服务提供者),即第三方提供者,可用于监控Winsock API执行,HOOK Winsock API,甚至利
继续访问
安装LSP分层服务的理解
要安装在udp之上.(代码来源网络)1。枚举所有的,找到UDP的入口WSAPROTOCOL_INFOW2。拷备一个WSAPROTOCOL_INFOW到2个变量中,下面安装的的LSP需要分层和协议链WSAPROTOCOL_INFOW inf1,inf23。修改几个必要的字段和标志位4。然后把这个分层服务inf1安装上去5。再一次枚举所有的,找到刚刚安装
继续访问
LSP和Hooks拦截
分层服务提供者(英语:Layered Service Provider,缩写LSP)是一项已被弃用的Microsoft Windows中Winsock 2服务提供者接口(SPI)的特性,它也被称为分层服务提供商或分层服务提供程序。 分层服务提供者为使用Winsock API插入本身到TCP/IP协议栈的DLL。在进入协议栈后,分层服务提供者可以拦截和修改入站和出站的互联网流量。它可以处理所有访问...
继续访问
LSP测试代码包含测试和安装程序
LSP安装和拦截函数例子 VS2008工程 LSPDEMO是安装程序 TinyLSP为实现函数
windows LSP 实现及多个lsp兼容安装的几个坑
2019独角兽企业重金招聘Python工程师标准>>>...
继续访问
LSP劫持与网络数据转发代理服务器的心得笔记
前言 本文的目标读者是那些对LSP劫持有一定了解,也写了一些lsp程序,并想进一步深研lsp,意图做LSP代理工具的人。 如果读者对LSP没有一点了解,可以参考下面的文章: 网游加速原理、技术与实现的第5章节 VC++基于LSP实现数据拦截 LSP网络监控 正文 简介: LSP是分层服务代理的英文简写。可以这么理解,windows中任何一个socket连接最终都要调用系统库,如......
继续访问
分层服务提供者
写评论
评论
1
在更多探索”里灶败羡通过查找”使用。1、打开软件,首先将语言调整为简体枯闹中文”。
2、点击探索更多”。
3、点击最左侧最受欢迎”,在我的文件”中任意选择一个。
4、在最左侧漫画”杂项”中多项隐拍选择。
5、左下侧输入关键字后点击查找”。
lsp图书馆全称是LibraryServiceProgram,即图书馆服务程序。是一款非常好用的看图软件,玩家订阅后就能直接使用,但目前已下线。
分类: 电脑/网络 >>程序设计 >>其他编程语言问题枣判描述:
应用命孙岩毁令是什么?
谢谢则备!
解析:
自己用记事本打开 那个LSP文件看看不就知道了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)