问题嗅探 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_
值。
我不明白为什么我的以下代码不能正常工作。 当我嗅探以太网时,我收到的字节移动了 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_
值。