Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C] CRC checksum van een IP packet *

Pagina: 1
Acties:
  • 626 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Weet iemand misschien een voorbeeld van een crc checksum dat je kan invoegen in een ip packet ? Momenteel heb ik al veel sites gevonden maar de indeling kwa programering is totaal anders in c.

bron : http://www.jbox.dk/sanos/source/utils/sh/ping.c.html
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
unsigned short checksum(unsigned short *buffer, int size) 
{ 
  unsigned long cksum = 0; 
 
  while (size > 1)
  { 
    cksum += *buffer++; 
    size -= sizeof(unsigned short); 
  } 
   
  if (size) cksum += *(unsigned char *) buffer; 
 
  cksum = (cksum >> 16) + (cksum & 0xffff); 
  cksum += (cksum >> 16); 
  return (unsigned short) (~cksum); 
}


Hier geeft die een totaal andere return value vergeleken met de onderste.

bron : http://www.webhostingtalk...82-re-rpcl_icmpdos-c.html
code:
1
2
3
4
5
6
7
8
unsigned short cksum(unsigned short *buf, int len){
register unsigned long sum;

for(sum = 0; len > 0; len--) sum += *buf++;
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
return ~sum;
}


Hier geeft resuleerd die alleen na ~sum

Bron : http://www.kernelthread.c...c/hanoimania/hanoi-icmp.c
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
in_cksum(unsigned short *addr, int len)
{
    int nleft = len;
    int sum = 0;
    unsigned short *w = addr;
    unsigned short answer = 0;

    while (nleft > 1) {
        sum += *w++;
        nleft -= 2;
    }

    if (nleft == 1) {
        *(unsigned char *)(&answer) = *(unsigned char *)w;
        sum += answer;
    }

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


En hier weer na answere ook is de aan roep van de checksum steeds anders in het packet.
van de struct iphdr of ip. Weet iemand wat wel een goeie checksum is of welke functies
te gebruiken als je bv een ping programma wil schrijven?

[ Voor 13% gewijzigd door Verwijderd op 13-08-2007 15:16 ]


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10 08:18
ten eerste:
zet je code eens tussen [code] tags.

Verder:
waarom wil je zelf een CRC check toevoegen? dit kan tcp/ip toch prima zelf doen?

This message was sent on 100% recyclable electrons.


Verwijderd

Topicstarter
Hoe bedoel je eigenlijk dat tcp/ip dat zelf kan?

Als je em met icmp->checksum = 0; Zet die em op steeds op nul. 0x000 als ik em check op de andere computer met wireshark. Terwijl de manual aangeeft dat het systeem de crc automatisch toe kent.

[ Voor 17% gewijzigd door Verwijderd op 13-08-2007 15:10 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Normaal gesproken ziet een CRC functie er zo uit:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
uint16_t crc16_update(uint16_t crc, uint8_t a)
{
    crc ^= a;
    for( int i = 0; i < 8; ++i )
    {
        if (crc & 1)
            crc = (crc >> 1) ^ POLYNOME;
        else
            crc = (crc >> 1);
    }

    return crc;
}


Waarbij de initial value, polynome en eventueel padding verschillen per CRC type.


Maar vertel eerst eens op welk platform je bezig bent en dat soort dingen want je bent ongelooflijk vaag met je vraagstelling.

[ Voor 15% gewijzigd door farlane op 13-08-2007 15:19 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Momenteel ben ik met suse linux bezig. En ben simpele netwerk applicaties aan het proberen te schrijven zoals een ping programma. Leek me gewoon leuk zelf zoiets te maken en in elkaar te programeren. Ben wel al zo ver dat die een echo request stuurd maar dat kwam vast te zitten bij het crc gedeelte. En hoe je het crc kan invoegen bij icmp->checksum;

ps. Wat is trouwens voor POLYNOME voor type eigenlijk interger/char, unsigned?.

[ Voor 14% gewijzigd door Verwijderd op 13-08-2007 17:37 ]


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Waarom denk je trouwens dat de drie voorbeeld programma's andere resultaten geven? Want wat betreft resultaat zijn ze alle drie hetzelfde...

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
OK, hier http://www.freesoft.org/CIE/RFC/792/2.htm wordt uitgelegd hoe de checksum berekend word van een ICMP header.

Let wel dat een checksum niet hetzelfde is als een CRC. Een checksum is gebaseerd op een optelling terwijl een CRC gebaseerd is op een deling. ( Alhoewel checksum ook wel gebruikt wordt als algemene term voor een dergelijk controlegetal, er geld dan nog wel dat een CRC een checksum is maar niet perse andersom )

Zie hier http://www.cs.waikato.ac.nz/~312/crc.txt voor een hele goede uitleg van wat een CRC eigenlijk is en waarom het zo veel wordt gebruikt.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 10:45
Als je een ping wilt versturen moet je een CRC uitvoeren over het hele ip bericht, minus de preamble maar daar heb je niets mee van doen dacht ik zo). Binnen je ICMP bericht (je ping dus) moet je ook een checksum uitrekenen. Daarnaast heb je ook nog een checksum voor je IP header :) Dus je moet flink wat checken
Ik heb zelf afgelopen tijd een ethernet zender/ontvanger gemaakt (met klasgenoten) met een FPGA (de hardware) en een ARM processor. Daarin stond ook de C code voor CRC. Zal eens kijken of ik die kan opsnorren

Exploring the world by bicycle! cyclingsilk.wordpress.com


Verwijderd

Topicstarter
Sweet! Zijn er trouwens nog alternatieven voor als je een simpel request wil sturen zonder SOCK_ROW?

Thx a lot btw!

[ Voor 73% gewijzigd door Verwijderd op 13-08-2007 23:03 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
IJnte schreef op maandag 13 augustus 2007 @ 22:49:
Als je een ping wilt versturen moet je een CRC uitvoeren over het hele ip bericht, minus de preamble maar daar heb je niets mee van doen dacht ik zo).
Volgens mij zitten we op IP en niet op ethernet niveau te pielen.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
"Volgens mij zitten we op IP en niet op ethernet niveau te pielen."

Jah klopt het is met ip.h en ip_icmp.h. Wel geinig trouwens want als je strace gebruit geeft die onder suse weer dat via tcp gaat enzo. Dacht eerder dat die via sendto ging.

[ Voor 38% gewijzigd door Verwijderd op 13-08-2007 23:17 ]


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 10:45
Verwijderd schreef op maandag 13 augustus 2007 @ 22:59:
Sweet! Maar als ik een checksum schrijf voor een 16bit icmp request moet ik dan ook nog terug koppelen na het ip pakket ? Want ik kon me herrineren dat je in de ip len he totale dus iphdr + icmphdr moest zijn toch?
16 bit ICMP :? Ik zou er gewoon 32 byte ICMP van maken (dat wordt in windows ook zo gebruikt).
Je moet eerst even bedenken wat een ICMP bericht natuurlijk is :) Een ICMP bericht is niets anders dan een IP pakket met in het protocol veld aangegeven dat je ICMP wilt gebruiken (0x01). Daarnaast moet je in de IP header de checksum berekenen over alleen de IP header. Vervolgens kan je in het option veld van IP je ICMP data kwijt. Daar moet vervolgens weer een ICMP header in waarin zich een checksum bevindt over de ICMP data + ICMP header. In die data kan je zetten wat je wilt, b.v. het alfabet.
Over alle data, dus destination MAC, Source MAC en je IP bericht met daarin ICMP data moet je je CRC over berekenen. Zoals al aangegeven is er een duidelijk verschil tussen CRC en een checksum. De checksum bij ethernet is een 16-bits resultaat van een optelling (met carry) van alle bytes waarover je de checksum berekend.
De CRC is bij ethernet (IEEE802.3) een 32-bits getal welke door een van alle bytes wordt berekend. De datastroom wordt gedeeld door het polynoom en daaruit rolt een getal welke de CRC is. het CRC polynoom is bij ethernet (IEEE802.3) vastgesteld op het getal 0x4c11db7. In hardware is de deling een XOR, en in een processor (tenslotte ook hardware) wordt het door een module 2 deling gegenereerd.
Als je op internet zoekt op "reflect" tesamen met "crcbitbybit" kom je wel een aardige hit tegen (stukie C code). Je kan op 2 manieren werken: of elke keer berekenen (veel processorkracht) of een CRC tabel maken van een groot aantal mogelijkheden.

Sccs er iig mee :)

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 10:45
farlane schreef op maandag 13 augustus 2007 @ 23:08:
[...]


Volgens mij zitten we op IP en niet op ethernet niveau te pielen.
Je moet niet aan iets beginnen als je de basis niet kent dacht ik zo |:( Als jij leuk de functie icmp("hoi") van internet plukt en je weet de achterliggende werking niet dan kun je net zogoed alles van internet plukken.
En trouwens we zitten echt niet alleen op IP niveau te "pielen" maar toch echt wel op ethernet niveau ;) MAC is tenslotte de datalink laag.

[ Voor 14% gewijzigd door IJnte op 13-08-2007 23:23 ]

Exploring the world by bicycle! cyclingsilk.wordpress.com


Verwijderd

Topicstarter
Exuses trouwens dat ik topic had verranderd.

In de topic dat farlane schreef van freesoft staat :

Header Checksum The 16 bit one's complement of the one's complement sum of all 16 bit words in the header. For computing the checksum, the checksum field should be zero. This checksum may be replaced in the future.

Maar komt helemaal goed heb nu al genoeg lees voer de komende weken thx for the support :D

  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 10:45
Verwijderd schreef op maandag 13 augustus 2007 @ 23:24:
Exuses trouwens dat ik topic had verranderd.

In de topic dat farlane schreef van freesoft staat :

Header Checksum The 16 bit one's complement of the one's complement sum of all 16 bit words in the header. For computing the checksum, the checksum field should be zero. This checksum may be replaced in the future.

Maar komt helemaal goed heb nu al genoeg lees voer de komende weken thx for the support :D
Sccs :)

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
IJnte schreef op maandag 13 augustus 2007 @ 23:20:
Je moet niet aan iets beginnen als je de basis niet kent dacht ik zo |:( Als jij leuk de functie icmp("hoi") van internet plukt en je weet de achterliggende werking niet dan kun je net zogoed alles van internet plukken.
Volgens jouw redenering mag ik geen IP berichten versturen als ik niet weet hoe het ethernet frame eruit ziet? bollox
En trouwens we zitten echt niet alleen op IP niveau te "pielen" maar toch echt wel op ethernet niveau ;) MAC is tenslotte de datalink laag.
De enige die het hier over de MAC laag heeft ben jij. De CRC waar jij het over hebt zit ook in de MAC laag. Die hoef je niet zelf te genereren. De 16 bits checksum in de IP header daarentegen wel.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • ATS
  • Registratie: September 2001
  • Laatst online: 28-11 20:56

ATS

farlane schreef op dinsdag 14 augustus 2007 @ 11:56:
Volgens jouw redenering mag ik geen IP berichten versturen als ik niet weet hoe het ethernet frame eruit ziet? bollox
Precies. Het hele idee van het lagen model is dat je je niet druk hoeft te maken over wat er op de laag onder je gebeurt. Deze laag biedt gewoon een paar services. Hoe die tot stand komen is verder niet zo relevant.

OK, dit geldt natuurlijk maar tot op zekere hoogte, maar voor de meeste praktische toepassingen werkt dat prima.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant

Pagina: 1