当前位置:编程学习 > VC++ >>

VC++基于LSP拦截数据封包

LSP即分层服务提供商,Winsock 作为应用程序的 Windows 的网络套接字工具,可以由称为“分层服务提供商”的机制进行扩展。
Winsock LSP 可用于非常广泛的实用用途,包括 Internet 家长控制 (parental control) 和 Web 内容筛选。在以前版本的 Windows XP 中,删除不正确的(也称为“buggy”)LSP 可能会导致注册表中的 Winsock 目录损坏,潜在地导致所有网络连接的丢失。
LSP(Layered Service Provider )  中文名为分层服务提供程序。 LSP就是TCP/IP等协议的接口.LSP用在正途上可以方便程序员们编写监视系统网络通讯情况的Sniffer,可是现在常见的LSP都被用于浏览器劫持.
 LSP安装卸载代码如下
[cpp] 
 // InstLSP.cpp文件 
 
// 包含了安装LSP的代码 
 
// InstallProvider(WCHAR *pwszPathName) 将指定LSP提供者安装到TCP UDP 和原始套节字之上 
// RemoveProvider()                     移除InstallProvider函数安装的LSP 
 
#define UNICODE 
#define _UNICODE 
 
#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;  www.zzzyk.com
    } 
     
    pProtoInfo = (LPWSAPROTOCOL_INFOW)::GlobalAlloc(GPTR, dwSize); 
    *lpnTotalProtocols = ::WSCEnumProtocols(NULL, pProtoInfo, &dwSize, &nError); 
    return pProtoInfo; 

 
void FreeProvider(LPWSAPROTOCOL_INFOW pProtoInfo) 

    ::GlobalFree(pProtoInfo); 

 
BOOL InstallProvider(WCHAR *pwszPathName) 

    WCHAR wszLSPName[] = L"PhoenixLSP"; 
    LPWSAPROTOCOL_INFOW pProtoInfo; 
    int nProtocols; 
    WSAPROTOCOL_INFOW OriginalProtocolInfo[3]; 
    DWORD            dwOrigCatalogId[3]; 
    int nArrayCount = 0; 
 
    DWORD dwLayeredCatalogId;       // 我们分层协议的目录ID号 
 
    int nError; 
     
        // 找到我们的下层协议,将信息放入数组中 
    // 枚举所有服务程序提供者 
    pProtoInfo = GetProvider(&nProtocols); 
    BOOL bFindUdp = FALSE; 
    BOOL bFindTcp = FALSE; 
    BOOL bFindRaw = FALSE; 
    for(int i=0; i<nProtocols; i++) 
    { 
        if(pProtoInfo[i].iAddressFamily == AF_INET) 
        { 
        if(!bFindUdp && pProtoInfo[i].iProtocol == IPPROTO_UDP) 
            { 
                memcpy(&OriginalProtocolInfo[nArrayCount], &pProtoInfo[i], sizeof(WSAPROTOCOL_INFOW)); 
                OriginalProtocolInfo[nArrayCount].dwServiceFlags1 =  
                    OriginalProtocolInfo[nArrayCount].dwServiceFlags1 & (~XP1_IFS_HANDLES);  
                 
                dwOrigCatalogId[nArrayCount++] = pProtoInfo[i].dwCatalogEntryId; 
 
                bFindUdp = TRUE; 
            } 
 
        if(!bFindTcp && pProtoInfo[i].iProtocol == IPPROTO_TCP) 
            { 
                memcpy(&OriginalProtocolInfo[nArrayCount], &pProtoInfo[i], sizeof(WSAPROTOCOL_INFOW)); 
                OriginalProtocolInfo[nArrayCount].dwServiceFlags1 =  
                    OriginalProtocolInfo[nArrayCount].dwServiceFlags1 & (~XP1_IFS_HANDLES);  
                 
                dwOrigCatalogId[nArrayCount++] = pProtoInfo[i].dwCatalogEntryId; 
 
                bFindTcp = TRUE; 
            }  
        if(!bFindRaw && pProtoInfo[i].iProtocol == IPPROTO_IP) 
            { 
                memcpy(&OriginalProtocolInfo[nArrayCount], &pProtoInfo[i], sizeof(WSAPROTOCOL_INFOW)); 
                OriginalProtocolInfo[nArrayCount].dwServiceFlags1 =  
                    OriginalProtocolInfo[nArrayCount].dwServiceFlags1 & (~XP1_IFS_HANDLES);  
                 
                dwOrigCatalogId[nArrayCount++] = pProtoInfo[i].d

补充:软件开发 , Vc ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,