sniffer

博客给出了TCP/IP数据包监听与分析的代码实现。在stdafx.h中添加必要头文件和宏定义,定义了TCP和IP结构体。包含辅助函数用于获取协议文本,监听函数实现了Winsock初始化、套接字创建、绑定等操作,接收并分析数据包信息,最后需在项目设置中添加Ws2_32.lib。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在stdafx.h中添加:

#include <winsock2.h>
#include <ws2tcpip.h> //用于IP_HDRINCL标记
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
#define BUFFER_SIZE 65535

typedef struct _TCP{ WORD SrcPort; // 源端口
WORD DstPort; // 目的端口
DWORD SeqNum; // 顺序号
DWORD AckNum; // 确认号
BYTE DataOff; // TCP头长
BYTE Flags; // 标志(URG、ACK等)
WORD Window; // 窗口大小
WORD Chksum; // 校验和
WORD UrgPtr; // 紧急指针
} TCP;
typedef TCP *LPTCP;
typedef TCP UNALIGNED * ULPTCP;
typedef struct _IP{
union{ BYTE Version; // 版本
BYTE HdrLen; // IHL
};
BYTE ServiceType; // 服务类型
WORD TotalLen; // 总长
WORD ID; // 标识
union{ WORD Flags; // 标志
WORD FragOff; // 分段偏移
};
BYTE TimeToLive; // 生命期
BYTE Protocol; // 协议
WORD HdrChksum; // 头校验和
DWORD SrcAddr; // 源地址
DWORD DstAddr; // 目的地址
BYTE Options; // 选项
} IP;
typedef IP * LPIP;
typedef IP UNALIGNED * ULPIP;
#define PROTOCOL_STRING_ICMP_TXT "ICMP"
#define PROTOCOL_STRING_TCP_TXT "TCP"
#define PROTOCOL_STRING_UDP_TXT "UDP"
#define PROTOCOL_STRING_SPX_TXT "SPX"
#define PROTOCOL_STRING_NCP_TXT "NCP"
#define PROTOCOL_STRING_UNKNOW_TXT "UNKNOW"

辅助函数:

CString CABCDlg::GetProtocolTxt(int Protocol)
{
 switch (Protocol){
  case IPPROTO_ICMP : //1 /* control message protocol */
  return PROTOCOL_STRING_ICMP_TXT;
  case IPPROTO_TCP : //6 /* tcp */
  return PROTOCOL_STRING_TCP_TXT;
  case IPPROTO_UDP : //17 /* user datagram protocol */
  return PROTOCOL_STRING_UDP_TXT;
  default:
  return PROTOCOL_STRING_UNKNOW_TXT;

}
}

监听函数:

void CABCDlg::OnButton1()
{
 // 检查 Winsock 版本号,WSAData为WSADATA结构对象
 WSADATA WSAData;
 WSAStartup(MAKEWORD(2, 2), &WSAData);
 // 创建原始套接字
 //SOCKET sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
 SOCKET sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
 // 设置IP头操作选项,其中flag 设置为ture,亲自对IP头进行处理
 bool flag = true;
 setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag));
 // 获取本机名
 char LocalName[50];
 gethostname((char*)LocalName, sizeof(LocalName)-1);
 // 获取本地 IP 地址
 hostent* pHost = gethostbyname((char*)LocalName);
 // 填充SOCKADDR_IN结构
 sockaddr_in addr_in;
 addr_in.sin_addr = *(in_addr *)pHost->h_addr_list[0]; //IP
 addr_in.sin_family = AF_INET;
 addr_in.sin_port = htons(57274);
 // 把原始套接字sock 绑定到本地网卡地址上
 bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in));
 // dwValue为输入输出参数,为1时执行,0时取消
 DWORD dwValue = 1;
 // 设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL
 // 的定义为: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
 ioctlsocket(sock, SIO_RCVALL, &dwValue);
 char RecvBuf[65535]={'0'};
 while (true)
 {
  // 接收原始数据包信息
  int ret = recv(sock, RecvBuf, BUFFER_SIZE, 0);
  if (ret > 0)
  {
   // 对数据包进行分析,并输出分析结果
   IP ip;
   TCP tcp;
   ip = *(IP*)RecvBuf;
   tcp = *(TCP*)(RecvBuf + ip.HdrLen);
   CString a;
   a.Format("协议:%s",GetProtocolTxt(ip.Protocol));
   AfxMessageBox(a);
   m_list.InsertString(-1,a);
   a.Format("IP源地址:%s",inet_ntoa(*(in_addr*)&ip.SrcAddr));
   AfxMessageBox(a);
   m_list.InsertString(-1,a);
   a.Format("IP目标地址:%s",inet_ntoa(*(in_addr*)&ip.DstAddr));
   AfxMessageBox(a);
   m_list.InsertString(-1,a);
   a.Format("源端口号:%d",tcp.SrcPort);
   AfxMessageBox(a);
   m_list.InsertString(-1,a);
   a.Format("目标端口号:%d",tcp.DstPort);
   AfxMessageBox(a);
   m_list.InsertString(-1,a);
   a.Format("数据包长度:%d",ntohs(ip.TotalLen));
    AfxMessageBox(a);
   m_list.InsertString(-1,a);   
  }
 }

}

在project->setting->link->ojbect/library modules:添加:Ws2_32.lib

很好用的一款中文网络分析软件 一些朋友问这款软件的用途,这里我简单说明一下: sniffer是一款网络监视和嗅探软件,他可以实时监视和分析你的网络上流经的各种数据,通过抓包,你可以看到网络上的数据流(二进制),并由此分析出数据来源,数据目的,对应的传输层端口,上层服务,等等.使用这款软件要求使用者对网络尤其是osi模型比较熟悉. ########################### Sniffer 的网络分析器可以运行于桌面、便携式和笔记本PC,使用了400多种协议解释和强大的专家分析功能,可以对网络传输进行分析,找出故障和响应缓慢的原因。它甚至可以对多拓扑、多协议网络进行分析---所有这些功能都可以自动地实时实现。 Sniffers(嗅探器)几乎和internet有一样久的历史了.他们是最早的一个允许系统管理员分析网络和查明哪里有错误发生的工具.不幸的是,crackers也会运行Sniffers以暗中监视你的网络状况和窃走不同种类的数据.这篇文章讲讨论什嘛是Sniffers,一些比较普遍的Sniffers和如何保护自己不受损失.也讨论一种叫antisniff(防监听)的工具, 它可以自动运行并发现运行在你网络中的Sniffers. 那么什么是Sniffer 在单选性网络中, 以太网结构广播至网路上所有的机器, 但是只有预定接受信息包的那台计算机才会响应. 不过网路上其他的计算机同样会"看到“这个信息包,但是如果他们不是预定的接受者,他们会排除这个信息包. 当一台计算机上运行着sniffer的时候并且网络处于监听所有信息交通的状态, 那么这台计算机就有能力浏览所有的在网络上通过的信息包. 如果你是个internet历史方面的白痴并且在想sniffer这个词从何而来.sniffer是最初是网络的产物.然后成为市场销售的领先者,人们开始称所有的网络分析器为"Sniffers”.我猜测这些人是和管棉签叫q-tip的人一样的. Sniffer便携式分析软件包 实时网络分析 如果要迅速检测和解决网络故障和性能问题,我们的便携式Sniffer将是全球网络工程师的第一选择。它的专家分析功能可以找出网络、数据库和应用程序故障的根本原因。 Sniffer 的网络分析器可以运行于桌面、便携式和笔记本PC,使用了400多种协议解释和强大的专家分析功能,可以对网络传输进行分析,找出故障和响应缓慢的原因。它甚至可以对多拓扑、多协议网络进行分析---所有这些功能都可以自动地实时实现。 部门网采用Sniffer Basic,可以使用Sniffer的监控和解释分析功能。低成本的实时监控和解释功能使得Sniffer Basic成为MIS人员的理想选择,他们可以对小型企业、远程旃液筒棵磐兄С帧M保琒niffer Basic为一线的IS 人员提供了一个可以进行常规故障解决的强大工具。 Sniffer Pro LAN和Sniffer Pro WAN 它们适用于有完整的专家分析和Sniffer先进的协议解释功能要求的网络。Sniffer Pro 对LAN和WAN 网段上的网络传输的所有层进行监测,揭示性能问题,分析反常情况,并推荐解决方案---所有这些功能都可以自动地实时实现。 Sniffer Pro High-Speed 它是用于优化最新的ATM及千兆位以太网性能和其可靠性的工具,Sniffer 独一无二的SmartCapture功能提供了对LAN仿真数据流和IP交换环境的监测。 支持ATM 它在企业网络中,针对每个ATM OC-3和OC-12高速链路,为您提供了一个单独的解决方案。 支持Gigabit它是以全双工速度捕获,解决千兆位协同性问题的唯一的分析器。其强大的处理功能可以提供对千兆位以太网的非对称监测。 Sniffer 分布式分析软件包 集成的专家分析和RMON监控软件包 分布式Sniffer 解决方案对应用程序传输和网络设备状态进行全天候分析,可以使应用程序保持最高的运行效率。其中包括对部门网、校园网和主干网的集中监控、设备级别报告和故障解决。 分布式Sniffer系统 从一个单独的管理控制台启动自动RMON-适应网段监控和故障识别。Sniffer专家分析软件可以使您以最快的速度解决故障---即使有复杂的网络拓扑、协议和应用程序。   企业故障和网络性能管理解决方案--Distributed Sniffer System/RMON 可以对整个网络中的主要网段(LAN、WAN、ATM和千兆位以太网)提供网络监控、协议解释和专家分析功能。基于标准的监控和专家分析的强有力的结合使之成为多拓扑结构和多协议网络的最优管理工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值