LSP(分层服务提供程序)
一、簡介
LSP即分層服務提供商,Winsock 作為應用程序的 Windows 的網絡套接字工具,可以由稱為“分層服務提供商”的機制進行擴展。Winsock LSP 可用于非常廣泛的實用用途,包括 Internet 家長控制 (parental control) 和 Web 內容篩選。在以前版本的 Windows XP 中,刪除不正確的(也稱為“buggy”)LSP 可能會導致注冊表中的 Winsock 目錄損壞,潛在地導致所有網絡連接的丟失。 LSP就是TCP/IP等協(xié)議的接口.LSP用在正途上可以方便程序員們編寫監(jiān)視系統(tǒng)網絡通訊情況的Sniffer,可是現(xiàn)在常見的LSP都被用于瀏覽器劫持。
?
二、LSP操作
netsh winsockoption:
??? ?????????????? - 顯示命令列表。
??? audit????????? - 顯示已經安裝和刪除的 Winsock LSP 列表。
??? dump?????????? - 顯示一個配置腳本。
??? help?????????? - 顯示命令列表。
??? remove???????? - 從系統(tǒng)中刪除 Winsock LSP。
??? reset????????? - 重置 Winsock 目錄為清除狀態(tài)。
??? set??????????? - 設置 Winsock 選項。
??? show?????????? - 顯示信息。
常用指令
netsh winsock show catalog #顯示已經安裝LSP 列表 netsh winsock reset #重置Winsock LSP?
三、實現(xiàn)LSP
步驟如下:
1、安裝分層協(xié)議入口,以便獲取系統(tǒng)分配的目錄ID號。2、安裝一個或者多個協(xié)議鏈,安裝的數(shù)量取決于要分層的下層協(xié)議的數(shù)量。3、在結尾進行目錄排序。 參考:http://www.cnblogs.com/xing901022/archive/2012/10/23/2736259.html?
四、示例
//// // InstDemo.cpp #include <Ws2spi.h> #include <Sporder.h> // 定義了WSCWriteProviderOrder函數(shù) #include <windows.h> #include <stdio.h>#pragma comment(lib, "Ws2_32.lib") #pragma comment(lib, "Rpcrt4.lib") // 實現(xiàn)了UuidCreate函數(shù)// 要安裝的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協(xié)議提供者之上 int InstallProvider(WCHAR *wszDllPath) {WCHAR wszLSPName[] = L"TinyLSP"; // 我們的LSP的名稱int nError = NO_ERROR;LPWSAPROTOCOL_INFOW pProtoInfo;int nProtocols;WSAPROTOCOL_INFOW UDPLayeredInfo, UDPChainInfo; // 我們要安裝的UDP分層協(xié)議和協(xié)議鏈 DWORD dwUdpOrigCatalogId, dwLayeredCatalogId;// 在Winsock目錄中找到原來的UDP協(xié)議服務提供者,我們的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;}} // 首先安裝分層協(xié)議,獲取一個Winsock庫安排的目錄ID號,即dwLayeredCatalogId// 直接使用下層協(xié)議的WSAPROTOCOL_INFOW結構即可memcpy(&UDPLayeredInfo, &UDPChainInfo, sizeof(UDPLayeredInfo));// 修改協(xié)議名稱,類型,設置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;// 重新枚舉協(xié)議,獲取分層協(xié)議的目錄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;}}// 安裝協(xié)議鏈// 修改協(xié)議名稱,類型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 ++;// 將我們的分層協(xié)議置于此協(xié)議鏈的頂層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目錄,將我們的協(xié)議鏈提前// 重新枚舉安裝的協(xié)議 FreeProvider(pProtoInfo);pProtoInfo = GetProvider(&nProtocols);DWORD dwIds[20];int nIndex = 0;// 添加我們的協(xié)議鏈for(i=0; i<nProtocols; i++){if((pProtoInfo[i].ProtocolChain.ChainLen > 1) &&(pProtoInfo[i].ProtocolChain.ChainEntries[0] == dwLayeredCatalogId))dwIds[nIndex++] = pProtoInfo[i].dwCatalogEntryId;}// 添加其它協(xié)議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;// 根據(jù)Guid取得分層協(xié)議的目錄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){// 移除協(xié)議鏈for(i=0; i<nProtocols; i++){if((pProtoInfo[i].ProtocolChain.ChainLen > 1) &&(pProtoInfo[i].ProtocolChain.ChainEntries[0] == dwLayeredCatalogId)){::WSCDeinstallProvider(&pProtoInfo[i].ProviderId, &nError);}}// 移除分層協(xié)議::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
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的LSP(分层服务提供程序)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: import-module的注意事项与N
- 下一篇: Easyspy网络检测系统