这是对此的后续问题:重建数据包以通过 pcap 注入 https://stackoverflow.com/questions/8193281/rebuilding-a-packet-to-inject-via-pcap
我想要实现的目标:
functionA:使用pcap抓包。修改源/目标地址。重新计算校验和。用 pcap 注射。
functionB:创建两个线程。线程 1 发送一个魔术包来唤醒正在睡觉的客户端。线程 2 使用 pcap 捕获数据包并将数据包缓存到 u_char * 数组中,因为 pcap 将数据包数据串行放入“u_char * packet”中。当两个线程终止时,我会更改标头,然后注入每个缓存的数据包。
我需要什么帮助:
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 的第四个参数中的字符串相同。
所以我在想,我可以通过类型转换偷偷地给我的回调函数提供指向字符串数组的指针。
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
这是相当冗长的,希望我对我正在做的事情的了解没有完全被误导。任何帮助都是极好的! :)