私はパケットスニファーに取り組んでいます。大きな問題は、私のコードが Backtrack 5 R3 でのみ完全に動作することですが、他のディストリビューションでは動作しません! 実際、Ubuntu 12.10 と ArchLinux では、スニファーが最初のパケットを取得すると、セグメンテーション エラーが発生します (「セグメンテーション エラー コア ダンプ」が発生します)。最初は、ライブラリまたはコンパイラに問題があると思っていましたが、いくつかのテストの後、それらを除外できると思います! これは状況です:
- Backtrack 5 R3 は gcc 4.4.3 と libpcap 1.0.0 を使用します
- Ubuntu 12.10 は Gcc 4.7.2 と Libpcap 1.3.0 を使用します
- Ubuntu と同じ ArchLinux
そのため、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));
}