2016-10-03 24 views
3

UDPパケットを解析して、着信UDPパケットを検証するために、UDPサーバーを構築しています。私はパケットを受信して​​解析することができますが、ヘッダ値は私が期待した値ではありません。UDPパケットの解析

これは着信パケットの構造

パケットID(4バイト)
パケット列(4バイト)
XORキー(2バイト)は、パケット内のチェックサムの
数(2バイト)
環状でありますチェックサムCRC32パケットを送信するために(変数)

with open('payloadfile.bin') as op: 
    payload = pickle.load(op) 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 

for i in payload: 
    sock.sentto(payload, ('127.0.0.1',4545)) 

私はこれまで理解し何から

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.bind('127.0.0.1',4545) 

while 1: 
    packet = sock.recvfrom(65565) 
    packet = packet[0] 

    # parse IP 
    ip_header = packet[0:20] 
    iph = struct.unpack('!BBHHHBBH4s4s' , ip_header) 

    #all the following values are incorrect 
    version_ihl = iph[0] 
    version = version_ihl >> 4 
    ihl = version_ihl & 0xF 

    ttl = iph[5] 
    protocol = iph[6] 
    s_addr = socket.inet_ntoa(iph[8]); 
    d_addr = socket.inet_ntoa(iph[9]); 

    # parse UDP 
    packet = packet[20:28] 
    data = packet[header_length:] 
    source_port, dest_port, data_length, checksum = struct.unpack("!HHHH", header) 

このパケットを受信して​​解析するには、これは一般的な構造
IP_HEADER(UDP_HEADER(ペイロード))でなければなりません)

私は正しくヘッダを解析すると、ペイロードを抽出します。
もし私が正しい方向を指すことができるのであれば、本当にありがたいです

+1

あなたはIP/UDPヘッダーを取得せず、データグラムペイロードだけを取得します。これは目的に応じて行われます。あなたはIP4/UDPとしてこのソケットを開いたことがありましたが、 'socket'は複数のトランスポートプロトコルで動作する汎用インタレースです。例えば、IP6やIPXでも透過的に動作するはずです。 – tdelaney

答えて

5

残念なことに、標準のソケットインターフェイスでは、データが到着するデータフレームにアクセスできませんし、IPデータグラムヘッダーもトランスポート層からのTCP/UDPヘッダー

下位レベルのデータを取得するには、いわゆるローソケットインターフェイスを使用する必要があります。これは、Windowsがハッカーである可能性があるため、Windowsの使用をブロックしようとします。 This articleは手がかりを与えるかもしれません。

+0

私はそれを「幸運にも」と呼んでいると思います。なぜなら、一般的なインターフェースだからです...しかし、私はあなたのアンカーが好きです! – tdelaney

関連する問題