ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • pcap
    Programming/C 2018.09.09 20:53

    1. #apt-get install libpcap-dev로 pcap라이브러리 설치


    2. pro파일에 LIBS += -lpcap추가


    3. #include <pcap.h> 추가


    Example 1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    /* tcp 80 패킷만 출력 */
    #include <stdio.h>
    #include <pcap.h>
    #include <arpa/inet.h>  /* in_addr 구조체 */
    #include <net/ethernet.h>
    #include <netinet/ip.h>
    #include <netinet/tcp.h>
     
    int cnt=0;
     
    void printMac(u_int8_t eth_mac[]) {
        for(int i=0; i<=ETHER_ADDR_LEN-2; i++){
            printf("%02x:", eth_mac[i]);
        }
        printf("%02x\n", eth_mac[ETHER_ADDR_LEN-1]);
    }
     
    void callback(u_char *args, const pcap_pkthdr *header, const u_char *packet)
    {
        struct ether_header *eth;
        struct ip *iph;
        struct tcphdr *tcph;
     
        printf("================= num.%d =================\n"++cnt);
     
        eth = (struct ether_header *)packet;
        printf("<ethernet>\n");
        printf("Dst MAC -> ");
        printMac(eth->ether_dhost);
        printf("Src MAC -> ");
        printMac(eth->ether_shost);
        printf("\n");
     
        iph = (struct ip *)(packet += sizeof(struct ether_header));
        printf("<IP>\n");
        printf("Src IP Address : %s\n", inet_ntoa(iph->ip_src));
        printf("Dst IP Address : %s\n", inet_ntoa(iph->ip_dst));
        printf("\n");
     
        tcph = (struct tcphdr *)(packet + iph->ip_hl * 4);   /* 5 * 4 = 20byte */
       printf("<TCP>\n");
        printf("Src Port : %d\n" , ntohs(tcph->source));
        printf("Dst Port : %d\n" , ntohs(tcph->dest));
        printf("\n");
    }
     
    int main(int argc, char **argv)
    {
        char *dev;
        char *errbuf;
        char rule[] = "port 80";
        bpf_u_int32 net;
        bpf_u_int32 mask;
        struct in_addr net_addr, mask_addr;
        struct bpf_program fp;   /* 패킷에 대한 필터를 만들어줌. 컴파일된 필터 */
        pcap_t *handle;
     
        if(!(dev = pcap_lookupdev(errbuf))) {   /* 네떡 인터페이스 */
            printf("%s", errbuf); return -1;
        }
     
        if(pcap_lookupnet(dev, &net, &mask , errbuf) == -1) {   /* 네떡 정보 출력 */
            printf("%s", errbuf); return -1;
        }
     
        net_addr.s_addr = net;
        mask_addr.s_addr = mask;
     
        printf("Device : %s\n", dev);
        printf("Net Address : %s\n", inet_ntoa(net_addr));
        printf("Netmask : %s\n", inet_ntoa(mask_addr));
     
        if(!(handle = pcap_open_live(dev, 6553510, errbuf))) {  /* promisc mode로 인터페이스 핸들러 반환 */
            printf("%s", errbuf); return -1;
        }
     
        if(pcap_compile(handle, &fp, rule, 1, net) == -1){    /* 필터 컴파일 */
            printf("pcap_complie error"); return -1;
        }
     
        if(pcap_setfilter(handle, &fp) == -1) { /* 필터 적용 */
            printf("pcap_setfilter error"); return -1;
        }
     
        pcap_loop(handle, 0, callback, NULL); /* 계속(0) 패킷 캡처 */
     
        pcap_close(handle);
     
        return 0;
    }
     
    cs


    Example 2

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    #include <stdio.h>
    #include <string.h>
    #include <pcap.h>
    #include <arpa/inet.h>  /* in_addr 구조체 */
    #include <net/ethernet.h>
    #include <netinet/ip.h>
    #include <netinet/tcp.h>
     
    void printMac(u_int8_t eth_mac[]) {
        for(int i=0; i<=ETHER_ADDR_LEN-2; i++){
            printf("%02x:", eth_mac[i]);
        }
        printf("%02x\n", eth_mac[ETHER_ADDR_LEN-1]);
    }
     
    int main(int argc, char **argv)
    {
        int cnt=0;
        int res;
        char *dev;
        char *errbuf;
        char *ptr;
        const unsigned char *data;
        bpf_u_int32 net;
        bpf_u_int32 mask;
        struct in_addr net_addr, mask_addr;
        struct ether_header *eth;
        struct ip *iph;
        struct tcphdr *tcph;
        struct pcap_pkthdr *header;
        pcap_t *handle;
     
        if(!(dev = pcap_lookupdev(errbuf))) {   /* 네떡 인터페이스 */
            printf("%s", errbuf); return -1;
        }
     
        if(pcap_lookupnet(dev, &net, &mask, errbuf) == -1) {   /* 네떡 정보 출력 */
            printf("%s", errbuf); return -1;
        }
     
        net_addr.s_addr = net;
        mask_addr.s_addr = mask;
     
        if(!(handle = pcap_open_live(dev, 6553510, errbuf))) {  /* promisc mode로 인터페이스 핸들러 반환 */
            printf("%s", errbuf); return -1;
        }
     
        while((res=pcap_next_ex(handle, &header,&data))>=0) {    /* pcap_loop 대신 */
            if (res==0continue;
     
            eth = (struct ether_header *)data;
            iph = (struct ip *)(data += sizeof(struct ether_header));
            tcph = (struct tcphdr *)(data += iph->ip_hl * 4);
     
            if(ntohs(tcph->dest)==80)
            {
            data += tcph->th_off * 4;
            if((ptr = strstr((char *)data, "Host")) != NULL) {
                int cnt=0;
                while(!(ptr[cnt] == 0x0d)){
                    printf("%c", ptr[cnt++]);
                }
                printf("\n");
            }
            }
        }
        pcap_close(handle);
     
        return 0;
    }
     
    cs


    'Programming > C' 카테고리의 다른 글

    ARP Send  (0) 2018.10.15
    pcap  (0) 2018.09.09
    Password crack  (0) 2018.01.13
    c 라이브러리 함수 표  (0) 2017.12.11
    scanf  (0) 2017.03.21
    gets  (0) 2016.12.27

    댓글 0

~ ^ . ^ ~