4

私はパケットスニファーに取り組んでいます。大きな問題は、私のコードが 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));


}
4

1 に答える 1

0

ip_header->source_addr_ip がアクセスを許可されていないメモリを指しているため、プログラムがクラッシュしていると思われます。これに該当するかどうかを判断するには、 GDBを使用できるはずです。

于 2013-01-28T00:45:36.790 に答える