首页
社区
课程
招聘
[原创]借windump初窥网络底层
发表于: 2012-3-9 15:26 14065

[原创]借windump初窥网络底层

2012-3-9 15:26
14065
// MAC地址长度
#define MAC_ADDRESS_LEN 6

// 常用的以太网帧类型
#define ETHERNET_FRAME_IP		0x0800				// IP帧 
#define ETHERNET_FRAME_ARP		0x0806				// ARP帧 
#define ETHERNET_FRAME_RARP		0x8035				// RARP帧 
#define ETHERNET_FRAME_IPv6		0x86DD				// IP6帧 

typedef struct _EthernetHeader		// 以太头
{
	UCHAR		DstMacAddr[MAC_ADDRESS_LEN];		// 目标MAC
	UCHAR		SrcMacAddr[MAC_ADDRESS_LEN];		// 源MAC
	USHORT		FrmType;							// 类型
}EthernetHeader, *PEthernetHeader;
// 定义ARP操作类型
#define ARP_QUERY				0x0001				// ARP请求 
#define ARP_REPLY				0x0002				// ARP应答
#define RARP_QUERY				0x0003				// RARP请求
#define RARP_REPLY				0x0004				// RARP应答

// 定义ARP硬件类型
#define ARP_ETHER				0x0001				// 以太网格式
#define ARP_IEEE802				0x0006				// 令牌环网
#define ARP_FRELAY				0x000f				// 帧中继硬件格式

typedef struct _ArpHeader			// ARP头<RARP>
{
	USHORT		HrdType;							// 硬件类型
	USHORT		ProType;							// 协议类型
	UCHAR		HrdAddrLen;							// 硬件地址长度
	UCHAR		ProAddrLen;							// 协议地址长度
	USHORT		Opr;								// 操作字段 <是ARP请求或者应答 异或RARP请求或者应答>
	UCHAR		SrcMacAddr[MAC_ADDRESS_LEN];		// 发送端的MAC地址
	ULONG		SrcIp;								// 发送端的IP地址
	UCHAR		DstMacAddr[MAC_ADDRESS_LEN];		// 目的MAC地址
	ULONG		DstIp;								// 目的IP地址
}ArpHeader, *PArpHeader;

typedef struct _ARPPACKET			// ARP封包
{
	EthernetHeader	Ehhdr;
	ArpHeader		Arphdr;
}ARPPACKET, *PARPPACKET;
 0                            15                              31
-----------------------------------------------------------------
|  ver  |  HL   |     TOS       |        Total len              |
-----------------------------------------------------------------
|          Packet id            |0|D|M|   Fragment Offset       |
-----------------------------------------------------------------
|     TTL       |    protocol   |          checksum             |
-----------------------------------------------------------------
|                       source ip address                       |
-----------------------------------------------------------------
|                       dest ip address                         |
-----------------------------------------------------------------
|                           Optional                            |
-----------------------------------------------------------------
|                              Data                             |
-----------------------------------------------------------------

// 定义IP数据报中的协议类型
#define ICMP_PROTOCOL			0x0001				// ICMP 报文
#define IGMP_PROTOCOL			0x0002				// IGMP 报文
#define TCP_PROTOCOL			0x0006				// TCP 报文
#define UDP_PROTOCOL			0x0011				// UDP 报文 17

// IP标志
#define IP_DF_MASK				0x4000				// 如果置位,表示不能被分割
#define IP_MF_MASK				0x2000				// 为1表示还有更多的数据报分片 为0表示已经是最后一个分片

typedef struct _IPHeader			// IP头 20 BYTES
{
	UCHAR		Ver:4;								// 版本信息
	UCHAR		HdrLen:4;							// IP数据报首部的双字个数,一般为5即20字节长
	UCHAR		TOS;								// 服务类型<一般忽略>
	USHORT		TotalLen;							// IP数据报总长度<字节单位>,包括了IP头,这个长度减去HdrLen就是数据实际长度
	USHORT		PktID;								// 封包ID 每发送一个包这里加一
	USHORT		FlagSeg;							// 标致字段和片偏移 3位标志 13位偏移
	UCHAR		TTL;								// 存活周期
	UCHAR		Protocol;							// 协议类型
	USHORT		Checksum;							// 效验和
	ULONG		SrcIp;								// 源IP
	ULONG		DstIp;								// 目的IP
}IPHeader, *PIPHeader;

typedef struct _IPPACKET			// IP封包
{
	EthernetHeader	Ehhdr;
	IPHeader		Iphdr;
}IPPACKET, *PIPPACKET;
 0                            15                              31
-----------------------------------------------------------------
|          source port          |       destination port        |
-----------------------------------------------------------------
|                        sequence number                        |
-----------------------------------------------------------------
|                     acknowledgment number                     |
-----------------------------------------------------------------
|  HL   | rsvd  |C|E|U|A|P|R|S|F|        window size            |
-----------------------------------------------------------------
|         TCP checksum          |       urgent pointer          |
-----------------------------------------------------------------
|                           Optional                            |
-----------------------------------------------------------------
|                              Data                             |
-----------------------------------------------------------------

// TCP头标志位掩码 OffFlag
#define TCP_HDR_LEN				0xF000				// TCP头长度<双字的个数>转化为字节数需要x4		
#define TCP_URG_FLAG			0x0020				// URG标志
#define TCP_ACK_FLAG			0x0010				// ACK标志 应答1或请求0
#define TCP_PSH_FLAG			0x0008				// psh标志 以最快速度传输数据
#define TCP_RST_FLAG			0x0004				// RST标志 先断开连接,再重建连接
#define TCP_SYN_FLAG			0x0002				// SYN标志 用来建立连接
#define TCP_FIN_FLAG			0x0001				// FIN标志 发送方完成数据发送

typedef struct _TcpHeader			// TCP头 20 BYTES
{
	USHORT		SrcPort;							// 源端口
	USHORT		DstPort;							// 目的端口
	ULONG		SeqNum;								// 序号
	ULONG		AckNum;								// 确认号
	USHORT		OffFlag;							// 首部长度<首部双字的个数>+保留位+标志位
	USHORT		WndSize;							// 窗口大小<实现流量控制>
	USHORT		Checksum;							// 效验和
	USHORT		UrgPointer;							// 紧急指针
}TcpHeader, *PTcpHeader;

// OffFlag : 4位首部长度 + 6位保留位 + URG+ACK+PSH+RST+SYN+FIN

typedef struct _TCPPACKET			// TCP封包 <当ip中没有附加数据时>
{
	EthernetHeader	Ehhdr;
	IPHeader		Iphdr;
	TcpHeader		Tcphdr;
}TCPPACKET, *PTCPPACKET;
 0                            15                              31
-----------------------------------------------------------------
|          source port          |       destination port        |
-----------------------------------------------------------------
|          udp len              |       udp checksum            |
-----------------------------------------------------------------
|                             data                              |
-----------------------------------------------------------------
typedef struct _UdpHeader
{
	USHORT		SrcPort;							// 源端口
	USHORT		DstPort;							// 目的端口
	USHORT		UdpLen;								// 长度 头+数据字节长 最小8字节
	USHORT		Checksum;							// 效验和
}UdpHeader, *PUdpHeader;

typedef struct _UDPPACKET			// UDP封包 <当ip中没有附加数据时>
{
	EthernetHeader	Ehhdr;
	IPHeader		Iphdr;
	UdpHeader		Udphdr;
}UDPPACKET, *PUDPPACKET;
#pragma pack(push)
#pragma pack(1)
..
..
#pragma pack(pop)
0x000E: 0001 表示硬件类型是以太网类型
0x0010: 0800 表示协议类型是IP协议
0x0012: 0604 表示硬件地址<MAC>长为6字节,协议地址<IP>长为4字节
0x0014: 0001 表示操作类型为ARP请求 ARP_QUERY
2 packets captured				// 捕获的包的数量
49 packets received by filter	// 被过滤的包的数量
0 packets dropped by kernel		// 被内核丢弃的包的数量

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 6
支持
分享
最新回复 (3)
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
2
其实我一般用wireshark,不过命令行也蛮cool的说
2012-3-11 10:14
0
雪    币: 238
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
确实 现在基本都用Wireshark了......
毕竟更加方便强大
2012-3-14 12:05
0
雪    币: 22
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
不会呢还
2012-3-15 11:39
0
游客
登录 | 注册 方可回帖
返回
//