您的位置:首页 > 其它

抓取以太帧报文程序分析

2016-04-03 15:23 309 查看

抓取以太帧程序分析

程序框架

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到传输层报头之前有点移动两位不懂,这两位跟大小端有关。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: