2016-09-25 11 views
-1

Я последовал шаги упомянул here написать программу образца CPP, чтобы захватить мой сетевой адаптер трафика и окончательную программу, что я компиляции и запуска успешно, как показано ниже:Почему весь захваченный пакет с libpcap в C++ имеет длину нуля?

1 #include <pcap.h> 
    2 #include <stdio.h> 
    3 #include <chrono> 
    4 #include <thread> 
    5 
    6 int main(int argc, char *argv[]) 
    7 { 
    8  pcap_t *handle;   /* Session handle */ 
    9  char *dev;   /* The device to sniff on */ 
10  char errbuf[PCAP_ERRBUF_SIZE]; /* Error string */ 
11  struct bpf_program fp;  /* The compiled filter */ 
12  char filter_exp[] = "port 23"; /* The filter expression */ 
13  bpf_u_int32 mask;  /* Our netmask */ 
14  bpf_u_int32 net;  /* Our IP */ 
15  struct pcap_pkthdr header; /* The header that pcap gives us */ 
16  const u_char *packet;  /* The actual packet */ 
17 
18  /* Define the device */ 
19  dev = pcap_lookupdev(errbuf); 
20  if (dev == NULL) { 
21   fprintf(stderr, "Couldn't find default device: %s\n", errbuf); 
22   return(2); 
23  } 
24 
25  fprintf(stderr, "%s\n", dev);                      
26 
27  /* Find the properties for the device */ 
28  if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) { 
29   fprintf(stderr, "Couldn't get netmask for device %s: %s\n", dev, errbuf); 
30   net = 0; 
31   mask = 0; 
32  } 
33  /* Open the session in promiscuous mode */ 
34  handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf); 
35  if (handle == NULL) { 
36   fprintf(stderr, "Couldn't open device %s: %s\n", dev, errbuf); 
37   return(2); 
38  } 
39  /* Compile and apply the filter */ 
40  if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) { 
41   fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle)); 
42   return(2); 
43  } 
44  if (pcap_setfilter(handle, &fp) == -1) { 
45   fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle)); 
46   return(2); 
47  } 
48 
49  int x = 100; 
50  for(int i=0; i<30; i++){ 
51   /* Grab a packet */ 
52   packet = pcap_next(handle, &header); 
53   /* Print its length */ 
54   printf("Jacked a packet with length of [%d]\n", header.len); 
55   
56   std::this_thread::sleep_for(std::chrono::milliseconds(x)); 
57  } 
58  /* And close the session */ 
59  pcap_close(handle); 
60 
61  return(0); 
62 } 

Проблема заключается в том, что, в то время как мой сетевой адаптер правильно выбран в программе, я только фиксирую пакеты с len == 0!

[email protected]:~/Desktop/cpp_1$ g++ main.cpp -lpcap -std=gnu++11 
[email protected]:~/Desktop/cpp_1$ sudo ./a.out 
enp5s0 
Jacked a packet with length of [0] 
Jacked a packet with length of [0] 
Jacked a packet with length of [0] 
Jacked a packet with length of [0] 
Jacked a packet with length of [0] 
Jacked a packet with length of [0] 
Jacked a packet with length of [0] 
Jacked a packet with length of [0] 
Jacked a packet with length of [0] 
Jacked a packet with length of [0] 
Jacked a packet with length of [0] 
Jacked a packet with length of [0] 
Jacked a packet with length of [0] 
Jacked a packet with length of [0] 
Jacked a packet with length of [0] 
Jacked a packet with length of [0] 
Jacked a packet with length of [0] 
Jacked a packet with length of [0] 
Jacked a packet with length of [0] 

Моя конфигурация сети:

[email protected]:~/Desktop/cpp_1$ ifconfig 
enp5s0 Link encap:Ethernet HWaddr 4c:cc:6a:0d:30:91 
      inet addr:192.168.1.170 Bcast:192.168.1.255 Mask:255.255.255.0 
      inet6 addr: fe80::fcb0:4105:1c21:4214/64 Scope:Link 
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
      RX packets:7377903 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:5250371 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:1000 
      RX bytes:10572328217 (10.5 GB) TX bytes:363236585 (363.2 MB) 

lo  Link encap:Local Loopback 
      inet addr:127.0.0.1 Mask:255.0.0.0 
      inet6 addr: ::1/128 Scope:Host 
      UP LOOPBACK RUNNING MTU:65536 Metric:1 
      RX packets:7403 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:7403 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:1 
      RX bytes:2404900 (2.4 MB) TX bytes:2404900 (2.4 MB) 

vmnet1 Link encap:Ethernet HWaddr 00:50:56:c0:00:01 
      inet addr:172.16.66.1 Bcast:172.16.66.255 Mask:255.255.255.0 
      inet6 addr: fe80::250:56ff:fec0:1/64 Scope:Link 
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:252 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:1000 
      RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) 

vmnet8 Link encap:Ethernet HWaddr 00:50:56:c0:00:08 
      inet addr:192.168.18.1 Bcast:192.168.18.255 Mask:255.255.255.0 
      inet6 addr: fe80::250:56ff:fec0:8/64 Scope:Link 
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:253 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:1000 
      RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) 

ответ

1

Вы компилируете фильтр с "port 23", который является телнет портом. Вы читаете всего 30 пакетов с паузой в 100 мсек между ними. Это составляет всего 3 секунды. И вы не проверить код возврата pcap_next(), который, скорее всего, возвращает NULL см pcap_next(3)

Возвращаемое значение
...
pcap_next() возвращает указатель на пакетированных данных на успех, и возвращает NULL, если произошла ошибка, или если пакеты не были прочитаны из живого захвата

Так, я думаю, нет никакого движения вообще телнета в этих 3 SECON ds, и если вы проверите packet, то не будет выхода, например.

/* Grab a packet */ 
packet = pcap_next(handle, &header); 
/* Print its length */ 
if (packet != NULL) 
    printf("Jacked a packet with length of [%d]\n", header.len); 
+0

Что делать, если мне не нужен фильтр? – Abraham

+1

Не знаю. Но я думаю, вы получите все пакеты, независимо от того, откуда они взялись или что такое пункт назначения. Просто попробуйте оставить «pcap_compile» и 'pcap_setfilter', и вы увидите. –

 Смежные вопросы

  • Нет связанных вопросов^_^