python - info checksum()

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
socket-raw
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 665
Iscrizione: giovedì 9 luglio 2009, 0:45
Desktop: KDE4
Distribuzione: kubuntu-14.04-LTS-x86_amd64
Località: Arpino

python - info checksum()

Messaggio da socket-raw »

Ciao a tutti,
nella programmazione di rete, per effettuare il check dei dati nei pacchetti IP-TCP-UDP.... si effettua un checksum con il complemento ad 1 (molto semplificato :p ).
per i pacchetti IP il campo headerChecksum è posto a zero, poichè in seguito viene correttamente valorizzato dal kernel, infatti non si deve fare nulla a riguardo, e nel caso IP il checksum si applica solo per l'header del pacchetto.
per quelli tipo TCP o UDP il checksum va calcolato per pseudo_IP_header + TCP_header + TCP_data, giusto?
per fare questo calcolo, dopo una ricerca ho notato che non esiste una funzione standard, vero?

Grazie in anticipo.
Ultima modifica di socket-raw il giovedì 5 maggio 2016, 21:23, modificato 1 volta in totale.
LIVE AND LET LIVE
Avatar utente
socket-raw
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 665
Iscrizione: giovedì 9 luglio 2009, 0:45
Desktop: KDE4
Distribuzione: kubuntu-14.04-LTS-x86_amd64
Località: Arpino

Re: python - info checksum()

Messaggio da socket-raw »

nessuno è "colto" riguardo il checksum per i pacchetti di rete??
mi serve sapere il giusto momento nel quale calcolarlo...
Proprio nessuno? :cry:
Ultima modifica di socket-raw il giovedì 5 maggio 2016, 21:23, modificato 1 volta in totale.
LIVE AND LET LIVE
spider-net
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 432
Iscrizione: martedì 11 maggio 2010, 17:38
Desktop: CWM
Distribuzione: FreeBSD 12.1

Re: info checksum()

Messaggio da spider-net »

socket-raw [url=http://forum.ubuntu-it.org/viewtopic.php?p=4877573#p4877573][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto: il checksum va calcolato per pseudo_IP_header + TCP_header + TCP_data, giusto?
per fare questo calcolo, dopo una ricerca ho notato che non esiste una funzione standard, vero?

Grazie in anticipo.
Il checksum su un pacchetto TCP, si calcola a partire dall'intero segmento TCP (più in caso del padding) e dallo pseudo header TCP (12 byte), facendo il complemento a uno, della somma a complemento a uno di tutte le parole a 16bit. Per ulteriori dettagli: https://www.ietf.org/rfc/rfc793.txt

No non c'è nessuna funzione "standard" ma non è troppo complesso scriverne una.
Avatar utente
socket-raw
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 665
Iscrizione: giovedì 9 luglio 2009, 0:45
Desktop: KDE4
Distribuzione: kubuntu-14.04-LTS-x86_amd64
Località: Arpino

Re: python - info checksum()

Messaggio da socket-raw »

grazie per la risposta,
ho letto le RFC...
quindi, se ho un pacchetto TCP, calcolo il checksum sul padding, header con il campo checksum = 0, sul pacchetto data e li sommo al checksum sul pacchetto pseudo-header, scrivo il risultato nel campo checksum dell'header tcp e dovrebbe essere tutto ok.
Come posso sapere, se una funzione di checksum, oltre a dare un risultato, sia veramente accettato dai nodi della rete?
Dall'algoritmo nella RFC, si implementa una funzione che però non avendo uno standard, non c'è la certezza che il risultato sia lo stesso generato dai nodi.
il kernel ne usauna ad hoc, si può vedere?
Ultima modifica di socket-raw il giovedì 5 maggio 2016, 21:24, modificato 1 volta in totale.
LIVE AND LET LIVE
spider-net
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 432
Iscrizione: martedì 11 maggio 2010, 17:38
Desktop: CWM
Distribuzione: FreeBSD 12.1

Re: info checksum()

Messaggio da spider-net »

Quindi avrai letto http://www.faqs.org/rfcs/rfc1071.html in particolare
In outline, the Internet checksum algorithm is very simple:

(1) Adjacent octets to be checksummed are paired to form 16-bit
integers, and the 1's complement sum of these 16-bit integers is
formed.

(2) To generate a checksum, the checksum field itself is cleared,
the 16-bit 1's complement sum is computed over the octets
concerned, and the 1's complement of this sum is placed in the
checksum field.

(3) To check a checksum, the 1's complement sum is computed over the
same set of octets, including the checksum field. If the result
is all 1 bits (-0 in 1's complement arithmetic), the check
succeeds.
In rete trovi molti esempi di implementazione, uno proprio in RFC1071

Se implementi la funzione proprio come dice RFC allora è standard, per controllarlo ti basta scrivere un'altra funzione che partendo da un pacchetto, controlli che il checksum sia corretto.

Ad esempio:

Codice: Seleziona tutto

uint16_t in_cksum (const void * addr, unsigned len, uint16_t init) {
  uint32_t sum;
  const uint16_t * word;

  sum = init;  /* init is usually 0 */
  word = addr;

  /*
   * Our algorithm is simple, using a 32 bit accumulator (sum), we add
   * sequential 16 bit words to it, and at the end, fold back all the
   * carry bits from the top 16 bits into the lower 16 bits.
   */

  while (len >= 2) {
    sum += *(word++);
    len -= 2;
  }

  if (len > 0) {
    uint16_t tmp;

    *(uint8_t *)(&tmp) = *(uint8_t *)word;
  }

  sum = (sum >> 16) + (sum & 0xffff);
  sum += (sum >> 16);
  return ((uint16_t)~sum);
}


void readTCP (const u_char *packets) {
  uint16_t csum;
  unsigned ipHdrLen;
  unsigned ipPacketLen;
  unsigned ipPayloadLen;
  struct TCP_Pseudo pseudo;
  const struct IP_Header * ip;
  const struct TCP_Header * tcp;

  // Verify IP header and calculate IP payload length
  ip = (const struct IP_Header *)(packets + sizeof(struct Ethernet_Header));
  ipHdrLen = ip->ip_hdr_len * 4;
  if (ipHdrLen < sizeof(struct IP_Header)) {
    // Packet is broken!
    // IP packets must not be smaller than the mandatory IP header.
    return;
  }
  if (in_cksum(ip, ipHdrLen, 0) != 0) {
    // Packet is broken!
    // Checksum of IP header does not verify, thus header is corrupt.
    return;
  }
  ipPacketLen = ntohs(ip->ip_len);
  if (ipPacketLen < ipHdrLen) {
    // Packet is broken!
    // The overall packet cannot be smaller than the header.
    return;
  }
  ipPayloadLen = ipPacketLen - ipHdrLen;

  // Verify that there really is a TCP header following the IP header
  if (ip->ip_p != 6) {
      // No TCP Packet!
      return;
  }
  if (ipPayloadLen < sizeof(struct TCP_Header)) {
    // Packet is broken!
    // A TCP header doesn't even fit into the data that follows the IP header.
    return;
  }

  // TCP header starts directly after IP header
  tcp = (const struct TCP_Header *)((const u_char *)ip + ipHdrLen);

  // Build the pseudo header and checksum it
  pseudo.src_ip = ip->ip_src;
  pseudo.dest_ip = ip->ip_dst;
  pseudo.zeroes = 0;
  pseudo.protocol = 6;
  pseudo.len = htons(ipPayloadLen);
  csum = in_cksum(&pseudo, (unsigned)sizeof(pseudo), 0);

  // Update the checksum by checksumming the TCP header
  // and data as if those had directly followed the pseudo header
  csum = in_cksum(tcp, ipPayloadLen, (uint16_t)~csum);

  char * cs = csum ? "Invalid Checksum!" : "Valid!";
  printf("%s\n", cs);
}
Per quanto riguarda quella implementata dal kernel linux, io non l'ho trovata.
Avatar utente
socket-raw
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 665
Iscrizione: giovedì 9 luglio 2009, 0:45
Desktop: KDE4
Distribuzione: kubuntu-14.04-LTS-x86_amd64
Località: Arpino

Re: python - info checksum()

Messaggio da socket-raw »

ciao spider-net,
ho letto ,tutto ok, ma come ho detto il problema è il calcolo del checksum.
Adesso ti faccio vedere realmente la problematica alla quale mi riferisco con un semplice esempio pratico in python.
il codice seguente è un client UDP che invia un semplice pacchetto al mio router, creando il socket come da standard:

Codice: Seleziona tutto

import socket

UDP_IP = "192.168.1.254"
UDP_PORT = 8888
MESSAGE = "Hello, World!"

print "UDP target IP:", UDP_IP
print "UDP target port:", UDP_PORT
print "message:", MESSAGE

sock = socket.socket(socket.AF_INET, # Internet
                     socket.SOCK_DGRAM) # UDP
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
il checksuk generato è 0x6f93 = 28563, come si vede nel dump esadecimale (terza righa, quinta coppia):

Codice: Seleziona tutto

00 21 96 6c d3 14 08 62 66 51 18 3d 08 00 45 00
00 29 b4 4f 40 00 40 11 01 a6 c0 a8 01 80 c0 a8
01 fe a7 7d 22 b8 00 15 6f 93 48 65 6c 6c 6f 2c
20 57 6f 72 6c 64 21
il mio router mi risponde con un pacchetto ICMP che comunica l'irraggiungibilità della porta.
tutto ok, il paccheto UDP viene accettato e la risposta lo conferma.


ho creato i pacchetti pseudoheader, UDP e DATA unguali a quelli generati dal socket precedente,
questo è il dump esadecimale del l'intero pacchetto UDP:

Codice: Seleziona tutto

a7 7d 22 b8 00 15 6f 93 48 65 6c 6c 6f 2c
20 57 6f 72 6c 64 21


ma calcolandone il valore del checksum, con 3 differenti funzioni, il risultato non è lo stesso
myChecksum: 0x4E85 = 20101
myChecksum1: 0x4E85 = 20101
myChecksum2: 0x854E = 34126

Codice: Seleziona tutto

src = "192.168.1.128"
dst =  "192.168.1.254"
srcport = 42877 
dstport = 8888


UDP_CODE = socket.getprotobyname('udp')
proto = UDP_CODE


def checksum(source_string):
    sum = 0
    count_to = (len(source_string) / 2) * 2
    count = 0
    while count < count_to:
        this_val = ord(source_string[count + 1])*256+ord(source_string[count])
        sum = sum + this_val
        sum = sum & 0xffffffff # Necessary?
        count = count + 2
    if count_to < len(source_string):
        sum = sum + ord(source_string[len(source_string) - 1])
        sum = sum & 0xffffffff # Necessary?
    sum = (sum >> 16) + (sum & 0xffff)
    sum = sum + (sum >> 16)
    answer = ~sum
    answer = answer & 0xffff
    answer = answer >> 8 | (answer << 8 & 0xff00)
    return answer

def checksum1(pkt):
    pkt=str(pkt)
    s=0
    if len(pkt) % 2 == 1:
        pkt += "\0"
    for i in range(len(pkt)/2):
        s = s +  (struct.unpack("!H",pkt[2*i:2*i+2])[0])
    s = (s >> 16) + (s & 0xffff)
    s += s >> 16
    return  ~s & 0xffff

def checksum2(data):
	s = 0
	n = len(data) % 2
	for i in range(0, len(data)-n, 2):
		s+= ord(data[i]) + (ord(data[i+1]) << 8)
	if n:
 		s+= ord(data[i+1])
	while (s >> 16):
		s = (s & 0xFFFF) + (s >> 16)
	s = ~s & 0xFFFF
	return s

data = "Hello, World!!!"

udpHeader = struct.pack("!4H", srcport, dstport, 0, 0)

length = len(udpHeader)+len(data);

# pseudo header fields
source_address = socket.inet_aton( src )
dest_address = socket.inet_aton(dst)
placeholder = 0
protocol = socket.IPPROTO_UDP
udp_length = length
 
psh = struct.pack('!4s4sBBH' , source_address , dest_address , placeholder , protocol , udp_length)
psh = psh + udpHeader + data

myChecksum = checksum( psh)
print ("myChecksum:   "+ str(myChecksum))

myChecksum1 = checksum1( psh)
print ("myChecksum1:   "+ str(myChecksum1))

myChecksum2 = checksum2( psh)
print ("myChecksum2:   "+ str(myChecksum2))
è questo quello che dico, tutto tira fuori un risultato, ma a volte non è quello giusto!

Sai dirmi dove le 3 funzioni errano????

GRAZIEEEEEEE :)
LIVE AND LET LIVE
spider-net
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 432
Iscrizione: martedì 11 maggio 2010, 17:38
Desktop: CWM
Distribuzione: FreeBSD 12.1

Re: python - info checksum()

Messaggio da spider-net »

In realtà sì sono diversi. Python non è il mio forte, prova questa:

Codice: Seleziona tutto

def ichecksum(data, sum=0):
    for i in range(0,len(data),2):
        if i + 1 >= len(data):
            sum += ord(data[i]) & 0xFF
        else:
            w = ((ord(data[i]) << 8) & 0xFF00) + (ord(data[i+1]) & 0xFF)
            sum += w

    while (sum >> 16) > 0:
        sum = (sum & 0xFFFF) + (sum >> 16)

    sum = ~sum

    return sum & 0xFFFF
Avatar utente
socket-raw
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 665
Iscrizione: giovedì 9 luglio 2009, 0:45
Desktop: KDE4
Distribuzione: kubuntu-14.04-LTS-x86_amd64
Località: Arpino

Re: python - info checksum()

Messaggio da socket-raw »

python non è neanche il mio forte, non ancora ;)

il risultato della tua funzione non è uguale ma ci si avvicina più degli altri:
ok chksum: 28563
your chksum: 28516
difference 46

se sommo la costante 46 al risultato della funzione, è ok, ma ovviamente, essendo un complemento ad 1, sommare la costante 46, non dovrebbe portare a nulla di buono per tutti gli altri casi.

vogliamo cercare di capire per bene come si comporta il codice da te riportato per trovare cosa non torna?

l'algoritmo dovrebbe essere:
1) la stringa binaria passata alla funzione viene suddivisa in parole da 16 bit
2)le parole sono sommate a due a due
3)se l'ultima parola è < 16bit, si aggiungono da sinistra degli zeri per portarla a 16 bit
4)il risultato della somma finale viene complementato ad 1

concordi??
LIVE AND LET LIVE
Avatar utente
socket-raw
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 665
Iscrizione: giovedì 9 luglio 2009, 0:45
Desktop: KDE4
Distribuzione: kubuntu-14.04-LTS-x86_amd64
Località: Arpino

Re: python - info checksum()

Messaggio da socket-raw »

Ciao spider-net,
mi aiuti a capire come l'algoritmo del checksum viene implementato con la funzione che hai fornito?

il punto 1:
(1) Adjacent octets to be checksummed are paired to form 16-bit
integers, and the 1's complement sum of these 16-bit integers is
formed.
viene fatto dal ciclo for:

Codice: Seleziona tutto

    for i in range(0,len(data),2):
        if i + 1 >= len(data):
            sum += ord(data[i]) & 0xFF
        else:
            w = ((ord(data[i]) << 8) & 0xFF00) + (ord(data[i+1]) & 0xFF)
            sum += w
il punto 2:
(2) To generate a checksum, the checksum field itself is cleared,
the 16-bit 1's complement sum is computed over the octets
concerned, and the 1's complement of this sum is placed in the
checksum field.
viene fatto dal ciclo while:

Codice: Seleziona tutto

    while (sum >> 16) > 0:
        sum = (sum & 0xFFFF) + (sum >> 16)

    sum = ~sum

    return sum & 0xFFFF
il punto 3:
(3) To check a checksum, the 1's complement sum is computed over the
same set of octets, including the checksum field. If the result
is all 1 bits (-0 in 1's complement arithmetic), the check
succeeds.
non riguarda il sender.

Provo a tradurre la citazione del punto 1:
"ottetti adiacenti per essere checksummati sono accoppiati per formare un intero a 16 bit, e la somma a complemento ad 1 di questi interi 16 bit è formata."

ho capito che, dopo aver formato le parole a 16bit, vanno sommate in complementa ad 1 per ogni coppia a 16bit?

Provo a tradurre la citazione del punto 2:
"Per generare un checksum, il valore del campo checksum deve essere posto a zero, la somma a complemento ad 1 a 16 bit è effettuata sugli ottetti interessati, ed il complemento ad 1 di questa somma viene posto nel campo di checksum."

qui dice che la somma in complementa ad 1 a 16bit viene complementata ad 1 ed inserita nel campo checksum?

ho interpretato bene?
è questo che fà la funzione???

Grazie
LIVE AND LET LIVE
spider-net
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 432
Iscrizione: martedì 11 maggio 2010, 17:38
Desktop: CWM
Distribuzione: FreeBSD 12.1

Re: python - info checksum()

Messaggio da spider-net »

Avatar utente
socket-raw
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 665
Iscrizione: giovedì 9 luglio 2009, 0:45
Desktop: KDE4
Distribuzione: kubuntu-14.04-LTS-x86_amd64
Località: Arpino

Re: python - info checksum()

Messaggio da socket-raw »

qualcosa non mi torna.....

se fa quello che serve ad avere un checksum corretto, perchè lo restituisce errato che fà scartare il pacchetto??? :muro: :muro: :muro:
LIVE AND LET LIVE
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: python - info checksum()

Messaggio da Claudio_F »

La funzione fa quello che ha detto, ma non è detto che questo serva ad ottenere il chk giusto. Ad esempio il codice C di quella FAQ è totalmente cannato, sia nella sintassi che nella logica.

Seguendo le spiegazioni dei conticini a mano questa versione da un valore corrispondente ai risultati (che nel testo non hanno i bit invertiti):

Codice: Seleziona tutto

#include <stdio.h>
//--------------------------------------------------------------------
long chk(unsigned char addr[], int count){
    register long sum = 0;
    while (count > 1){
        sum += (unsigned short)*addr++ << 8;
        sum += (unsigned short)*addr++;
        count -= 2;
    }
    if (count > 0)
        sum += (unsigned short)*addr << 8;
    while (sum >> 16)
        sum = (sum & 0xffff) + (sum >> 16);
    return ~sum & 0xffff;
}
//--------------------------------------------------------------------
void main(void){
    unsigned char arr[8]  = {0x00, 0x01, 0xf2, 0x03,
                             0xf4, 0xf5, 0xf6, 0xf7};      // 220d

    printf("%lx\n", chk(arr, 8));
}
//--------------------------------------------------------------------
// http://forum.ubuntu-it.org/viewtopic.php?f=33&t=610606
// http://www.faqs.org/rfcs/rfc1071.html

In base a questa la versione di spider-net ha solo un piccolo errore:

Codice: Seleziona tutto

def ichecksum(data, sum_=0):
    for i in range(0, len(data), 2):
        if i + 1 >= len(data):
            sum_ += ord(data[i]) << 8  # <--- qui
        else:
            sum_ += (ord(data[i]) << 8) + ord(data[i+1])
    while sum_ >> 16:
        sum_ = (sum_ & 0xFFFF) + (sum_ >> 16)
    return ~sum_ & 0xFFFF
//--------------------------------------------------------------------
data = "\xa7\x7d\x22\xb8\x00\x15\x6f\x93\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21"
data2 = "\xa7\x7d\x22\xb8\x00\x15\x6f\x93\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21\xf5\x84"
print("%x"% ichecksum(data));
print("%x"% ichecksum(data2));
Il chk ottenuto con i dati:

Codice: Seleziona tutto

a7 7d 22 b8 00 15 6f 93 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21
risulta essere 84f5, che tra l'altro per controprova l'ho aggiunto in data2 (byte invertiti se len dati dispari e non invertiti se len dati pari) e il ricalcolo del chk da un confortante zero.

La funzione in sè non mi piace perché lavora con le stringhe di byte di Python2 ricavando i valori dei byte con ord (è totalmente incompatibile con Py3), sarebbe stata più generale se avesse accettato una sequenza di interi (lista, tupla, bytes, bytearray):

Codice: Seleziona tutto

def ichecksum(data):
    sum_ = 0
    for i in range(0, len(data), 2):
        sum_ += (data[i] << 8) + (data[i+1] if i+1 < len(data) else 0)
    while sum_ >> 16:
        sum_ = (sum_ & 0xFFFF) + (sum_ >> 16)
    return ~sum_ & 0xFFFF
Avatar utente
socket-raw
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 665
Iscrizione: giovedì 9 luglio 2009, 0:45
Desktop: KDE4
Distribuzione: kubuntu-14.04-LTS-x86_amd64
Località: Arpino

Re: python - info checksum()

Messaggio da socket-raw »

ok Claudio_F, grazie per la risposta,
ho provato la tua funzione, con python2 ,3 e 3.4 ma l'errore è lo stesso:

Codice: Seleziona tutto

 File "chk.py", line 22, in ichecksum
    sum_ += (data[i] << 8) + (data[i+1] if i+1 < len(data) else 0)
TypeError: unsupported operand type(s) for <<: 'str' and 'int'
devo passargli una sequenza di interi (lista, tupla, bytes, bytearray) da te indicata??
LIVE AND LET LIVE
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: python - info checksum()

Messaggio da Claudio_F »

socket-raw ha scritto:devo passargli una sequenza di interi (lista, tupla, bytes, bytearray) da te indicata??
Immagino avrai già provato... l'ultima funzione (compatibile Py2/Py3) accetta solo una sequenza di interi (nel range 0..255), quella precedente (solo per Py2) una stringa di byte (quindi non una stringa di caratteri unicode). Entrambe producono lo stesso risultato.

L'errore che mostri è ovviamente dovuto al fatto che stai passando una stringa all'ultima funzione.
Avatar utente
socket-raw
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 665
Iscrizione: giovedì 9 luglio 2009, 0:45
Desktop: KDE4
Distribuzione: kubuntu-14.04-LTS-x86_amd64
Località: Arpino

Re: python - info checksum()

Messaggio da socket-raw »

Ciao Claudio,
non capisco una cosa, nel tuo intervento precedente:
Il chk ottenuto con i dati:

a7 7d 22 b8 00 15 6f 93 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21

risulta essere 84f5, che tra l'altro per controprova l'ho aggiunto in data2 (byte invertiti se len dati dispari e non invertiti se len dati pari) e il ricalcolo del chk da un confortante zero.
dici che il chksum 84f5 è giusto per la stringa di byte usata, ma la stringa è quella da me indicata ed il checksum corretto è 0x6f93 ( 28563) non quello da te ottenuto......

Ancora non capisco dove sbaglio :?

Grazie
LIVE AND LET LIVE
Avatar utente
socket-raw
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 665
Iscrizione: giovedì 9 luglio 2009, 0:45
Desktop: KDE4
Distribuzione: kubuntu-14.04-LTS-x86_amd64
Località: Arpino

Re: python - info checksum()

Messaggio da socket-raw »

Mi stò perdendo.... Ricapitolo :D
se prendo questo pacchetto UDP:

Codice: Seleziona tutto

0000   00 21 96 6c d3 14 08 62 66 51 18 3d 08 00 45 00
0010   00 29 a0 4d 40 00 40 11 15 a6 c0 a8 01 82 c0 a8
0020   01 fe a1 91 22 b8 00 15 75 7d 48 65 6c 6c 6f 2c
0030   20 57 6f 72 6c 64 21
devo estrarre la stringa di byte per il Pseudo Header, che è composto da: source_address,dest_address,placeholder,protocol,udp_length:

Codice: Seleziona tutto

"\xc0\xa8\x01\x82\xc0\xa8\x01\xfe\x00\x11\x00\x15"
la stringa di byte per loHeader UDP (gli ultimi 2 byte sono posti a zero, rapprentanti il campo checksum):

Codice: Seleziona tutto

"\xa1\x91\x22\xb8\x00\x15\x00\x00"

la stringa di byte dei dati:

Codice: Seleziona tutto

"\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21"
Calcolando il checksum sulla stringa di byte composta dalle 3 stringhe precedenti con la funzione di spider-net, il risultato è: 757d
ed effettuando i calcoli valorizzando le locazioni precedentemente poste a 0, il risulatato è 0.

adesso è corretto? o sbaglio qualcosa?

Grazie
LIVE AND LET LIVE
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti