Evgenios1 Δημοσ. 22 Σεπτεμβρίου 2009 Δημοσ. 22 Σεπτεμβρίου 2009 Γεια φτιαχνω ενα sniffer, συμφωνα με το wiki ο ip header ειναι πρωτος και ο tcp δευτερος. αρα με μια raw sokcet περνουμε ενα buffer στον οποιον στην αρχη θα ειναι ο ip header και μετα απο αυτον, ο tcp. Εκνα δυο struct στη c# IPHeader >[color="#0000ff"][b]namespace[/b][/color] sniffer.Headers { [color="#0000ff"][b]using[/b][/color] System; [color="#0000ff"][b]using[/b][/color] System.Runtime.InteropServices; [structLayout(System.Runtime.InteropServices.[color="#2b91af"]LayoutKind[/color].Explicit)] [color="#0000ff"][b]public[/b][/color] [color="#0000ff"][b]struct[/b][/color] IPHeader { [FieldOffset([color="#ff8000"]0[/color])] [color="#8000ff"]byte[/color] _Version; [FieldOffset([color="#ff8000"]1[/color])] [color="#8000ff"]byte[/color] _TypeOfService; [FieldOffset([color="#ff8000"]2[/color])] [color="#8000ff"]ushort[/color] _PackLen; [FieldOffset([color="#ff8000"]4[/color])] [color="#8000ff"]ushort[/color] _UniqueID; [FieldOffset([color="#ff8000"]6[/color])] [color="#8000ff"]ushort[/color] _IpOffSet; [FieldOffset([color="#ff8000"]8[/color])] [color="#8000ff"]byte[/color] _TimeToLive; [FieldOffset([color="#ff8000"]9[/color])] [color="#8000ff"]byte[/color] _Protocol; [FieldOffset([color="#ff8000"]10[/color])] [color="#8000ff"]ushort[/color] _IpCheksum; [FieldOffset([color="#ff8000"]12[/color])] [color="#8000ff"]uint[/color] _IpFrom; [FieldOffset([color="#ff8000"]16[/color])] [color="#8000ff"]uint[/color] _IpTo; [color="#0000ff"][b]unsafe[/b][/color] IPHeader(IPHeader* ipheader) { [color="#0000ff"][b]this[/b][/color]._Version = ipheader->_Version; [color="#0000ff"][b]this[/b][/color]._TypeOfService = ipheader->_TypeOfService; [color="#0000ff"][b]this[/b][/color]._PackLen = ipheader->_PackLen; [color="#0000ff"][b]this[/b][/color]._UniqueID = ipheader->_UniqueID; [color="#0000ff"][b]this[/b][/color]._IpOffSet = ipheader->_IpOffSet; [color="#0000ff"][b]this[/b][/color]._TimeToLive = ipheader->_TimeToLive; [color="#0000ff"][b]this[/b][/color]._Protocol = ipheader->_Protocol; [color="#0000ff"][b]this[/b][/color]._IpCheksum = ipheader->_IpCheksum; [color="#0000ff"][b]this[/b][/color]._IpFrom = ipheader->_IpFrom; [color="#0000ff"][b]this[/b][/color]._IpTo = ipheader->_IpTo; } [color="#0000ff"][b]public[/b][/color] [color="#0000ff"][b]static[/b][/color] IPHeader CreateHeader([color="#8000ff"]byte[/color][] buffer) { [color="#0000ff"][b]unsafe[/b][/color] { [color="#0000ff"][b]fixed[/b][/color] ([color="#8000ff"]byte[/color]* un_buffer = buffer) { [color="#0000ff"][b]return[/b][/color] [color="#0000ff"][b]new[/b][/color] IPHeader((IPHeader*)un_buffer); } } } [color="#0000ff"][b]public[/b][/color] [color="#8000ff"]string[/color] IpFrom { [color="#0000ff"][b]get[/b][/color] { [color="#8000ff"]byte[/color][] ipb = [color="#2b91af"]BitConverter[/color].GetBytes([color="#0000ff"][b]this[/b][/color]._IpFrom); [color="#0000ff"][b]return[/b][/color] [color="#8000ff"]string[/color].[color="#2b91af"]Format[/color]([color="#a31515"]"{0}.{1}.{2}.{3}"[/color], ipb[[color="#ff8000"]0[/color]], ipb[[color="#ff8000"]1[/color]], ipb[[color="#ff8000"]2[/color]], ipb[[color="#ff8000"]3[/color]]); } } [color="#0000ff"][b]public[/b][/color] [color="#8000ff"]string[/color] IpTo { [color="#0000ff"][b]get[/b][/color] { [color="#8000ff"]byte[/color][] ipb = [color="#2b91af"]BitConverter[/color].GetBytes([color="#0000ff"][b]this[/b][/color]._IpTo); [color="#0000ff"][b]return[/b][/color] [color="#8000ff"]string[/color].[color="#2b91af"]Format[/color]([color="#a31515"]"{0}.{1}.{2}.{3}"[/color], ipb[[color="#ff8000"]0[/color]], ipb[[color="#ff8000"]1[/color]], ipb[[color="#ff8000"]2[/color]], ipb[[color="#ff8000"]3[/color]]); } } [color="#0000ff"][b]public[/b][/color] [color="#8000ff"]byte[/color] [color="#2b91af"]Version[/color] { [color="#0000ff"][b]get[/b][/color] { [color="#8000ff"]byte[/color] temp = [color="#0000ff"][b]this[/b][/color]._Version; [color="#0000ff"][b]return[/b][/color] (temp >>= [color="#ff8000"]4[/color]); } } [color="#0000ff"][b]public[/b][/color] [color="#8000ff"]int[/color] PacketLenght { [color="#0000ff"][b]get[/b][/color] { [color="#0000ff"][b]return[/b][/color] [color="#0000ff"][b]this[/b][/color]._PackLen; } } [color="#0000ff"][b]public[/b][/color] [color="#8000ff"]int[/color] HeaderLenght { [color="#0000ff"][b]get[/b][/color] { [color="#8000ff"]byte[/color] temp = [color="#0000ff"][b]this[/b][/color]._Version; temp <<= [color="#ff8000"]4[/color]; temp >>= [color="#ff8000"]4[/color]; [color="#0000ff"][b]return[/b][/color] ([color="#8000ff"]int[/color])(temp * [color="#ff8000"]4[/color]); } } } } και TCPHeader >[color="#0000ff"][b]namespace[/b][/color] sniffer.Headers { [color="#0000ff"][b]using[/b][/color] System; [color="#0000ff"][b]using[/b][/color] System.Runtime.InteropServices; [structLayout( [color="#2b91af"]LayoutKind[/color].Explicit)] [color="#0000ff"][b]public[/b][/color] [color="#0000ff"][b]struct[/b][/color] TCPHeader { [FieldOffset([color="#ff8000"]0[/color])] [color="#8000ff"]ushort[/color] _PortFrom; [FieldOffset([color="#ff8000"]2[/color])] [color="#8000ff"]ushort[/color] _PortTo; [FieldOffset([color="#ff8000"]4[/color])] [color="#8000ff"]uint[/color] th_seq; [FieldOffset([color="#ff8000"]8[/color])] [color="#8000ff"]uint[/color] th_ack; [FieldOffset([color="#ff8000"]14[/color])] [color="#8000ff"]ushort[/color] th_win; [FieldOffset([color="#ff8000"]16[/color])] [color="#8000ff"]ushort[/color] _checksum; [FieldOffset([color="#ff8000"]18[/color])] [color="#8000ff"]ushort[/color] th_urp; [color="#0000ff"][b]unsafe[/b][/color] TCPHeader(TCPHeader* header) { [color="#0000ff"][b]this[/b][/color]._PortFrom = header->_PortFrom; [color="#0000ff"][b]this[/b][/color]._PortTo = header->_PortTo; [color="#0000ff"][b]this[/b][/color].th_seq = header->th_seq; [color="#0000ff"][b]this[/b][/color].th_ack = header->th_ack; [color="#0000ff"][b]this[/b][/color].th_win = header->th_win; [color="#0000ff"][b]this[/b][/color]._checksum = header->_checksum; [color="#0000ff"][b]this[/b][/color].th_urp = header->th_urp; } [color="#0000ff"][b]public[/b][/color] [color="#0000ff"][b]static[/b][/color] TCPHeader CreateHeader([color="#8000ff"]byte[/color][] buffer,[color="#8000ff"]int[/color] tcpOffSet) { [color="#0000ff"][b]unsafe[/b][/color] { [color="#0000ff"][b]fixed[/b][/color] ([color="#8000ff"]byte[/color]* un_buffer = buffer) { [color="#0000ff"][b]return[/b][/color] [color="#0000ff"][b]new[/b][/color] TCPHeader((TCPHeader*)&un_buffer[tcpOffSet]); } } } [color="#0000ff"][b]public[/b][/color] [color="#8000ff"]ushort[/color] PortTo { [color="#0000ff"][b]get[/b][/color] { [color="#0000ff"][b]return[/b][/color] [color="#0000ff"][b]this[/b][/color]._PortTo; } } [color="#0000ff"][b]public[/b][/color] [color="#8000ff"]ushort[/color] PortFrom { [color="#0000ff"][b]get[/b][/color] { [color="#0000ff"][b]return[/b][/color] [color="#0000ff"][b]this[/b][/color]._PortFrom; } } } } και στο προγραμμα >[color="#0000ff"][b]using[/b][/color] System; [color="#0000ff"][b]using[/b][/color] System.Collections.Generic; [color="#0000ff"][b]using[/b][/color] System.Linq; [color="#0000ff"][b]using[/b][/color] System.Text; [color="#0000ff"][b]using[/b][/color] System.Net.Sockets; [color="#0000ff"][b]using[/b][/color] System.Net; [color="#0000ff"][b]using[/b][/color] sniffer.Headers; [color="#0000ff"][b]namespace[/b][/color] sniffer { [color="#0000ff"][b]class[/b][/color] Program { [color="#0000ff"][b]static[/b][/color] [color="#0000ff"][b]void[/b][/color] Main([color="#8000ff"]string[/color][] args) { [color="#2b91af"]Socket[/color] socket = [color="#0000ff"][b]new[/b][/color] [color="#2b91af"]Socket[/color]([color="#2b91af"]AddressFamily[/color].InterNetwork, [color="#2b91af"]SocketType[/color].Raw, [color="#2b91af"]ProtocolType[/color].IP); socket.Bind([color="#0000ff"][b]new[/b][/color] [color="#2b91af"]IPEndPoint[/color]([color="#2b91af"]IPAddress[/color].Parse([color="#a31515"]"192.168.1.105"[/color]), [color="#ff8000"]0[/color])); [color="#8000ff"]byte[/color][] buf = [color="#0000ff"][b]new[/b][/color] [color="#8000ff"]byte[/color][[color="#ff8000"]4096[/color]]; [color="#8000ff"]byte[/color][] intbuff = { [color="#ff8000"]1[/color], [color="#ff8000"]0[/color], [color="#ff8000"]0[/color], [color="#ff8000"]0[/color] }; [color="#8000ff"]byte[/color][] intbuffout = [color="#0000ff"][b]new[/b][/color] [color="#8000ff"]byte[/color][[color="#ff8000"]4[/color]]; socket.SetSocketOption([color="#2b91af"]SocketOptionLevel[/color].IP, [color="#2b91af"]SocketOptionName[/color].HeaderIncluded, [color="#ff8000"]1[/color]); socket.IOControl([color="#2b91af"]IOControlCode[/color].ReceiveAll, intbuff, intbuffout); [color="#0000ff"][b]while[/b][/color] ([color="#0000ff"][b]true[/b][/color]) { socket.Receive(buf); IPHeader ip = IPHeader.CreateHeader(buf); TCPHeader tcp = TCPHeader.CreateHeader(buf,[color="#ff8000"]20[/color]); [color="#2b91af"]Console[/color].WriteLine( [color="#a31515"]"----------------------------Packet---------------------------\n"[/color]+ [color="#a31515"]"From:{0}:{1}\nTo:{2}:{3}\n"[/color]+ [color="#a31515"]"Packet Lenght:{4} Header Version:{5}"[/color], ip.IpFrom, tcp.PortFrom, ip.IpTo, tcp.PortTo, ip.PacketLenght, ip.[color="#2b91af"]Version[/color] ); } } } } Και δε μου βγαζει ποτε τη σωστη port :mad::mad::mad: Ξερετε τι παιζει? Που ειναι ο TCP header???
kagelos Δημοσ. 23 Σεπτεμβρίου 2009 Δημοσ. 23 Σεπτεμβρίου 2009 Άσχετο αλλά νόμιζα ότι μετά το Service Pack 2 τα raw sockets αφαιρέθηκαν από τα Windows XP. Τελικά συνεχίζουν να υπάρχουν? Έχεις δει καθόλου το WinPcap?
Evgenios1 Δημοσ. 23 Σεπτεμβρίου 2009 Μέλος Δημοσ. 23 Σεπτεμβρίου 2009 Μια χαρα δουλευει η raw, αλλα δε μπορω να βρω το tcp header μεσα στο paket βρισκω μονο το ip header (αφου ειναι πρωτος πτρωτος ). Βρικα και ενα μικρο λαθακι στο ipheader struct (PacketLenght) το οποιο το διορθωσα με shifting αλλα και παλι δε βρισκω το tcp header
mojiro Δημοσ. 24 Σεπτεμβρίου 2009 Δημοσ. 24 Σεπτεμβρίου 2009 δουλεύεις παράλληλα με το wireshark για να βλέπεις τι λαμβάνεις;
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.