我正在研究数据包嗅探器。最大的问题是我的代码仅在 Backtrack 5 R3 下完美运行,但在其他发行版下不起作用!事实上,在 Ubuntu 12.10 和 ArchLinux 上,当嗅探器收到第一个数据包时,我遇到了分段错误(我得到"分段错误核心转储")。起初,我认为错误出在库或编译器上,但经过一些测试,我想我可以排除它们!情况是这样的:
- 回溯 5 R3 使用 gcc 4.4.3 和 libpcap 1.0.0
- Ubuntu 12.10 使用 Gcc 4.7.2 和 Libpcap 1.3.0
- ArchLinux 与 Ubuntu 相同
所以我试图将 Arch 降级到 gcc 4.4.3 e libpcap 1.0.0,但我得到了同样的错误。我在编译代码时有一些警告,但没有什么真正重要的,但是它在回溯下完美运行!这就是一个大谜团。
以下是导致问题的代码:
void packet_dump(unsigned char *arguments, const struct pcap_pkthdr *pcap_data, const unsigned char *packet) {
int packet_data_len, tcp_header_size=0, total_header_size;
unsigned char *packet_data;
const unsigned char *ip_src_dest;
const struct header_ip *ip_header;
//Calculate the value of variables
ip_src_dest = (packet+LUNGHEZZA_INTESTAZIONE_ETH);
ip_header = (const struct header_ip *)ip_src_dest;
total_header_size = LUNGHEZZA_INTESTAZIONE_ETH+sizeof(struct header_ip)+tcp_header_size;
packet_data = (unsigned char *)packet + total_header_size;
packet_data_len = pcap_data->len - total_header_size;
//THIS CAUSE THE PROBLEM (Solved removing inet_ntoa and converting it manually)
printf("[ %s ] ============> ", inet_ntoa(ip_header->source_addr_ip));
printf("[ %s ] n", inet_ntoa(ip_header->destination_addr_ip));
}
我怀疑你的程序崩溃了,因为ip_header->source_addr_ip指向你不允许访问的内存。您应该能够使用 GDB 来确定是否属于这种情况。