Linux网络抓包


一、以太网帧格式

以太网帧格式

以太网帧以7字节前导码和1字节帧开始符开头(物理层),紧跟源地址和目的地址(MAC层)。
IP数据包在DATA字段中,数据段最小为46字节。


二、IP报文格式

IP数据报文
IP包的源IP地址和目的IP地址从格式中看出分别从第12字节、第16字节开始(序号从0字节数起)。


三、代码实现

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <linux/if_ether.h>

typedef unsigned char uchar;

#define BUF_SIZE 2048
#define MIN_ETH_PAYLOAD 46
#define MAC_ADDR_OFFSET (6+6+2)

int main()
{
    int len = 0;
    uchar buff[BUF_SIZE] = {0};

    //AF_PACKET     /* Packet family.  */
    //SOCK_RAW      /* Raw protocol interface.  */
    //ETH_P_ALL     /* Every packet (be careful!!!) */
    int sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
    if(sock < 0)
    {
        printf("create socket failed!");
        return -1;
    }

    while (true)
    {
        len = recvfrom(sock, buff, BUF_SIZE, 0, NULL, NULL);
        if(len < MIN_ETH_PAYLOAD)
        {
            printf("catch invalid data!");
            return -1;
        }

        //打印MAC信息
        printf("Source MAC %X:%X:%X:%X:%X:%X",
               (uchar)buff[6], (uchar)buff[7], (uchar)buff[8], 
               (uchar)buff[9], (uchar)buff[10], (uchar)buff[11]);
        printf("  ---> Dest MAC %X:%X:%X:%X:%X:%X\n",
               (uchar)buff[0], (uchar)buff[1], (uchar)buff[2], 
               (uchar)buff[3], (uchar)buff[4], (uchar)buff[5]);

        //打印IP信息
        printf("Source IP  %d.%d.%d.%d",
               (uchar)buff[MAC_ADDR_OFFSET + 12], (uchar)buff[MAC_ADDR_OFFSET + 13],
               (uchar)buff[MAC_ADDR_OFFSET + 14], (uchar)buff[MAC_ADDR_OFFSET + 15]);
        printf("  ---> Dest IP  %d.%d.%d.%d\n",
               (uchar)buff[MAC_ADDR_OFFSET + 16], (uchar)buff[MAC_ADDR_OFFSET + 17],
               (uchar)buff[MAC_ADDR_OFFSET + 18], (uchar)buff[MAC_ADDR_OFFSET + 19]);
    }

    return 0;
}

四、总结

抓包的方法简洁有效,相对的我们需要了解以太网帧和IP包的格式,才能知道数据包字段值的意义。
值得注意的是,不同版本的协议格式略有不同。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值