如何在c中创建自定义数据包?

时间:2014-02-09 04:02:19

标签: c tcp packet

我正在尝试使用TCP / IP协议使用C创建自定义数据包。当我说自定义时,我的意思是能够从数据包中更改任何值;例如:MAC,IP地址等。

我试着四处寻找,但我找不到任何实际指导我或给我示例源代码的内容。

如何创建自定义数据包或在哪里寻求指导?

2 个答案:

答案 0 :(得分:3)

可移植的相对简单的工具是libpcap。接收原始数据包更为人所知(事实上,你最好先使用它来比较接收数据包,因为你可以将收到的数据包与手工制作的数据包进行比较),但鲜为人知的pcap_sendpacket实际上会发送一个原始数据包。

如果您想自己从头开始,请打开一个AF_PACKETSOCK_RAW的套接字(适用于Linux,其他操作系统可能会有所不同) - 例如,请参阅http://austinmarton.wordpress.com/2011/09/14/sending-raw-ethernet-packets-from-a-specific-interface-in-c-on-linux/和完整版代码https://gist.github.com/austinmarton/1922600。请注意,您需要是root用户(或者更准确地说具有相应的功能)才能执行此操作。

另请注意,如果您尝试发送原始tcp / udp数据包,您将遇到的一个问题是禁用网络堆栈自动处理回复(通过将其视为发送到现有IP地址或尝试转发它)

答案 1 :(得分:1)

这样做并不像你想象的那么简单。使用普通套接字API控制IP层上方的数据相对容易,但控制下面的数据要多一些。大多数操作系统都难以更改低级协议信息,因为内核本身管理网络连接并且不希望您搞砸了。除此之外,还有其他平台差异,网络控制等可能对您造成严重破坏。

您应该查看一些用于执行此操作的库。一些例子:

如果您的目标是欺骗数据包,您应该阅读基于网络的欺骗缓解技术(例如,出口过滤以防止欺骗数据包退出网络)。