Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    RAW socket win 32

    Sto tentando disperatamente di programmare le raw socket sotto win ecco cosa ho fatto:
    codice:
    #include <stdio.h>
    #include <winsock2.h>
    
    #define PKT_LEN 8192	//lunghezza pacchetto
    
    #define IP_HDR_LEN sizeof(IP_HDR)
    #define TCP_HDR_LEN sizeof(TCP_HDR)
    
    
    
    int err;
    int control;
    
    typedef struct IP_HDR
    {
        unsigned int version; //Version and IP Header Length
        unsigned int ihl;
        unsigned char tos;
        unsigned short tot_len;
        unsigned short id;
        unsigned short frag_off; //Flags 3 bits and Fragment offset 13 bits
        unsigned char ttl;
        unsigned char protocol;
        unsigned short check;//checksum
        unsigned long saddr;//indirizzo ip mittente
        unsigned long daddr;//indirizzo ip destinatario
    //unsigned long Options_and_Padding;
    } IP_HDR;
    
    
    typedef struct TCP_HDR
    {
       unsigned short source; //porta sorgente da cui è partito il pacchetto TCP 
       unsigned short dest; //porta a cui è destinato il pacchetto 
       unsigned long seq; //numero di sequenza utilizzato per il servizio di trasporto affidabile dei dati che implementa il TCP 
       unsigned long ack_seq; //numero di riscontro usato anch'esso nel servizio di trasporto affidabile dei dati 
       unsigned short res1:4; //4 bit non utilizzati 
       unsigned short doff:4; //lunghezza dell' header TCP in parole di 32 bit, se non vengono inserite opzioni la lunghezza dell' intestazione è di 20 byte, quindi il valore da inserire è 5 
       unsigned short fin:1; //flag che viene utilizzato per chiudere una connessione 
       unsigned short syn:1; //flag che serve per stabilire una connessione 
       unsigned short rst:1; //flag che serve per resettare una connessione 
       unsigned short psh:1; //flag che specifica che i dati presenti nel pacchetto sono da passare immediatamente al programma 
       unsigned short ack:1; //flag che serve per stabilire una connessione 
       unsigned short urg:1; //flag che notifica la presenza di dati urgenti (non molto utilizzato) 
       unsigned short res2:2; //2 bit non utilizzati 
       unsigned short window; //finestra di ricezione che specifica quanti pacchetti possono essere ricevuti insieme (questo campo assume molta importanza nella "TCP reset vulnerability") 
       unsigned short check; //checksum per controllare la correttezza dei dati 
       unsigned short urg_ptr; //puntatore ai dati urgenti che il flag "urg" ha notificato
    } TCP_HDR;
           
      
    
    
        /* ceksum */
        unsigned short csum(unsigned short *buf, int nwords){	//funzione di checksum del pacchetto IP
    	unsigned long sum;
    	for(sum=0; nwords>0; nwords--)
    		sum += *buf++;
    	sum = (sum >> 16) + (sum &0xffff);
    	sum += (sum >> 16);
    	return ~sum;
    }
    
    /* start winsock */
    void StartWinsock()
    {
       
        WSADATA data; 
        WORD p = MAKEWORD(2,0);
        
           /* controllo che il socket venga inizializzato */
         if ((err = WSAStartup (p,&data)) != 0) 
            {
            printf("\n\t (warning)- Cannot initialize winsock \n"); 
            system("pause");
            }
    }
    
    int main(){
        
        SOCKET sd;
    	char buffer[PKT_LEN];
    	struct IP_HDR *ip = (struct IP_HDR*) buffer;
    	struct TCP_HDR *tcp = (struct TCP_HDR *) (buffer + IP_HDR_LEN);
    	struct sockaddr_in sin;
    	unsigned int one = 1;
    
    
    	memset(buffer, 0, PKT_LEN);
    	
    	StartWinsock();
    	
    	sd = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);
    	if (sd < 0){
    		perror("\n\t(warning)Errore socket()");
    		system("pause");
            }
    	
    	sin.sin_family = AF_INET;
    	sin.sin_port = htons(21);	//porta a cui connettersi (in questo caso 21) modificare per altra porta
    	sin.sin_addr.s_addr = inet_addr("127.0.0.1");	//indirizzo IP destinazione (in questo 127.0.0.1)  modificare per altro IP
    	
    	ip->ihl = 5;		//riempio la struttura IP
    	ip->version = 4;
    	ip->tos = 16;
    	ip->tot_len = IP_HDR_LEN + TCP_HDR_LEN;
    	ip->id = htons(52407);
    	ip->frag_off = 0;
    	ip->ttl = 64;
    	ip->protocol = 6;
    	ip->check = 0;		//per ora setto a 0 poi calcolerò quando conoscerò la dimensione del pacchetto TCP
    	ip->saddr = inet_addr("127.0.0.1");	//indirizzo IP destinazione (in questo 127.0.0.1)  modificare per altro IP
    	ip->daddr = inet_addr("127.0.0.1");	//indirizzo IP destinazione (in questo 127.0.0.1)  modificare per altro IP
    	
    	//riempio la struttura TCP 
    	tcp->source = htons(2485);	//porta sorgente (in questo caso 2485) modificare per altra porta
    	tcp->dest = htons(21);	//porta a cui connettersi (in questo caso 21) modificare per altra porta
    	tcp->seq = htonl(1);
    	tcp->ack_seq = 0;
    	tcp->doff = 5;
    	tcp->syn = 1;
    	tcp->ack = 0;
    	tcp->window = htons(32767);
    	tcp->check = 0;		//questo valore verrà inserito dal sistema operativo
    	tcp->urg_ptr = 0;
    
    	ip->check = csum((unsigned short *) buffer, IP_HDR_LEN + TCP_HDR_LEN);	//utilizzo funzione csum per calcolare il checksum
    	
    	if (setsockopt(sd, IPPROTO_IP, 2, (char *)&one, sizeof(one)) < 0)	//informo il sistema operativo che l'header del paccheto IP è già presente all'interno del datagram
    		perror("Errore setsockopt()");
    
        if (control = sendto(sd, buffer, ip->tot_len, MSG_OOB, (struct sockaddr *) &sin, sizeof(sin)) == SOCKET_ERROR)
        {
            control = WSAGetLastError();
    		printf("sendoto() failed, WSAGetLastError: %d\n", control);
        }
      
        
        closesocket(sd);
        err = WSACleanup();   
        system("pause");
    	return 0;
    }
    La compilazione è ok solo che mi da errore durante l' esecuzione della funzione sendto, ho catturato l' errore grazie a WSAGetLastError: WSAGetLastError: 10045
    che corrisponde a:
    WSAEOPNOTSUPP MSG_OOB was specified, but the socket is not stream style such as type SOCK_STREAM, out-of-band data is not supported in the communication domain associated with this socket, or the socket is unidirectional and supports only receive operations.

    se cambio il valore di MSG_OOB in MSG_DONTROUTE, mi da questo errore:

    WSAGetLastError: 10022

    Che corrisponde a:

    WSAEINVAL An unknown flag was specified, or MSG_OOB was specified for a socket with SO_OOBINLINE enabled.




    Se qualcuno mi puo'aiutare.....

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Io so che i socket raw non sono implementati su Windows, ma solo sui sistemi UNIX.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #3
    Anche io ne ero convinto ma poi ho lett che su xp e 2000 si possono programmare le raw, oltretutto non da errori durante la compilazione !!!

  4. #4
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    xp e 2000 supportano tranquillamente RAW SOCKET.

    Con XP sp2 però vengono introdotte delle fortissime limitazioni al suo uso:

    1-Non è possibile inviare alcun tipo di dato su un raw socket TCP
    2-Non è possibile inviare pacchetti con IP mittente falsificato (spoofed) su raw socket UDP. L'ip mittente deve quindi appartenere ad una interfaccia di rete del computer.
    Leggi il REGOLAMENTO!

    E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
    Drugo

  5. #5
    Finalmente qualcuno che mi inizia a chiarire le idee.... senti e come potrei ovviare a questo?? basta togliere l' sp2 ?? io uso win xp.


    Grazie mille

  6. #6
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    sinceramente non mi sembra il caso di togliere il sp2 per poter usare raw socket. Gli svantaggi sarebbero superiori ai vantaggi. Se poi ti interessa solo sperimentare e proteggi in altro modo la tua macchina, può essere una opzione non usare il sp2.

    In alternativa con sp2, non potendo fare affidamento alle funzioni della libreria tcpip, ti devi appoggiare a librerie esterne. Se vuoi imparare ad usare proprio i socket raw ovviamente non è la scelta indicata. Se il tuo scopo invece è solo manipolare i pacchetti da zero è una alternativa.
    Leggi il REGOLAMENTO!

    E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
    Drugo

  7. #7
    Ok prendero' questa come un opzione abbastanza valida, pero' se qualcuno magari ha altre idee si faccia avanti la speranza non muore mai

  8. #8
    Qualche mio consiglio, se può essere utile:
    * Un'alternativa alla raw socket API può essere libcap ma non avendola mai vista neanche in fotografia non so se ti migliora o incasina di più la vita. A quanto dice una persona (che tra l'altro bazzica anche su questo forum) con un'interfaccia ad alto livello a libcap vai liscio solo che tale persona mi pare programmi in delphi e non in C, per il quale non so se esista qualcosa di analogo.
    * Su bfi (http://bfi.s0ftpj.org/) trovi una quintalata di codici di esempio in cui si utilizza raw socket per manipolare i pacchetti nei modi più disparati (nello specifico cerca gli articoli scritti da fusys). La pecca è che tali articoli sono tutti precedenti all'introduzione di sp2.
    * Aggirare le limitazioni di sp2 è cmq possibile dato che nel porting di nmap lo hanno fatto. Ecco cosa l'autore dice a proposito:
    http://seclists.org/lists/nmap-hacke...-Sep/0003.html
    ...di cui cito:
    With SP2, Microsoft has crippled Windows in the following ways that
    affect Nmap:
    1. TCP packets may no longer be sent through the raw sockets API
    2. IP spoofed UDP packets may no longer be sent through raw sockets
    (affects decoy and spoofed scanning).
    3. Outbound TCP connection attempts are throttled to a slow rate.
    ...e ancora

    "Instead of sending raw IP packets, we move one layer down and send our
    raw IP packets in raw ethernet frames."
    Cosa questa frase voglia dire non l'ho ben capito. L'argomento interessa molto anche me. I sorgenti di nmap win sono cmq disponibili. Puoi sempre darci un'occhiata.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  9. #9
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    Network Programming for Microsoft Windows,, 2nd Edition ha un intero capitolo sull'argomento (l'undicesimo) e spiega come crearli, anche sui vecchi sistemi (95, 98, ...).

    E poi va nel dettaglio su come usarli utilizzando ICMPv4 e v6 come protocollo sottostante.

    Probabilmente trovi un po di cosine anche su msdn
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  10. #10
    Grazie appena arrivo a qualcosa di concreto posto.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.