PDA

Visualizza la versione completa : [C] Socket raw a pacchetti in Linux


GreyFox86
07-06-2007, 11:39
Sto facendo degli esercizi con la programmazione dei socket in linux, e vorrei fare qualche prova anche con i socket PF_PACKET in modalità RAW, cioè dovendo costruire manualmente anche l'header ethernet del pacchetto.

Purtroppo in rete sono riuscito a trovare granché in proposito, quindi volevo chiedervi: una volta apertoil socket, come uso le primitive per inviare il frame ethernet? la sendto prende come parametri anche una struct sockaddr *to ed un int tolen, devo impostarli rispettivamente a NULL ed a 0 oppure devo fare in un altro modo?

socket(PF_PACKET, SOCK_RAW, 0)

Grazie

billiejoex
07-06-2007, 20:11
Cosa devi fare di preciso? Lavorare a layer ethernet non è conveniente a meno che tu non voglia espressamente farlo (es: hack applicato al protocollo ARP?).
Tramite socket_raw puoi lavorare a livelli superiori a ethernet (esempio IP) e delegare il compito di compilare tali trame interamente a socket_raw (cosa che ti risparmia sforzo, linee di codice e sopratutto conoscenza necessaria).
Su come programmare con raw_socket vi sono numerose guide su internet. Di italiano le uniche fonti che posso indicarti sono gli articoli, redatti prevalentemente da fusys, presenti su bfi:
http://bfi.freaknet.org/
...e qualche paper su mojodo (se non ricordo male vi è un articolo che tratta i socket_raw applicati ad ICMP):
http://www.mojodo.it/

Per tutto il resto:
www.google.it

Ovviamente, ripeto, prima di avventurarsi ci vogliono determinate skill.

GreyFox86
08-06-2007, 02:21
Sto facendo degli esperimenti a livello ethernet per inviare semplici pacchetti ARP, per questo non lavoro a livello più alto.
Grazie per i link, alcune questioni le ho chiarite, altre no.
Ora che ho fatto il mio programmino, come faccio a debuggarlo? Insomma, come faccio a vedere le trame che vengono inviate e soprattutto, sapere se sono ricevute?

billiejoex
08-06-2007, 09:00
Sto facendo degli esperimenti a livello ethernet per inviare semplici pacchetti ARP, per questo non lavoro a livello più alto.
In tal caso...

Grazie per i link, alcune questioni le ho chiarite, altre no.
Ora che ho fatto il mio programmino, come faccio a debuggarlo? Insomma, come faccio a vedere le trame che vengono inviate e soprattutto, sapere se sono ricevute?
Ti serve uno sniffer:
http://www.wireshark.org/
...da usare eventualmente anche sulla macchina destinatario.

GreyFox86
08-06-2007, 12:19
Ok i pacchetti escono, ed i mac della trama ethernet coincidono, solo che (sempre nell'header ethernet) il tipo di protocollo non viene specificato correttamente. anzichè essere ETH_P_ARP (0x0806) risuta essere 0x0608, in pratica come se non facessi la conversione htons. Ho una struttura per la trama ethernet con un campo

uint16_t eth_type;

che completo con:

eth.eth_type = htons(ETH_P_ARP);

Dove sbaglio?

GreyFox86
08-06-2007, 17:57
Accidenti che scemo c'era più sotto un'istruzione che avevo dimenticato di cancellare che lo sovrascriveva :rollo:

per il resto i pacchetti vengono inviati correttamente, solo che da qualche parte vengono invertiti all'interno dell'arp source eth con destination eth... ormai è solo questione di trovare dove sia questo errore :)

Grazie per l'aiuto :)

Loading