Python で IP パケットを作成する必要がありますが、フィールドの長さが異なります。1 バイトより大きいフィールドがあるたびに、バイト オーダーをビッグ エンディアンに変更する必要があります。そこで私がしたことは、各変数を個別にパックし、すべてをファイルに保存することでした。パッキング後にチェックサムを実行し、チェックサムを使用してもう一度パッキングする必要があるため、ファイルに保存しています(誰かがより良いアイデアを持っている場合は大歓迎です)。
私は2つの問題を抱えています:
1) 生成したパケットは、情報を解析した元のパケットよりも大きい (生成した IP パケットは、TTL である 1 つのフィールドのみを変更しますが、同じサイズのままである必要があります)
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 を 1 減らして、次のようにパケットを再構成します。
pk_cksum=0
arch= open('packet.out', 'w')
arch.write( struct.pack('B',frstb) )
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: 0
TOS: 0
LEN: 50
ID= 456
OFF: 16384
TTL: 4
PROT: 6
CHSUM: 0
SRC: 3232235777
DST: 2818640397
data: ['@', '\x00', '\x00', '2', '\x01', '\xc8', '@', '\x00', '\x04', '\x06', '\x00', '\x00', '\x01', '\x01', '\xa8', '\xc0', '\r', '\n', '\x01', '\xa8', '\xc0', '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', 'A']
ご覧のとおり、一部の変数には別の値があり、その理由はわかりません。
誰かが私が間違っていることを教えてもらえますか?
ありがとう