Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Analizzare pacchetto socket
Forum - C# / VB.NET - Analizzare pacchetto socket

Avatar
Tipotalpo (Normal User)
Newbie


Messaggi: 2
Iscritto: 25/02/2011

Segnala al moderatore
Postato alle 12:49
Venerdì, 25/02/2011
Salve a tutti come un nuovo arrivato saluto tutti gli appassionati come me di programmazione.
Ho subito una domanda da fare spero che qualcuno mi sia di aiuto...ho letto
il regolamento del forum e non penso di trasgredire con questo messaggio.
Veniamo al dunque.
Ho iniziato da poco a studiare le Socket faccio un breve riassunto di cosa ho capito e cosa non ho capito.
Le socket vengono create in base al sistema operativo (io uso Windows) si
possono creare in più linguaggi (C/C++,vb.net,java..ecc) sfruttando le varie librerie indipendentemente dal linguaggio scelto si deve procedere prima alla
creazione del socket con gli adeguati parametri di configurazione,(famiglia indirizzi,tipo di socket,protocollo usato) e poi tramite le varie funzioni offerte in base alle impostazioni create precedentemente operare su di esso,per poter ricevere e mandare un flusso di byte.
Ho scaricato dalla rete un programma di esempio per studiarne il codice scritto in vb.net che appunto va a creare un Socket di tipo "RAW" funziona perfettamente ma chi lo ha creato non ha scritto nessun commento.
Aggiungo dicendo che ho due libri che parlano delle reti e protocolli me li sono studiati per bene senza parlare delle ricerche fatte su internet ho delle basi sul linguaggio c/c++ e dell'assembrer ma lo stesso non riesco a capire il concetto....

Il punto che non riesco a capire come si fà ad analizzare il datagramma o meglio il flusso di byte scaricato riporto qui sotto il codice con le varie variabili dichiarate nel programma.
I punti che per mè sono critici sono contrassegnati dal punto di domanda”?” con la relativa domanda. Non pretendo mi sia scritto il codice ma almeno datemi uno spunto su dove mi devo
focalizzare per lo studio magari mettendone qualche link

Codice sorgente - presumibilmente VB.NET

  1. 'Variabili dichiarate
  2. '----------------------------------------------------
  3.  
  4.     Private m_Raw() As Byte
  5.     Private m_Time As DateTime
  6.     Private m_Version As Integer
  7.     Private m_HeaderLength As Integer
  8.     Private m_Precedence As Precedence
  9.     Private m_Delay As Delay
  10.     Private m_Throughput As Throughput
  11.     Private m_Reliability As Reliability
  12.     Private m_TotalLength As Integer
  13.     Private m_Identification As Integer
  14.     Private m_TimeToLive As Integer
  15.     Private m_Checksum() As Byte
  16.     Private m_SourceAddress As String
  17.     Private m_DestinationAddress As String
  18.     Private m_SourcePort As Integer
  19.     Private m_DestinationPort As Integer
  20.  
  21.  
  22. '--------------------------------------------------------------------
  23. '--------------------------------------------------------------------
  24.  
  25. 'Sub che analizza il pacchetto
  26.         If raw Is Nothing Then Throw New ArgumentNullException
  27.  
  28.         If raw.Length < 20 Then Throw New ArgumentException
  29.  
  30.  
  31.         m_Raw = raw  
  32.         m_Time = time
  33.         m_Version = (raw(0) & &HF0) >> 4           ‘?????????????? Domanda n°1
  34.         m_HeaderLength = (raw(0) And &HF) * 4 ‘?????????????? Domanda n°2
  35.  
  36.         If (raw(0) And &HF) < 5 Then Throw New ArgumentException
  37.  
  38.         m_Precedence = ((raw(1) And &HE0) >> 5) ‘?????????????” Domanda n°3
  39.         m_Delay = ((raw(1) And &H10) >> 4)          ‘?????????????” Domanda n°3
  40.         m_Throughput = ((raw(1) And &H8) >> 3)  ‘?????????????” Domanda n°3
  41.         m_Reliability = ((raw(1) And &H4) >> 2)    ‘?????????????” Domanda n°3
  42.         m_TotalLength = raw(2) * 256 + raw(3)      ‘?????????????” Domanda n°4
  43.  
  44.         If Not m_TotalLength = raw.Length Then Throw New ArgumentException ' invalid size
  45.        of  packet
  46.  
  47.  
  48.         m_Identification = raw(4) * 256 + raw(5)
  49.  
  50.         m_TimeToLive = raw(8)
  51.  
  52.         'if (Enum.IsDefined(typeof(Protocol),  raw(9)))
  53.         m_Protocol = raw(9)
  54.         'Else
  55.         'm_Protocol = Protocol.Other
  56.         'END IF
  57.  
  58.         ReDim m_Checksum(2)
  59.         m_Checksum(0) = raw(11)
  60.         m_Checksum(1) = raw(10)
  61.  
  62.        
  63.         Try
  64.             m_SourceAddress = GetIPAddress(raw, 12)
  65.             m_DestinationAddress = GetIPAddress(raw, 16)
  66.         Catch ex As Exception
  67.             'MsgBox(ex.Message)
  68.         End Try
  69.  
  70.         If m_Protocol = Protocol.Tcp Or m_Protocol = Protocol.Udp Then
  71.             m_SourcePort = raw(m_HeaderLength) * 256 + raw(m_HeaderLength + 1)
  72.             m_DestinationPort = raw(m_HeaderLength + 2) * 256 + raw(m_HeaderLength + 3)
  73.         Else
  74.             m_SourcePort = -1
  75.             m_DestinationPort = -1
  76.       End If



Domanda n°1
Codice sorgente - presumibilmente Plain Text

  1. m_Version = (raw(0) & &HF0) >> 4


Questa istruzione ricava dalla matrice la versione (“Heder”) la presente istruzione
come si interpreta ? perché c’è un valore esadecimale?

Domanda n°2
Codice sorgente - presumibilmente C# / VB.NET

  1. m_HeaderLength = (raw(0) And &HF) * 4


Questa istruzione ricava la lunghezza dell’ Heder come si interpreta?

Domanda n°3
Codice sorgente - presumibilmente Delphi

  1. m_Precedence = ((raw(1) And &HE0) >> 5)
  2. m_Delay = ((raw(1) And &H10) >> 4)  
  3. m_Throughput = ((raw(1) And &H8) >> 3)
  4. m_Reliability = ((raw(1) And &H4) >> 2)


Queste istruzioni non so a cosa servono e come si interpretano?

Domanda n°4
Codice sorgente - presumibilmente Plain Text

  1. m_TotalLength = raw(2) * 256 + raw(3)


Questa istruzione verifica la lunghezza totale per poi confrontarla con il pacchetto scaricato e quindi ne verifica se ci sono errori.

Domanda n°5
Una volta ottenuto la lunghezza totale dell’ heder di intestazione del protocollo posso ricavare il Byte di inizio dati ma i dati nella matrice sono in formato integer come si deve fare per ricavarne il contenuto codificandolo in ASCHI e quindi leggibile?
Nel programma tali dati vengono inseriti in un oggetto “ StringBuilder “ ma i
valori sono in esadecimale come posso codificarli in ASCII ?
Riporto qui sotto la funzione con l’oggetto StringBuilder
Codice sorgente - presumibilmente VB.NET

  1. Public Function ToString(ByVal RawData As Boolean) As String
  2.         Dim sb As StringBuilder = New StringBuilder(Raw.Length)
  3.         Dim i As Integer, j As Integer
  4.  
  5.         If RawData Then
  6.             For i = 0 To Raw.Length - 1
  7.                 If Raw(i) > 31 Then
  8.                     sb.Append(Raw(i))
  9.                 Else
  10.                     sb.Append(".")
  11.                 End If
  12.             Next
  13.         Else
  14.             Dim rawString As String = ToString(True)
  15.             For i = 0 To Raw.Length - 1 Step 16
  16.                 For j = i To Raw.Length - 1 And j < i + 16
  17.  
  18.                  sb.Append(Raw(j).ToString("x2") + " ") ‘Questa è l’istruzione
  19.  
  20.                 Next
  21.             Next
  22.  
  23.             If rawString.Length < i + 16 Then
  24.                 sb.Append(" ", ((16 - (rawString.Length Mod 16)) Mod 16) * 3)
  25.                 sb.Append(" " + rawString.Substring(i) + vbCrLf)
  26.             Else
  27.                 sb.Append(" " + rawString.Substring(i, 16) + "\r\n")
  28.             End If
  29.  
  30.         End If
  31.  
  32.         Return sb.ToString()
  33.     End Function


Ultima modifica effettuata da Il Totem il 26/02/2011 alle 11:03
PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
2
Down
V
Segnala al moderatore
Postato alle 11:15
Sabato, 26/02/2011
1. Se hai studiato il formato del datagramma dovresti sapere meglio di me, che non lo conosco affatto, che la versione è codificata nei primi 4 bit del primo byte. Infatti raw(0) And &HF0, annulla gli ultimi quattro bit e lo shift verso destra sposta tutti i bit a destra di quattro posizioni. Quindi se raw(0) è bbbbaaaa, il risultato sarà codificato dai bit bbbb. In realtà usare l'and è inutile, perché i 4 bit vanno persi comunque.
2. Stessa storia di prima, ma ottiene gli ultimi quattro bit, e moltiplica il risultato per quattro. Ad esempio, se il primo byte è 0xA7 = 0b10100111, il numero di versione sarà 0b1010 = 10, mentre la lunghezza dell'header, in parole da 4 byte, sarà 0b0111 = 7 (ossia 28 byte).
3, 4. Come sopra.

5. Il codice che hai postato fa proprio quello che hai chiesto. Che problema c'è?

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
1
Down
V
Segnala al moderatore
Postato alle 12:16
Domenica, 27/02/2011
Cosa vuoi pubblicare, il documento o il programma?

N.B.: sono un amministratore del sito, benché il tag dica ancora Founder Member.

PM
Avatar
Tipotalpo (Normal User)
Newbie


Messaggi: 2
Iscritto: 25/02/2011

Up
0
Down
V
Segnala al moderatore
Postato alle 11:41
Sabato, 26/02/2011
Grazie per essere intervenuto Totem il concetto che non riuscivo a capire ora
è molto più chiaro il mio errore stava appunto nel ricercare il valore nei primi
bit ragionavo...... in byte.
Confermo alla tua risposta che si include su un documento da me trovato in
rete in lingua Inglese e tradotto in Italiano.
Se sei d'accordo visto che sei il moderatore del sito se non l'amministratore lo
pubblico altrimenti la finiamo qui.
Grazie per l'aiuto.:)

PM