본문으로 바로가기

Packet sniffer develop #pcap_findalldevs

category 카테고리 없음 2018. 4. 15. 13:46

지난 포스팅중 언급했던 디바이스 설정방법 두가지중 pcap_lookupdev 를 이용한 디폴트 설정법만 제대로 해보았다. 이번에는 조금 더 사용자에게 선택의 기회를 주어 pcap_findalldevs 함수를 이용하여 선택할 수 있는 프로그램을 만들어보자






pcap_findalldevs


1
int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf);
cs


네트워크 디바이스의 목록을 알려주는 함수이다. alldevsp라는 구조체 포인터를 통해 목록과 특성을 알려준다. 성공시 0을, 실패시 -1을 반환하고, errbuf변수를 채운다.



Example



소스코드

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
#include<stdio.h>
#include<pcap.h>
#include<arpa/inet.h>
 
int main(){
    pcap_if_t *alldevsp;
    pcap_if_t *d;
 
    char errbuf[PCAP_ERRBUF_SIZE];
    
    bpf_u_int32 netp;
    bpf_u_int32 maskp;
    int ret,i=1;
    struct in_addr addr;
    char *net;
 
    //int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf);
    printf("====== pcap_findalldevs ======\n");
    ret = pcap_findalldevs(&alldevsp,errbuf);
    if(ret == -1){
        printf("pcap_findalldev ERR : %s",errbuf);
        return -1;
    }
    
    for(d=alldevsp; d; d=d->next){
        printf("%d. %s", i++, d->name);
        if(d->description){
            printf("(%s)\n",d->description);
        }else{
            printf("(None)\n");
        }
    }
 
    printf("Select device number > ");
    scanf("%d",&i);
    i--;
 
    for(d=alldevsp;i>0;d=d->next, i--);
 
 
    //int pcap_lookupnet(const char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp, char *errbuf);
    printf("====== pcap_lookupnet ======\n");
    ret = pcap_lookupnet(d->name, &netp, &maskp, errbuf);
    if(ret==-1){
        printf("pcap_lookupnet ERR : %s",errbuf);
        return -1;
    }
    printf("dev   : %s\n",d->name);
    addr.s_addr = netp;
    net = inet_ntoa(addr);
    if(net ==NULL){
        printf("inet_ntoa ERR");
        return -1;
    }
    printf("netp  : %s\n",net);
    addr.s_addr = maskp;
    net = inet_ntoa(addr);
    if(net==NULL){
        printf("inet_ntoa ERR");
        return -1;
    }
    printf("maskp : %s\n",net);
    
    
    return 0;
}
 
cs





실행결과

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@g0pher-virtual-machine:/home/g0pher/sniff_tcpdump# ./sniffer 
====== pcap_findalldevs ======
1. ens33(None)
2. any(Pseudo-device that captures on all interfaces)
3. lo(None)
4. nflog(Linux netfilter log (NFLOG) interface)
5. nfqueue(Linux netfilter queue (NFQUEUE) interface)
6. usbmon1(USB bus number 1)
7. usbmon2(USB bus number 2)
Select device number > 1
====== pcap_lookupnet ======
dev   : ens33
netp  : 192.168.35.0
maskp : 255.255.255.0
cs