0

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']

ご覧のとおり、一部の変数には別の値があり、その理由はわかりません。

誰かが私が間違っていることを教えてもらえますか?

ありがとう

4

1 に答える 1

1

"<"フォーマット文字列の前に(little) または">"(big)を付けることで、エンディアンを制御できます。

于 2013-05-09T01:08:06.447 に答える