gpt4 book ai didi

缓存从 pcap 捕获的数据包

转载 作者:行者123 更新时间:2023-12-04 11:53:11 27 4
gpt4 key购买 nike

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

我想要完成的事情:

  • functionA:使用 pcap 捕获数据包。修改源/目标地址。重新计算校验和。用 pcap 注入(inject)。
  • functionB:创建两个线程。线程 1 发送一个魔术包来唤醒休眠的客户端。线程 2 使用 pcap 捕获数据包并将数据包缓存到 u_char * 数组中,因为 pcap 将数据包数据串行放入“u_char * packet”中。当两个线程都终止时,我会更改 header ,然后注入(inject)每个缓存的数据包。

  • 我需要帮助:
  • functionA:除了计算校验和,我什么都能做。我试图通过自己用函数计算来验证原始校验和,但它们从不匹配。但是,这个问题并不重要,因为我不需要它来演示我的最终项目。我了解如果 IP 校验和不正确,接收计算机将丢弃数据包。但是当我demo的时候,只要能证明我的客户端电脑收到了这个错误的数据包,我就证明了我的整体概念,不会失败。 :)
  • functionB:我想这是更重要的问题。我不知道缓存捕获的数据包的简单方法。我现在的工作如下:

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

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

    在此之后,我启动了两个线程。 Thread1 唤醒我 sleep 的客户。 Thread2 打开另一个 pcap session ,因此客户端唤醒时不会丢失数据。 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 的第四个参数中的相同字符串。

    所以我在想,我可以通过类型转换偷偷地给我的回调函数一个指向字符串数组的指针。
    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

    那是相当冗长的,希望我对我正在做的事情的了解并没有完全被误导。任何帮助都是极好的! :)

    最佳答案

    u_char ** cachethis;
    cachethis是一个指向u_char的指针。

    所以:
    *cachethis

    是一个指向 u_char 的指针,并且:
    (*cachethis)[i]

    是一个普通的 u_char .

    所以第 497 行尝试将指针存储到 u_char 中。 , 第 503 行尝试下标 u_char , 两者都是无效的。

    看起来你想要的只是:
    cachethis[i]


    cachethis[i][j]

    关于缓存从 pcap 捕获的数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8200570/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com