C++ 网络抓包原理解析

所谓抓包,就是获取所有从本机电脑中传输过的网络数据包。

目录

网络的协议

抓包的原理

抓包关键函数


网络的协议

1 以太网头

typedef struct HeadEth {
	unsigned char	h_dest[ETH_ALEN];
	unsigned char	h_source[ETH_ALEN];	
	unsigned short	h_proto;
}HEADETH, * PHEADETH;

以太网头表明了此包的源地址,目的地址与协议类型(IPv4等)

2 IP头

typedef struct HeadIP {
	unsigned char	headerlen : 4;
	unsigned char	version : 4;
	unsigned char	servertype;
	unsigned short	totallen;
	unsigned short	id;
	unsigned short	idoff;
	unsigned char	ttl;
	unsigned char	proto;
	unsigned short	checksum;
	unsigned int	sourceIP;
	unsigned int	destIP;
}HEADIP, *PHEADIP;

IP头记录着包的所有信息(除端口号),其中比较重要的就是sourceIP与destIP。

3 TCP头

typedef struct HeadTCP {
	WORD			SourcePort;
	WORD			DePort;
	DWORD			SequenceNo;
	DWORD			ConfirmNo;
	BYTE			HeadLen;
	BYTE			Flag;
	WORD			WndSize;
	WORD			CheckSum;
	WORD			UrgPtr;
}HEADTCP, * PHEADTCP;

TCP头属于IP头的扩展头,记录着发送端端口与接收端端口,以及头长度,还有校验和。

4 UDP头

typedef struct HeadUDP {
	WORD			SourcePort;
	WORD			DePort;
	WORD			Len;
	WORD			ChkSum;
}HEADUDP, * PHEADUDP;

UDP头基本上与TCP头差不多。

抓包的原理

  1. 确定抓包的IP地址
  2. 绑定与设置套接字接受命令
  3. 接受数据
  4. 分析数据
  5. 输出

抓包关键函数

凡是网络通信,都需要用到Socket,

#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

1 设置套接字接受命令 WSAIoctl函数详解

int iResult = WSAIoctl(SnifferSocket, SIO_RCVALL, &Optval, sizeof(Optval), &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned, NULL, NULL);
if (SOCKET_ERROR == iResult)
{
	cout << "套接字设置失败:" << WSAGetLastError() << endl;
	closesocket(SnifferSocket);
	WSACleanup();
	return 1;
}

2 网络字节顺序转本机字节顺序

ntohs(unsigned short us)
//return type<unsigned short>

3 获取IP头

HeadIP* pIpInfo = (HeadIP*)recvbuf;

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值