我正在尝试使用称为用户超时的TCP选项构建数据包。 scapy支持这个吗?添加像MSS这样的选项看起来非常简单。 这里是RFC的选项:http://tools.ietf.org/html/rfc5482#section-2Python Scapy引入TCP选项
任何指针?
我正在尝试使用称为用户超时的TCP选项构建数据包。 scapy支持这个吗?添加像MSS这样的选项看起来非常简单。 这里是RFC的选项:http://tools.ietf.org/html/rfc5482#section-2Python Scapy引入TCP选项
任何指针?
该文档似乎没有解释任何方式设置任意选项的数字。
通过代码挖掘,看起来像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选项,否则它不会很有趣。
感谢您挖掘代码。我希望在不改变scapy源代码的情况下,有更简单的方法可以做到这一点。我有一个要求,我的一个设备上的堆栈会在这个选项上偷看。我只是想确保这些作品。我会试试这个,祈祷它能奏效。 – user1295872
另外,当你说我必须将该值作为字符串传递时,你的意思是作为一个十六进制块吗?例如,如果我想要30秒的超时时间,我的选项字段的十六进制值将是9E(长度为4,然后是粒度位0,然后是30的超时)。那么将选项值设置为'0x9E'是否有效? – user1295872
首先,您不必更改scapy源代码,只需将该选项作为“int”传递即可;它只是改变源代码会更容易。其次,你从哪里得到9E?你有8位长度4,1位0和15位30.这是40001E。第三,不,字符串我的意思是一串实际的字节,比如3字节的字符串''\ x40 \ x00 \ x1E'',而不是8字节的字符串''0x40001E'。 – abarnert