import socket import threading import sys import struct import StringIO """ test on windows xp python 2.7 """ def main(argv): sys.stdout=mystdout(sys.stdout) s1=myserver() s1.start() while(True): s1.join(10) return class mystdout(object): def __init__(self,stdout1): self.std=stdout1 self.hf=open("test1.txt","wb") return def write(self,string): self.std.write(string) self.hf.write(string) class myserver(threading.Thread): def __init__(self): threading.Thread.__init__(self) def print_parse(self,data): for itm in data: val=data[itm] print itm,":", if type(val)==type(''): print val,"->",val.encode("hex") else: print type(val),"->",val def get_data(self): data=self.s1.recvfrom(65565) print data[1] print data[0].encode("hex") return data def get_ip_packet(self): ## 0 1 2 3 ## 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ## +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ## |Version| IHL |Type of Service| Total Length | ## +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ## | Identification |Flags| Fragment Offset | ## +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ## | Time to Live | Protocol | Header Checksum | ## +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ## | Source Address | ## +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ## | Destination Address | ## +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ## | Options | Padding | ## +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ pdata=self.get_data() data=pdata[0] d1=StringIO.StringIO(data) o1={} vi=struct.unpack("B", d1.read(1))[0] o1["Version"]=vi>>4 o1["IHL"]=vi & 0xF o1["Type of Service"]=d1.read(1) o1["Total Length"]=struct.unpack(">H", d1.read(2))[0] o1["Identification"]=d1.read(2) ff=struct.unpack("H", d1.read(2))[0] o1["Flags"]=ff>>12 o1["Fragment Offset"]=ff & 0x1FFF o1["Time to Live"]=d1.read(1) o1["Protocol"]=struct.unpack("B", d1.read(1))[0] o1["Header Checksum"]=d1.read(2) o1["Source Address"]=d1.read(4) o1["Destination Address"]=d1.read(4) if o1["IHL"]>5: o1["Options"]=d1.read(4*(o1["IHL"]-5)) o1["data"]=d1.read() self.print_parse(o1) return o1 def parse_tcp(self,data): d1=StringIO.StringIO(data) o1={} ## ## 0 1 2 3 ## 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ## +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ## | Source Port | Destination Port | ## +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ## | Sequence Number | ## +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ## | Acknowledgment Number | ## +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ## | Data | |U|A|P|R|S|F| | ## | Offset| Reserved |R|C|S|S|Y|I| Window | ## | | |G|K|H|T|N|N| | ## +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ## | Checksum | Urgent Pointer | ## +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ## | Options | Padding | ## +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ## | data | ## +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ o1["Source Port"]=struct.unpack(">H", d1.read(2))[0] o1["Destination Port"]=struct.unpack(">H", d1.read(2))[0] o1["Sequence Number"]=struct.unpack(">L", d1.read(4))[0] o1["Acknowledgment Number"]=struct.unpack(">L", d1.read(4))[0] aa=struct.unpack(">H", d1.read(2))[0] o1["Reserved"]=aa o1["Data Offset"]=aa>>12 o1["flags"]=aa & 0x1f o1["Window"]=d1.read(2) o1["Checksum"]=d1.read(2) o1["Urgent Pointer"]=d1.read(2) if o1["Data Offset"]>5: o1["Options"]=d1.read(4*(o1["Data Offset"]-5)) if len(data)>(4*o1["Data Offset"]): o1["data"]=d1.read() self.print_parse(o1) return o1 def run(self): HOST = socket.gethostbyname(socket.gethostname()) self.s1=socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_IP) self.s1.bind((HOST,0)) self.s1.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) self.s1.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) while True: ## s1.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) data=self.get_ip_packet() if data: if data["Protocol"]==1: print "ICMP" elif data["Protocol"]==6: print "TCP" tcp=self.parse_tcp(data["data"]) elif data["Protocol"]==47: print "GRE" else: print "unKnow:",data["Protocol"] ## s1.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF) return if __name__ == "__main__": main(sys.argv)