问题描述:
由于测试需求需要发一个带有私有协议的头部数据的报文来进一步做相关用例测试,而scapy经过查资料和测试只能带已知网络协议(以太网二层协议数据Ether,ip协议等)的头部数据,想带其他报文数据只能被当做字符串处理,而不能直接带自己想要的十六进制数据。
比如我想发一个在以太网头部数据之前附加上自己的私有协议头数据的报文,具体如下:
私有头协议数据:03 00 00 02 10 02 00 00 40 00 00 00 80 03
以太网头部数据:
1、目的mac地址:00:11:22:33:44:55
2、源mac地址:00:22:22:22:22:22
3、vlan TAG 数据:TPID:8100; CFI:0 PCP:0,vlan:d
尝试直接在进行scapy发包时,发如下数据:
p="0300000210020000400000008003"/Ether(dst='00:11:22:33:44:55', src='00:22:22:22:22:22')/Dot1Q(vlan=13) /"1122334455"
sendp(p, iface = 'veth12', count =1)
解决办法:
则发现直接将 "0300000210020000400000008003"识别成了字符串,转化成相应的ASCII码发出去了,而不是自己想要带的十六进制数据,无奈写了个Python脚本进行构造私有头协议数据,send_tcp_packet.py脚本如下:
import time
import threading
import sys
from scapy.all import *
running = 1;
pad = "0300000210020000400000008003"
pad_decode = pad.decode('hex')
class MyProtocol(Packet):
name = "MyProtocol"
fields_desc = [
StrLenField("Pad","0")
]
class Thread_send(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
n = 0
packet = MyProtocol(Pad = pad_decode)/Ether(dst='00:11:22:33:44:55', src='00:22:22:22:22:22') \
/Dot1Q(vlan=13) /"1122334455"
sendp(packet, iface = 'veth0', verbose=False)
class Thread_stop(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
ver = raw_input('Press any key to stop send')
global running
running = 0
if __name__=='__main__':
t1 = Thread_send()
t2 = Thread_stop()
t1.start()
t2.start()
运行脚本,就可以构造带自己任何想要的数据了。可根据自己需求修改在报文的任意位置添加私有协议数据。
结果展示:
运行结果如下,成功发出带有私有协议头部数据“03 00 00 02 10 02 00 00 40 00 00 00 80 03”的报文: