Προς το περιεχόμενο

c# και network anlyzer


Evgenios1

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια φτιαχνω ενα 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::mad::mad::mad::mad: Ξερετε τι παιζει? Που ειναι ο TCP header???

Δημοσ.

Μια χαρα δουλευει η raw, αλλα δε μπορω να βρω το tcp header μεσα στο paket :-( βρισκω μονο το ip header (αφου ειναι πρωτος πτρωτος :-D). Βρικα και ενα μικρο λαθακι στο ipheader struct (PacketLenght) το οποιο το διορθωσα με shifting αλλα και παλι δε βρισκω το tcp header :-(

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...