我已经超过一天试图解决这个问题。我需要在 Python 中创建一个 IP 数据包,但是字段的长度不同。每次我有一个大于 1 字节的字段时,我都需要将字节顺序更改为大端。所以我所做的就是分别打包每个变量并将所有内容保存在一个文件中。我保存在一个文件中,因为我需要在打包后进行校验和,然后用校验和重新打包(如果有人有更好的主意,那就更受欢迎了)。
我有两个问题:
1)我生成的数据包比我解析信息时的原始数据包大(我生成的 IP 数据包仅在一个字段中发生变化,即 TTL,但它应该保持相同的大小)
2)当我解析我的数据包(文件中的数据流)时,一些信息发生了变化(我没有改变它)。
这是原始数据包信息:
Ver: 4
HL: 12
TOS: 0
LEN: 50
ID= 456
OFF: 16384
TTL: 5
PROT: 6
CHSUM: 30512
SRC: 16885952
DST: 167880896
rem_head: ['Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q']
data: ['A', 'A']
此结果来自解析数据包。然后我验证校验和并将 TTL 减一并重新组装数据包,如下所示:
pk_cksum=0x0000
arch= open('packet.out', 'w')
arch.write( struct.pack('B',byte) )
arch.write( struct.pack('>B', pk_tos) )
arch.write( struct.pack('>H', pk_len) )
arch.write( struct.pack('>H', pk_id) )
arch.write( struct.pack('>H',pk_off) )
arch.write( struct.pack('B', pk_ttl) )
arch.write( struct.pack('B', pk_p) )
arch.write( struct.pack('>H', pk_cksum) )
arch.write( struct.pack('<I', pk_src) )
arch.write( struct.pack('<I', pk_dst) )
if (pk_hl>5):
for i in range(len(pk_head)):
arch.write(struct.pack('c', pk_head[i])[0])
if (pk_len>(pk_hl*4)):
for j in range(len(pk_data)):
arch.write(struct.pack('c', pk_data[j])[0])
arch.close()
为了验证打包是否成功,我使用相同的代码解析最后一个数据包,然后得到以下信息:
Ver: 4
HL: 12
TOS: 0
LEN: 50
ID= 456
OFF: 16384
TTL: 4
PROT: 6
CHSUM: 0
SRC: 16885952
DST: 218212544 1101 0000 0001 1010 1000 1100 0000
rem_head: ['\n', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q']
data: ['Q', 'A']
如您所见,目标地址发生了变化,我的头部有一个 '\n',但我的原始变量没有并且数据有一个不应该有的 Q。
有人可以告诉我我做错了什么吗?
谢谢