2013-02-24 38 views
3

我想在Python中发送一个UDP数据包,并指定源端口但没有绑定。发送一个带有源端口但没有绑定的UDP数据包

与hping3等价物:

hping3 -s $sourceport -p $remoteport --udp --file message.bin -d 1024 -c 1 $remoteaddr 

我试图做这样的事情:

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) 
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

s.bind((SHOST, SPORT)) 

当然但是,巨蟒试图绑定,而这是行不通的。现在如果我不绑定,我可以这样做:

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0) 
s.sendto("message", (RHOST, RPORT)) 

消息被发送,但是现在没有定义源端口。

有没有人有想法?

编辑:扩展描述:我的python脚本补充了另一个应用程序,它是绑定到定义的端口(1024以上)的UDP服务器。我的脚本只需要将UDP数据包发送到远程服务器,但使用与本地UDP服务器相同的源端口,以便远程UDP服务器相信本地UDP服务器是数据包的作者,并且将继续与它一起传输。

我想我也必须说这是一个完全合法的应用程序,与任何黑客行为都没有关系(事实上,它已经与hping3一起工作,但我想删除这种依赖关系)。

编辑2:该解决方案是在下面Nos's answer评论:

使用pyip Python包,并创建一个原始套接字。不要忘了root,因为只有root可以发送原始数据包(这不是Python的限制,而是操作系统的限制,这是为了防止安全问题,所以要发送原始数据包作为用户,你需要调整你的操作系统配置)。

回答

1

没有API用于在python中发送带有定义的源端口的UDP数据包,也没有大多数(所有?)操作系统上的python运行,而没有首先将套接字绑定到本地端口。

所以如果你想控制源端口,你必须绑定()你的套接字。

如果bind()“不起作用”,那么您要么绑定到另一个进程拥有的端口,要么只有root用户可以绑定的端口号<,或者您要给其他某个端口号绑定错误的参数() - 但我们需要更多的信息来帮助你,例如您获得的错误消息,您传递的实际参数等。

+0

问题是,已经有另一个应用程序在相同的接口和端口上运行(这是整个目标:使用我自己的应用程序提供额外的功能只发送数据包以补充绑定到端口的其他应用程序,并且将响应传入的数据包)。 – gaborous 2013-02-24 19:01:23

+0

我按要求添加了一个扩展的描述,但我认为它没有多大帮助。那么在Python中真的没有办法做到这一点? – gaborous 2013-02-24 19:05:30

+1

@ user1121352不是直接的,你可能可以使用原始套接字,并制作你自己的UDP数据包,只要知道那个套接字也会接收到另一个程序的数据包。 – nos 2013-02-24 19:07:22

相关问题