文档介绍:数据包的捕获与分析
【通用模板】【教育说课】【述职报告】【工作汇报】
获取本地接口的更好方法
SOCKADDR_IN input;
char remoteip[]="";//可以是任意地址
short reion_HLen;
unsigned char TOS;
unsigned short Length;
unsigned short Ident;
unsigned short Flags_Offset;
unsigned char TTL;
unsigned char Protocol;
unsigned short Checksum;
unsigned int SourceAddr;
unsigned int DestinationAddr;
};
假设已获取一个ip头部的指针ip,如何获取版本信息呢?
ip->Version_HLen >> 4
如何获取头部长度呢?
(ip->Version_HLen &0x0f) *4
如何更好的定义版本和头部长度字段?
19
IP协议分析
获取一个ip包Packet
强制类型转换
struct IPHeader *ip = (struct IPHeader*)Packet;
现在就可根据数据结构IPHeader和ip头的标准,来获取ip头部各个字段的值
参见p233-p234的相关代码,应该写成子函数的形式。
20
如何判断传输层的协议
#define TCP_PROTOCAL 6
#define UDP_PROTOCAL 17
unsigned char Prot=ip->Protocol;
21
TCP包首部数据格式
源端口号
( 16位)
目的端口号
( 16位)
序号(32位)
确认序号(32位)
首部长度(4位)
保留
(6位)
URG
ACK
PSH
RST
SYN
F I N
窗口大小
(16位)
校验和(16位)
紧急指针(16位)
选项(任选,若有)
填充
紧急数据
数据
22
TCP头
struct TcpHeader
{
unsigned short SrcPort;
unsigned short DstPort;
unsigned int SequenceNum;
unsigned int Acknowledgment;
unsigned char HdrLen;
unsigned char Flags;
unsigned short AdvertisedWindow;
unsigned short Checksum;
unsigned short UrgPtr;
};
假设已获取一个tcp头部的指针tcp,如何获取源端口?
ntohs(tcp->SrcPort)
如何判断是不是SYN包?
(tcp->Flags &0x02) > 0 ? 1 : 0
23
TCP协议分析
已有一个IP头指针ip
强制类型转换
struct TcpHeader *tcp = (struct TcpHeader*)(ip + 20);
struct TcpHeader *tcp = (struct TcpHeader*)((char *)ip + IpHeaderLength);
现在就可根据数据结构TcpHeader和tcp头的标准,来获取tcp头部各个字段的值
参见p234-p235的相关代码,应该写成子函数的形式。
24
UDP报文格式
端口号:表示发送进程和接收进程
UDP长度:包括UDP头和UDP数据
UDP报文校验和:可选,为0表示不做校验
25
UDP头
struct UdpHeader
{