我在同一个局域网连接了三台笔记本电脑。
圈1:192.168.1.2
圈2:192.168.1.3
圈3:192.168.1.4
我把lap-1作为服务器,监听9333端口。lap-2作为客户。使用netcat,我将数据从lap2发送到lap1。我可以在lap1中使用pcap捕获数据包。我已经使用sudo ifconfig eth0 promisc打开了混乱模式。在pcap_live_open方法中,我还设置了混杂模式标志。
然后,我关闭了混乱模式,也在pcap_live_open功能。但我还是能抓包。
我在谷歌上搜索了混乱模式,我可以推断,如果设备以混乱模式打开一个接口,它将能够捕获连接到该网络的所有数据包。
所以考虑到这一点,我把lap-3作为服务器,lap-2作为客户端。我遵循了和上面一样的程序。我在lap-1中运行pcap可执行文件,希望能够捕获lap-3和lap-2之间传输的数据包,但是在lap-1中运行的pcap不能在混杂模式打开的情况下这样做。所有3圈都连接到同一个网络。
有谁能教我用简单的场景来使用滥交模式吗?
这是我的PCAP代码:
29988是9333的反向(交换),我正在寻找。

#include <pcap/pcap.h>
#include <stdint.h>

const u_char *packet;

int main()
{
   char *dev = "eth0";
   pcap_t *handle;
   int j=0;
   char errbuf[PCAP_ERRBUF_SIZE];
   struct bpf_program fp;
   bpf_u_int32 mask;
   bpf_u_int32 net;
   struct pcap_pkthdr header;
   uint8_t *ip_header_len;
   uint16_t ip_header_len_val;
   uint16_t *port;

   /* Find the properties for the device */
   while (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) {
      printf("Couldn't get netmask for device %s: %s\n", dev, errbuf);
      net = 0;
      mask = 0;
   }
   printf("lookedup pcap device: %s\n", dev);

   /* Open the session in promiscuous mode */
   handle = pcap_open_live(dev, BUFSIZ,1,0, errbuf);
   if (handle == NULL) {
      printf("Couldn't open device %s: %s\n", dev, errbuf);
   }
   /* Compile and apply the filter */
   if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) {
      printf("Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle));
      pcap_close(handle);
   }
   /*     if (pcap_setfilter(handle, &fp) == -1) {

        printf("Couldn't install filter %s: %s", filter_exp, pcap_geterr(handle));
        return(-1);
    }
    */

   /* Grab a packet */
   while ((packet = pcap_next(handle, &header)) != NULL)
   {
      uint16_t *data_size;
      uint16_t size,total_len_val,tcp_header_len_val;
      char tdata[128];
      uint8_t *data,*tcp_header_len;
      uint16_t *total_len;

      //ip_proto = (uint8_t *)&packet[9];
      ip_header_len = (uint8_t *)&packet[14];

      ip_header_len_val = (*ip_header_len) & 0x0F;
      ip_header_len_val = ip_header_len_val*4;
      // printf("IP header len val:%d\n",ip_header_len_val);

      port = (uint16_t *)&packet[14+ip_header_len_val+2];
      //printf("port:%d\n",*port);

      total_len = (uint16_t *)&packet[14+2];
      total_len_val = ((*total_len) >> 8) & 0x00FF;
      total_len_val = total_len_val + (((*total_len) << 8) & 0xFF00);
      //total_len_val=*total_len;
      // printf("tot len val:%d\n",total_len_val);
      tcp_header_len = (uint8_t *)&packet[14+ip_header_len_val+12];
      tcp_header_len_val = (*tcp_header_len) & 0xF0;
      tcp_header_len_val = tcp_header_len_val>>4;
      tcp_header_len_val = tcp_header_len_val * 4;
      // printf("tcp header len val:%d\n",tcp_header_len_val);
      size = (total_len_val- ip_header_len_val) - tcp_header_len_val;


      data = (uint8_t *)&packet[14+ip_header_len_val+tcp_header_len_val];

      memset(tdata,0,128);
      mempcpy(tdata,data,size);
      tdata[size]='\0';
      if((*port)==29988)
      {
         printf("Data Packet:%s\n",tdata);
      }
   }
}

最佳答案

我希望当你说它们都在同一个网络上时,你的意思是它们连接到同一个以太网交换机。该开关将只向目的地为laptop1的laptop1发送数据。在过去,使用以太网集线器是很常见的,然后所有的流量都流向所有连接的设备,但现在一个交换机非常便宜,集线器不再常见。如果你能找到一个集线器,那么你可以尝试一下,但否则你将只能看到你的设备注定的流量。

关于c - 使用混杂模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23244083/

10-09 06:06