抓取以太帧报文程序分析

抓取以太帧程序分析

程序框架

  • 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到传输层报头之前有点移动两位不懂,这两位跟大小端有关。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值