情况如下:在我的情景中,我有3台电脑,A,B和C.
计算机A向计算机B发送数据。计算机B用pcap捕获这些数据包,附加标题,重做校验和,然后将另一个以太网接口注入计算机C.所以基本上A发送给C,尽管通过C的观点查看,数据来自计算机B.
我的问题是:在TCPDUMP关于剖析捕获的数据包的教程之后,我学会了计算偏移量并使用类型转换来获取以太网,ip和tcp头结构。这样做的方法如下所示:
ethernet = (struct sniff_ethernet*)(packet);
ip = (struct sniff_ip*)(packet + SIZE_ETHERNET);
size_ip = IP_HL(ip)*4;
if (size_ip < 20) {
printf(" * Invalid IP header length: %u bytes\n", size_ip);
return;
}
tcp = (struct sniff_tcp*)(packet + SIZE_ETHERNET + size_ip);
size_tcp = TH_OFF(tcp)*4;
if (size_tcp < 20) {
printf(" * Invalid TCP header length: %u bytes\n", size_tcp);
return;
}
payload = (u_char *)(packet + SIZE_ETHERNET + size_ip + size_tcp);
因为我想注入捕获的数据包以将其从计算机B发送到计算机C,所以我必须修改一些源/目标信息并在完成后重新计算校验和。但是,我的问题是,由于此数据现在分为以太网标头,IP标头和TCP标头的结构,如何将其重新组合成u_char
可以使用的pcap_inject
?
这里可以进行某种连接吗?
答案 0 :(得分:1)
从我在这里看到的代码中,你实际上并没有剖析libpcap
为你捕获的内存。每个转换操作只是告诉编译器你打算如何处理从指针开始的字节 - 这些对象的大小,找到哪些数据的偏移以及它们的长度。
如果你通过这些指针修改这个内存,你已经在进程内存中修改了它的唯一副本 - 并且可以使用一些“更基本”的指针来将整个内存块传递给{{ 1}}或其他任何不需要重新组合数据的东西 - 你从来没有把它拆开。
<强>更新强>
要将数据包注入网络,您需要使用sendmsg(2)
套接字类型;通过raw(7)
套接字发送TCP数据包需要IPPROTO_RAW
套接字选项 - 否则,所有 TCP数据包将被定向到您打开的raw(7)
套接字,使机器上的网络难以使用。
raw(7)
套接字将为您执行一些重新计算任务:
raw(7)
让内核重新计算它愿意为你做的事情。