2012-10-18 96 views

回答

2

該文檔似乎沒有解釋任何方式設置任意選項的數字。

通過代碼挖掘,看起來像TCPOptionsField.i2m可以讓您通過傳遞int而不是str來完成此操作。因此,請嘗試使用28與您使用MSS相同的地方。看起來您需要將選項字段的其餘部分組成字符串 - 長度,然後是UTO +粒度的高位字節,然後是低位字節。

或者只是修改代碼來處理:

我想你想要什麼TCPOptions在Scapy的/層/ inet.py元組:

TCPOptions = (
      { 0 : ("EOL",None), 
      ... 
      28 : ("UserTimeout",!H) 
      }, 
      { "EOL":0, 
      ... 
      "UserTimeout":28, 
      }) 

然後你就可以(希望)設置以與設置MSS相同的方式進行UTO。

無論採用哪種方式,在將結果作爲選項值傳遞之前,您都要負責編寫1位粒度和15位超時,但我認爲這比將其更改爲採用布爾的元組和布爾值更簡單int作爲選項值並在TCP中組成它。

當然,除非你在內核上修補了內核,並且確保中間網絡沒有任何設備保留或去掉未知的TCP選項,否則它不會很有趣。

+0

感謝您挖掘代碼。我希望在不改變scapy源代碼的情況下,有更簡單的方法可以做到這一點。我有一個要求,我的一個設備上的堆棧會在這個選項上偷看。我只是想確保這些作品。我會試試這個,祈禱它能奏效。 – user1295872

+0

另外,當你說我必須將該值作爲字符串傳遞時,你的意思是作爲一個十六進制塊嗎?例如,如果我想要30秒的超時時間,我的選項字段的十六進制值將是9E(長度爲4,然後是粒度位0,然後是30的超時)。那麼將選項值設置爲'0x9E'是否有效? – user1295872

+0

首先,您不必更改scapy源代碼,只需將該選項作爲「int」傳遞即可;它只是改變源代碼會更容易。其次,你從哪裏得到9E?你有8位長度4,1位0和15位30.這是40001E。第三,不,字符串我的意思是一串實際的字節,比如3字節的字符串''\ x40 \ x00 \ x1E'',而不是8字節的字符串''0x40001E'。 – abarnert