2017-11-27 6 views
0

私はパケットの読み込みを含む学校プロジェクトに取り組んでいます。パケットの送信元と送信先のIP、プロトコル、送信元と送信先のポートを知る必要があります。今はIPヘッダーが正常に動作していますが、TCPヘッダーからポートを表示すると、エラーが発生することがあります。私は、外部の図書館やツールを使用することを控えています。なぜなら、マークされたときにプロジェクトがどのような環境でテストされるかわからないからです。いくつかの時間だけTCPヘッダーを開けるときのエラー

エラー

Traceback (most recent call last): 
    File "capturePacket.py", line 26, in <module> 
    tcp_hdr = struct.unpack("!HHII2sH2sH", tcpheader) 
struct.error: unpack requires a buffer of 20 bytes 

いくつかのガイダンスが参考になります。ありがとうございました。

import socket,struct,binascii,os 

#if windows 
if os.name == "nt": 
    s = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_IP) 
    s.bind((socket.gethostname(),0)) 
    s.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1) 
    s.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON) 
#if other 
else: 
    s=socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0800)) 

while True: 
    pkt=s.recvfrom(65565) 


    print ("\n\nIP Header:") 
    ipheader = pkt[0][14:34] 
    ip_hdr = struct.unpack("!1s1s1H1H2s1B1B2s4s4s",ipheader) 
    print ("Source IP", socket.inet_ntoa(ip_hdr[8])) 
    print ("Destination IP", socket.inet_ntoa(ip_hdr[9])) 
    print ("Protocol", ip_hdr[6]) 

    print ("\n\nTCP Header:") 
    tcpheader = pkt[0][34:54] 
    tcp_hdr = struct.unpack("!HHII2sH2sH", tcpheader) 
    print ("Source Port:", tcp_hdr[0]) 
    print ("Destination Port:", tcp_hdr[1]) 

答えて

0

問題は非常に簡単です。パケットキャプチャをTCPだけに制限するためにBPFフィルタをスニファに渡すことも、IPプロトコル値が実際には6またはTCPであるかどうかを確認することもありません。

これは、TCPヘッダーであると仮定しているものを解凍しようとすると、代わりに、UDPまたはICMPパケット(または他の組み込みプロトコル、もちろん)。

関連する問題