44 lines
1.2 KiB
Python
44 lines
1.2 KiB
Python
|
|
# 导入Netzob库
|
|||
|
|
from netzob.all import *
|
|||
|
|
|
|||
|
|
# 定义以太网802.3协议的各个字段
|
|||
|
|
# 1. 以太网长度字段(16位)2字节
|
|||
|
|
eth_length = Field(bitarray('0000000000000000'), "eth.length")
|
|||
|
|
|
|||
|
|
# 2. IEEE 802.2 LLC头部(固定3字节)
|
|||
|
|
eth_llc = Field(Raw(nbBytes=3), "eth.llc")
|
|||
|
|
|
|||
|
|
# 3. 以太网载荷字段
|
|||
|
|
eth_payload = Field(Raw(), name="eth.payload")
|
|||
|
|
|
|||
|
|
# 4. 填充字段(保证以太网最小帧长60字节)
|
|||
|
|
eth_padding = Field(Padding(
|
|||
|
|
[eth_length, eth_llc, eth_payload],
|
|||
|
|
data=Raw(nbBytes=1),
|
|||
|
|
modulo=8*60),
|
|||
|
|
"eth.padding"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# 5. 以太网CRC校验字段(32位)
|
|||
|
|
eth_crc_802_3 = Field(bitarray('00000000000000000000000000000000'), "eth.crc")
|
|||
|
|
# 设置CRC32校验规则
|
|||
|
|
eth_crc_802_3.domain = CRC32(
|
|||
|
|
[eth_length, eth_llc, eth_payload, eth_padding],
|
|||
|
|
dataType=Raw(nbBytes=4, unitSize=UnitSize.SIZE_32)
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# 设置长度字段:计算LLC+载荷的总长度
|
|||
|
|
eth_length.domain = Size(
|
|||
|
|
[eth_llc, eth_payload],
|
|||
|
|
dataType=uint16(),
|
|||
|
|
factor=1./8
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# 构建完整的以太网802.3协议符号
|
|||
|
|
symbol = Symbol(
|
|||
|
|
name="ethernet_802_3",
|
|||
|
|
fields=[eth_length, eth_llc, eth_payload, eth_padding, eth_crc_802_3]
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# 打印协议结构
|
|||
|
|
print(symbol.str_structure())
|