这是对这个问题的跟进:Rebuilding a packet to inject via pcap
我想要完成的目标:
1. functionA:使用pcap捕获数据包。修改源/目的地址。重新计算校验和。使用pcap注入。 2. functionB:创建两个线程。线程1发送魔术包以唤醒睡眠客户端。线程2使用pcap捕获数据包,并将数据包缓存到u_char *数组中,因为pcap将数据包数据序列化到“u_char * packet”中。当两个线程终止时,我更改标题然后注入每个缓存的数据包。
我需要帮助的地方:
1. functionA:我可以做到一切,但无法计算校验和。我尝试使用函数自己计算原始校验和进行验证,但它们从未匹配。然而,这个问题不那么重要,因为我不需要它来演示我的最终项目。我知道如果IP校验和不正确,接收计算机将丢弃数据包。但是,在我的演示中,只要能够显示我的客户端计算机已经接收到了这个不正确的数据包,我就证明了我的整体概念,不会失败。 :) 2. functionB:我想这是更重要的问题。我不知道缓存捕获的数据包的简单方法。我正在处理以下内容:
functionB创建指向存储u_char *的数组的指针,称为cachedPackets。所以cachedPackets基本上指向存储“字符串”的数组。
它将是这样的吗?
之后,我启动两个线程。Thread1唤醒我的睡眠客户端。Thread2打开另一个pcap会话,因此在唤醒客户端时不会丢失数据。Thread1很容易,我已经独立测试了我的发送魔术包函数。Thread2是我搞砸的地方。
Thread2最终调用
callback是在捕获每个数据包后运行的函数。这是我将数据包缓存到数组中的位置。
callback采用参数
所以我想,我可以通过类型转换巧妙地将我的回调函数给出指向字符串数组的指针。
但是当我编译时,出现了以下错误:
这段话有些冗长,但我希望我的工作知识并非完全错误。任何帮助都将不胜感激! :)
1. functionA:使用pcap捕获数据包。修改源/目的地址。重新计算校验和。使用pcap注入。 2. functionB:创建两个线程。线程1发送魔术包以唤醒睡眠客户端。线程2使用pcap捕获数据包,并将数据包缓存到u_char *数组中,因为pcap将数据包数据序列化到“u_char * packet”中。当两个线程终止时,我更改标题然后注入每个缓存的数据包。
我需要帮助的地方:
1. functionA:我可以做到一切,但无法计算校验和。我尝试使用函数自己计算原始校验和进行验证,但它们从未匹配。然而,这个问题不那么重要,因为我不需要它来演示我的最终项目。我知道如果IP校验和不正确,接收计算机将丢弃数据包。但是,在我的演示中,只要能够显示我的客户端计算机已经接收到了这个不正确的数据包,我就证明了我的整体概念,不会失败。 :) 2. 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是在捕获每个数据包后运行的函数。这是我将数据包缓存到数组中的位置。
callback采用参数
(u_char* user,const struct pcap_pkthdr* packet_header,const u_char* packet_data)
用户与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
这段话有些冗长,但我希望我的工作知识并非完全错误。任何帮助都将不胜感激! :)
u_char*
强制转换为u_char**
非常可疑。重写代码,使您不必使用指针转换,这样您就会更安全。 (如果可能的话,请调查使用容器库或可能的C ++容器的可能性。) - Mat