2013-02-24 41 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

相關問題