私はこれを解決しようとして1日以上過ごしました。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=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 があります。
誰かが私が間違っていることを教えてもらえますか?
ありがとう