抓取以太帧程序分析
程序框架
- rawSocket()//创建原始套接字;
- int setPromisc(char *interface,int *sock)//设置interface的混乱模式
- 分析数据
程序细节
创建socket
- 从数据链路层
sock = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
- IP层抓取
sock = socket(PF_INET,SOCK_RAW,IPPROTO_TCP);
设置网卡的工作模式
1. 配置 ifr结构体,即Interface request structure。其中包括了 ifr.ifr_name 及ifr.ifr_flag;
2. 使用ioctl控制网卡
extern int ioctl (int __fd, unsigned long int __request, ...);
数据分析
这些都有相对应的结构体,只要移动相对应的指针,这些结构体分别定义在”net/ethernet.h”,”netinet/ip.h”,
“netinet/tcp.h”和”netinet/udp.h”中。
- 接收数据
extern ssize_t recvfrom (int __fd, void *__restrict __buf, size_t __n,
int __flags,
__SOCKADDR_ARG __addr,
socklen_t *__restrict __addr_len);
通过socket FD读取N个字节到BUF中 .这个函数在
ether=(struct ether_header*)data;
- ip报文
data = data +
sizeof(struct ether_header);//指针右移
ip = (struct iphdr*)(data); - tcp/udp
tcp = (struct tcphdr *)data;
udp = (struct udphdr *)data;
ps:
data = data + (ip->ihl<<2);在移动data到传输层报头之前有点移动两位不懂,这两位跟大小端有关。