對于我想通過 Scapy 生成的每個數據包,我都有以下信息,它是 tcpdump 輸出:1509472682.813373 MAC1 > MAC2, ethertype IPv4 (0x0800), length 74: (tos 0x0, ttl 64, id 64271, offset 0, flags [DF], proto TCP (6), length 60) IP1.port1 > IP2.port2: Flags [S], cksum 0x4a0b (incorrect -> 0xe5b4), seq 1763588570, win 65535, options [mss 1460,sackOK,TS val 1098453 ecr 0,nop,wscale 6], length 0我已經生成TCP了如下數據包,但是當我通過wireshark檢查它們時,似乎Timestamp根本沒有設置該選項,Sack也沒有像我預期的那樣設置。for r in (("mss","MSS"), ("sackOK","SAck"), ("nop","NOP"), ("TS ", "Timestamps "), ("val", "TSval"), ("ecr", "TSecr"), ("wscale","WScale")): opt = opt.replace(*r)opt=opt.split(",") for op in opt: op = op.split() if len(op) == 2: options.append((op[0],int(op[1]))) elif op[0] == "Timestamps": ## Need some modification, so that Scapy do not ignore it. options.append((op[0],(int(op[2]),int(op[4])))) elif op[0] == "SAck": ## How to set SAck option to be SAck Permitted? options.append((op[0], '')) else: # NOP options.append((op[0], ()))ip = ether/IP(src=ipsrc, dst=ipdst, len=ipLen, tos=frameTos, ttl=frameTtl, offset=frameOffset, id=frameId, flags=frameFlags, proto=protocol.lower())if ack_n is None: pkt = ip / TCP(sport=srcport, dport=dstport , flags=frameFlag, seq=int(seq_n), chksum=cksum, window=win, options=options) / secrets.token_bytes(frameLen-54) else: pkt = ip / TCP(sport=srcport, dport=dstport , flags=frameFlag, seq=int(seq_n), ack=ack_n, chksum=cksum, window=win, options=options) / secrets.token_bytes(frameLen-54) pkt.time = frametimewrpcap(output, pkt, append=True)這是傳遞給我在開頭提供其信息的數據包的選項字段的內容:[('MSS', 1460), ('SAck', ''), ('Timestamps', (1098453, 0)), ('NOP', ()), ('WScale', 6)]但是當我通過 Wireshark 檢查數據包時,該Timestamps選項未設置,似乎 Scapy 已忽略它,并且該SAck選項未按我的預期設置。下面是這個數據包選項字段在 Wireshark 中的樣子:這是我所期望的:所以這里的問題是:如何設置timestamps,讓 Scapy 不忽略它?如何設置SAck,使其標記為允許。編輯1:我已經解決了這個問題SAck,我應該把它作為('SAckOK', '')
1 回答

絕地無雙
TA貢獻1946條經驗 獲得超4個贊
最后我找到了我設置錯誤的地方:
正如我在第一次編輯中提到的那樣,要設置允許選擇性確認,我應該將選項元組傳遞為('SAckOK', '')
.
要設置timestamp
我應該傳遞一個元組選項,因為('Timestamp', (1098453, 0))
在內部元組中,第一個參數是Val
,第二個參數是Ecr
。
添加回答
舉報
0/150
提交
取消