libpcap抓包程序调用pcap_next触发段错误问题求助
段错误排查结果
核心触发原因
你声明的struct pcap_pkthdr *header是未初始化的野指针,没有指向合法的内存空间。pcap_next函数要求第二个参数必须指向一块调用者提前分配好的、足够容纳struct pcap_pkthdr结构体的内存,用于回写捕获数据包的元数据。你直接传入野指针后,后续访问header->len时会访问非法内存地址,直接触发段错误。
存在的其他潜在错误
pcap_open_live的返回值为pcap_t*类型,打开设备失败时返回NULL,你现有代码中if(pcap_handle < 0)的判断逻辑完全错误,指针与整数比较属于未定义行为,可能引发额外异常。
修复方案
代码改动点:
#include <pcap.h> #include <stdlib.h> #include <stdio.h> #include "dump.h" void pcap_fatal(const char *failed_in, const char *errbuf){ printf("Fata Error in %s: %s\n", failed_in, errbuf); exit(1); } int main(){ // 改为直接定义结构体变量,在栈上分配内存 struct pcap_pkthdr header; const u_char *packet; char errbuf[PCAP_ERRBUF_SIZE]; char *device; pcap_t *pcap_handle; int i; /*look for a device to capture packets*/ device = pcap_lookupdev(errbuf); if(device == NULL) pcap_fatal("pcap_lookupdev", errbuf); printf("Sniffing on device %s\n", device); /*opens the packet capturing device*/ pcap_handle = pcap_open_live(device, 4096, 1, 0, errbuf); // 修正返回值判断逻辑,判断是否为NULL if(pcap_handle == NULL){ printf("ERROR: while opening pcap device: %s\n", errbuf); exit(1); } for(i=0;i<3;i++){ printf("\n===packet %d===\n", i+1); // 传入结构体的地址 packet = pcap_next(pcap_handle, &header); // 增加返回值判断,避免空指针访问 if (packet == NULL) { printf("Capture packet %d failed\n", i+1); continue; } printf("Got a %d byte packet\n", header.len); dump(packet, header.len); } pcap_close(pcap_handle); return 0; }
额外注意事项
- 抓包程序需要以root权限运行,否则
pcap_open_live会返回打开失败 - 增加
pcap_next返回值判断,避免抓包超时或失败时返回的空指针传入dump函数引发其他崩溃
内容的提问来源于stack exchange,提问作者user14622805
相关产品推荐
相关产品推荐

