缓存从pcap捕获的数据包

时间:2011-11-20 09:20:03

标签: c caching packet pcap

这是对此的后续问题: Rebuilding a packet to inject via pcap

我想要完成的事情:

  1. functionA:使用pcap捕获数据包。修改源/目标地址。重新计算校验和。注入pcap。

  2. functionB:创建两个线程。线程1发送一个魔术包来唤醒睡眠客户端。线程2使用pcap捕获数据包并将数据包缓存到u_char *的数组中,因为pcap将数据包串行放入“u_char *数据包”。当两个线程终止时,我然后更改标头然后注入每个缓存的数据包。

  3. 我需要帮助:

    1. functionA:除了计算校验和之外,我可以做任何事情。我试图通过一个函数自己计算它来验证原始校验和,但它们从不匹配。但是,这个问题并不重要,因为我不需要它来演示我的最终项目。我知道如果IP校验和不正确,接收计算机将丢弃该数据包。但是当我演示时,只要我的客户端计算机可以显示收到这个错误的数据包,我已经证明了我的整体概念并且不会失败。 :)

    2. functionB:我想这是更重要的问题。我不知道缓存捕获的数据包的简单方法。我现在正在做的工作如下:

    3. functionB创建一个指向存储u_char *的数组的指针,该数组称为cachedPackets。所以cachedPackets基本上指向一个存储“字符串”的数组。

      会是这样的吗? u_char ** cachedPackets[100],足够容纳100个数据包。

      在此之后,我开始两个线程。 Thread1唤醒我的睡眠客户端。 Thread2打开另一个pcap会话,因此在客户端唤醒时没有数据丢失。 Thread1很简单,我已经独立测试了我的发送魔术包功能。 Thread2是我搞砸的地方。

      Thread2最终调用int pcap_loop(pcap_t *p, int cut, pcap_handler callback, u_char *user)

      回调是捕获每个数据包后将运行的函数。这是我将数据包缓存到数组中的地方。

      回调需要参数( u_char* user, const struct pcap_pkthdr* packet_header, const u_char* packet_data )

      user是pcap_loop的第4个参数中的相同字符串。

      所以我在想,我可以偷偷地给我的回调函数指向一个字符串数组的指针。

      pcap_loop(asdf, asdf, callback, (u_char *)cachedPackets);

      由于我不知道传入的数据包有多大,我将在回调函数中动态分配足够的空间。我还将使用静态int跟踪我在数组中的位置。

      这就是回调的样子:

      void cacheCall(u_char * user, const struct pcap_pkthdr * header, const u_char * packet)
      
          static int cacheindex = 0;
      
          u_char ** cachethis = (u_char **)user; 
      
          //u_char * cachething = *cachethis;
          (*cachethis)[cacheindex] = (u_char *) malloc(header->len); <--- 497
      
      
          int i = 0;
      
          for(i = 0; i < header->len; i++)
          {
              (*cachethis)[cacheindex][i] = packet[i]; <-------------------503
          }
      
          //memcpy(cachething[cacheindex], packet, header->len);
          cacheindex++;
      

      但是当我编译时,我得到了

      497: warning: assignment makes integer from pointer without a cast
      503: error: subscripted value is neither array nor pointer
      

      这是非常漫长的,希望我对我所做的事情的了解并不是完全错误的。任何帮助都是极好的! :)

1 个答案:

答案 0 :(得分:1)

u_char ** cachethis;

cachethis是指针指向u_char的指针。

所以:

*cachethis

是指向u_char的指针,并且:

(*cachethis)[i]

是普通的u_char

因此第497行尝试将指针存储到u_char,第503行尝试下标u_char,这两者都无效。

看起来你想要的只是:

cachethis[i]

cachethis[i][j]