2012-10-18 192 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