본문 바로가기
Programming/C

pcap

by 비니화이팅 2020. 2. 24.

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) 2020.03.05
pcap  (0) 2020.02.24
Password crack  (0) 2018.01.13
c 라이브러리 함수 표  (0) 2017.12.11
scanf  (0) 2017.03.21
gets  (0) 2016.12.27

댓글0