首页 文章

缓存从pcap捕获的数据包

提问于
浏览
3

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

我想要完成的事情:

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

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

我需要帮助的是:

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

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

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) .

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

回调参数 ( 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 回答

  • 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]
    

相关问题