问题嗅探 PCAP

Issue sniffing PCAP

我不明白为什么我的以下代码不能正常工作。 当我嗅探以太网时,我收到的字节移动了 2 个字节

我发送使用sudo sendip -p ipv4 -p udp 127.0.0.1 -d r8发送数据包到我的电脑

使用以下代码:

#include <pcap/pcap.h>

#define SIZE_ETHERNET 14
#define ETHER_ADDR_LEN  6
struct sniff_ethernet {
        u_char  ether_dhost[ETHER_ADDR_LEN];
        u_char  ether_shost[ETHER_ADDR_LEN];
        u_short ether_type;
};


void packet_call_back(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes) { 
    struct sniff_ethernet *ethernet = (struct sniff_ethernet*)(bytes);
    printf("test = %#x\n", ethernet->ether_type); // print is 0x0
}

int     main(void) {
    char    errbuf[PCAP_ERRBUF_SIZE];

    pcap_t  *handle = pcap_create("any", errbuf);
    pcap_set_timeout(handle, -1);
    pcap_loop(handle, 0, packet_call_back, NULL);
    pcap_close(handle);
}

我收到的ether_type在这里是不正确的0x0000而不是0x0800

但如果不是:struct sniff_ethernet *ethernet = (struct sniff_ethernet*)(bytes); 我放 struct sniff_ethernet *ethernet = (struct sniff_ethernet*)(bytes + 2); 这里一切正常,我可以轻松分析我的数据包。

我用gcc test.c -l pcap编译 我在一个 Ubuntu 虚拟机上工作,它有 parallels

感谢阅读

When I sniff ethernet the bytes that I receive are shifted by 2 bytes

您不是在嗅探以太网,而是在嗅探“任何”设备。这将捕获所有接口,无论它们是否是以太网接口;即使它们都是以太网接口,也没有什么区别。

为了使这项工作正常进行,在“任何”设备上使用 link-layer header 类型 other 而不是以太网。在 Linux 上,这是一个特殊的 header; here's what that header looks like.

所有 使用 libpcap 捕获网络流量的程序读取捕获文件必须,打开抓包设备(pcap_activate()pcap_open_live()pcap_open())或抓包文件(pcap_open_offline())后,调用pcap_datalink()确定link-layer header 从设备或文件中输入。

那个函数returns一个可以在the link-layer header types list中找到的值;它将是名称以 DLT_ 开头的值之一。 不要检查那里给出的数值;检查 DLT_ 值。