lsp传送门链接怎么用

lsp传送门链接怎么用,第1张

LSP本身是DLL,可以将它安装到winsock目录,以便创建套接字的应用程序在不必知道此LSP的任何信息时就能调用它。

运行原理:

套接字创建函数会在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文件看看不就知道了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12345392.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存