2012-11-28 3 views
4

저는 패킷 스니퍼로 작업하고 있습니다. 큰 문제는 내 코드가 Backtrack 5 R3에서만 완벽하게 작동하지만 다른 배포판에서는 작동하지 않는다는 것입니다. 실제로 우분투 12.10과 ArchLinux에서 스니퍼가 첫 번째 패킷을 받으면 세그멘테이션 오류가 발생합니다 ("분할 오류 코어 덤프"가 발생 함). 처음에는 라이브러리 또는 컴파일러에 결함이 있다고 생각했지만 일부 테스트 후에는 제외시킬 수 있다고 생각합니다. 이 상황이다내 프로그램이 다른 Linux 배포판에서 작동하지 않는 이유는 무엇입니까?

  • 인 뒤로 5 R3은 GCC libpcap의 4.4.3 및 1.0.0를 사용
  • 우분투 12.10
우분투 같은 GCC 4.7.2 및 1.3.0의 libpcap
  • 아치 리눅스를 사용

    그래서 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

    세그먼테이션 오류를 디버그 했습니까? GDB는 당신의 친구입니다. – Mark

    +9

    * 코드를 컴파일하는 동안 약간의 경고가 있지만 실제로 중요한 것은 없습니다 * - 당신은 확실합니까? –

    +1

    @ 마크는 세그 폴트가 발생한 곳을 확인하기 위해 gdb를 수행했다. –

    답변

    0

    내가 당신의 프로그램이 ip_header-> 때문에 포인트 source_addr_ip 액세스를 허용하지 않는 메모리에 충돌 의심 :

    다음은 문제가 발생할 코드입니다. 이 경우인지 확인하려면 GDB을 사용할 수 있어야합니다.

    관련 문제