设为首页 加入收藏

TOP

VC++基于LSP拦截数据封包(一)
2013-04-24 12:11:56 】 浏览:2613
Tags:基于 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;

  }

  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 ;

  DWORD            dwOrigCatalogId ;

  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].dwCatalogEntryId;

  bFindRaw = TRUE;

  }

  }

  }

  // 安装我们的分层协议,获取一个dwLayeredCatalogId

  // 随便找一个下层协议的结构复制过来即可

  WSAPROTOCOL_INFOW LayeredProtocolInfo;

  memcpy(&LayeredProtocolInfo, &OriginalProtocolInfo[0], sizeof(WSAPROTOCOL_INFOW));

  // 修改协议名称,类型,设置PFL_HIDDEN标志

  wcscpy(LayeredProtocolInfo.szProtocol, wszLSPName);

  LayeredProtocolInfo.ProtocolChain.ChainLen = LAYERED_PROTOCOL; // 0;

  LayeredProtocolInfo.dwProviderFlags |= PFL_HIDDEN;

  // 安装

  if(::WSCInstallProvider(&ProviderGuid,

  pwszPathName, &LayeredProtocolInfo, 1, &nError) == SOCKET_ERROR)

  {

  return FALSE;

  }

  // 重新枚举协议,获取分层协议的目录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];

  for(i=0; i<nArrayCount; i++)

  {

  swprintf(wszChainName, L"%ws over %ws", wszLSPName, OriginalProtocolInfo[i].szProtocol);

  wcscpy(OriginalProtocolInfo[i].szProtocol, wszChainName);

  if(OriginalProtocolInfo[i].ProtocolChain.ChainLen == 1)

  {

  OriginalProtocolInfo[i].ProtocolChain.ChainEntries = dwOrigCatalogId[i];

  }

  else

  {

  for(int j = OriginalProtocolInfo[i].ProtocolChain.ChainLen; j>0; j--)

  {

  OriginalProtocolInfo[i].ProtocolChain.ChainEntries[j]

  = OriginalProtocolInfo[i].ProtocolChain.ChainEntries[j-1];

  }

  }

  OriginalProtocolInfo[i].ProtocolChain.ChainLen ++;

  OriginalProtocolInfo[i].ProtocolChain.ChainEntries[0] = dwLayeredCatalogId;

  }

  // 获取一个Guid,安装之

  GUID ProviderChainGuid;

  if(::UuidCreate(&ProviderChainGuid) == RPC_S_OK)

  {

  if(::WSCInstallProvider(&ProviderChainGuid,

  pwszPathName, OriginalProtocolInfo, nArrayCount, &nError) == SOCKET_ERROR)

  {

  return FALSE;

  }

  }

  else

  return FALSE;

  // 重新排序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目录

  if((nError = ::WSCWriteProviderOrder(dwIds, nIndex)) != ERROR_SUCCESS)

  {

  return FALSE;

  }

     

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/9/9
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇VC++延时函数 下一篇VC++实现TCP与UDP链接

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目