这是对此的后续问题: 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)
。
回调是捕获每个数据包后将运行的函数。这是我将数据包缓存到数组中的地方。
回调需要参数( 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
这是非常漫长的,希望我对我所做的事情的了解并不是完全错误的。任何帮助都是极好的! :)
答案 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]