[HELP] pacchietti attraverso socket

Collapse
X
 
  • Filter
  • Ora
  • Show
Clear All
new posts
  • Ribosio80
    Bodyweb Senior
    • Oct 2003
    • 8257
    • 226
    • 51
    • dalle nubi
    • Send PM

    [HELP] pacchietti attraverso socket

    Questa è una domanda bella tosta:
    c'è una funzione che mi permette di inviare un pakketto PERSONALIZZATO attraverso un socket? Indicatemi anche un manuale tipo unix: $man sendpacket .
    Io sarei particolarmente interessato ai pakketti ICMP.
    Cmq ho già studiato come sono strutturati i pakketti ecc quindi non mi serve una guida per questo ma solo quale è e come si usa la funzione per mandare pakketti creati all'interno del programma stesso.

    link molto interessante


    Dipende da quale sistema operativo vogliamo mandare i pacchetti.
    Sotto linux la faccenda è abbasatanza facile
    Sotto Win o usi winpcap , o ti riscrivi un driver da capo... lo so so lo

    Esisteva un programma molto interessante, l'ExploitGenerator, che riusciva a generare pacchetti da spedire completamente RAW sotto win95/98, ma non sotto NT/2000. Credo potrebbe essere un buon riferimento.

    consigli?
    Last edited by Ribosio80; 21-03-2005, 17:30:32.
  • Ribosio80
    Bodyweb Senior
    • Oct 2003
    • 8257
    • 226
    • 51
    • dalle nubi
    • Send PM

    #2
    cmq con winpcap il discorso è molto semplice:

    /* SoftWare created by DeathMaker 2005 */
    #include <stdio.h>
    #include <malloc.h>
    #include <packet32.h>
    #include <ntddndis.h>
    main() {
    LPADAPTER Eth=0;
    LPPACKET FormedPacket;
    u_char RawPacket[100];
    char *Adapters=(char *)malloc(1000);
    char Adapt[2][100],temp=0,temp2=0,temp3=0;
    ULONG Length=1000;
    PacketGetAdapterNames(Adapters,&Length);
    for (temp,temp2;temp3<2;temp++,temp2++) {
    Adapt[temp3][temp2]=Adapters[temp];
    if (Adapters[temp]=='\0') {
    temp3++;
    temp2=-1;
    }
    }
    free(Adapters);
    printf("%s\n%s",Adapt[0],Adapt[1]);
    Eth=PacketOpenAdapter(Adapt[1]);
    /* Qui si definisce RawPacket come meglio si crede ed è fatta */
    FormedPacket=PacketAllocatePacket();
    PacketInitPacket(FormedPacket,RawPacket,100);
    PacketSendPacket(Eth,FormedPacket,TRUE);
    }

    Io ho preferito per scelta usare direttamente le funzioni di packet.dll piuttosto che usare pcap...mi sembrava di avere + controllo

    Commenta

    • Ribosio80
      Bodyweb Senior
      • Oct 2003
      • 8257
      • 226
      • 51
      • dalle nubi
      • Send PM

      #3
      è molto semplice con packet.dll, purtroppo come libreria è stata studiata più per sniffare che per forgiare pacchetti raw, infatti ha una grossa rogna: non hai un kernel che completi il pacchetto da trasmettere!

      Nel senso che, se avessi voluto forgiare un pacchetto TCP sotto linux, avrei potuto fare a meno di scrivere la parte IP e quelle inferiori, ci avrebbe pensato il kernel.

      Con la send di winpcap (o packet32) devo scrivere tutti i layer. Se mi dovessi trovare su una rete locale (ah, winpcap non funziona col PPP), per madare il pacchetto devo fare a mano anche la parte del protocollo ARP.

      Questo non avviene in linux dove il kernel completa comodamente i pezzi mancanti.

      Commenta

      • Sergio
        Administrator
        • May 1999
        • 88029
        • 2,166
        • 2,777
        • United States [US]
        • Florida
        • Send PM

        #4
        Originariamente Scritto da Ribosio80
        cmq con winpcap il discorso è molto semplice:

        /* SoftWare created by DeathMaker 2005 */
        #include <stdio.h>
        #include <malloc.h>
        #include <packet32.h>
        #include <ntddndis.h>
        main() {
        LPADAPTER Eth=0;
        LPPACKET FormedPacket;
        u_char RawPacket[100];
        char *Adapters=(char *)malloc(1000);
        char Adapt[2][100],temp=0,temp2=0,temp3=0;
        ULONG Length=1000;
        PacketGetAdapterNames(Adapters,&Length);
        for (temp,temp2;temp3<2;temp++,temp2++) {
        Adapt[temp3][temp2]=Adapters[temp];
        if (Adapters[temp]=='\0') {
        temp3++;
        temp2=-1;
        }
        }
        free(Adapters);
        printf("%s\n%s",Adapt[0],Adapt[1]);
        Eth=PacketOpenAdapter(Adapt[1]);
        /* Qui si definisce RawPacket come meglio si crede ed è fatta */
        FormedPacket=PacketAllocatePacket();
        PacketInitPacket(FormedPacket,RawPacket,100);
        PacketSendPacket(Eth,FormedPacket,TRUE);
        }

        Io ho preferito per scelta usare direttamente le funzioni di packet.dll piuttosto che usare pcap...mi sembrava di avere + controllo
        Ribo, perchè se TU hai scelto di.... la in alto c'è scritto "SoftWare created by DeathMaker 2005" ?



        Commenta

        • Ribosio80
          Bodyweb Senior
          • Oct 2003
          • 8257
          • 226
          • 51
          • dalle nubi
          • Send PM

          #5
          il fatto di farsi tutto il pakketto non mi pesa molto...il fatto dell'ARP e del PPP è noiosetto...un'altra libreria win che funzioni anche con il PPP la conoscete?

          ps.x windows è necessario ricorrere ad un driver dato che la microzoz ha disabilitato i raw socket da tempo...

          Commenta

          • Ribosio80
            Bodyweb Senior
            • Oct 2003
            • 8257
            • 226
            • 51
            • dalle nubi
            • Send PM

            #6
            e il vecchio get send con i vari define-c-struct che gli servono?

            int get_send_packet (dsi_socket_t *socket, int *packet)

            Codice: static inline int
            get_send_packet(dsi_socket_t * socket, int * packet)
            {
            dsi_sync_msg_t msg;
            dsi_packet_t * p = &socket->packets[socket->next_packet];

            ribo devi studiare di piu è?

            Commenta

            • Ribosio80
              Bodyweb Senior
              • Oct 2003
              • 8257
              • 226
              • 51
              • dalle nubi
              • Send PM

              #7
              Originariamente Scritto da Sergio
              Ribo, perchè se TU hai scelto di.... la in alto c'è scritto "SoftWare created by DeathMaker 2005" ?

              e mica l'ho fatto io

              Commenta

              • Ribosio80
                Bodyweb Senior
                • Oct 2003
                • 8257
                • 226
                • 51
                • dalle nubi
                • Send PM

                #8
                Originariamente Scritto da Ribosio80
                e il vecchio get send con i vari define-c-struct che gli servono?

                int get_send_packet (dsi_socket_t *socket, int *packet)

                Codice: static inline int
                get_send_packet(dsi_socket_t * socket, int * packet)
                {
                dsi_sync_msg_t msg;
                dsi_packet_t * p = &socket->packets[socket->next_packet];

                ribo devi studiare di piu è?

                si sono io DeathMaker 2005......mica potevo scrivere "SoftWare created by ribosio80"

                x ribosio80 : ma hai letto il mio messaggio......?

                Commenta

                • Ribosio80
                  Bodyweb Senior
                  • Oct 2003
                  • 8257
                  • 226
                  • 51
                  • dalle nubi
                  • Send PM

                  #9
                  scusate sdoppiamento di personalità mi accade spesso.....sono in cura

                  Commenta

                  • Ribosio80
                    Bodyweb Senior
                    • Oct 2003
                    • 8257
                    • 226
                    • 51
                    • dalle nubi
                    • Send PM

                    #10
                    Originariamente Scritto da Ribosio80
                    il fatto di farsi tutto il pakketto non mi pesa molto...il fatto dell'ARP e del PPP è noiosetto...un'altra libreria win che funzioni anche con il PPP la conoscete?

                    Commenta

                    • zuperman
                      Zuper Hero
                      • May 2003
                      • 17204
                      • 364
                      • 274
                      • Burundi/usr/bin
                      • Send PM

                      #11
                      Riparto dalle basi... spero che qualcosa sia utile anche a te.

                      Berkeley's sockets

                      Un socket, punto terminale della comunicazione, è in realtà l'astrazione di due differenti punti terminali: uno per le trasmissioni connection oriented (protocollo TCP); uno per le trasmissioni connection less (protocollo UDP).

                      Ovviamente a differenti metodi di trasmissione corrispondono differenti modi di funzionamento del socket stesso. Se le API sono astratte dal protocollo, la specializzazione per il protocollo (leggi: scrittura di nuove API basate su quelle disponibili) è a carico del programmatore. Ad una maggiore flessibilità, grazie alla astrazione, corrisponde un maggior carico di lavoro per il programmatore. Questo non è sempre negativo, dipende da cosa si desidera fare.

                      I moderni linguaggi di programmazione ad oggetti, senza dubbio molto semplici da essere usati, hanno unapproccio totalmente differente alla programmazione di rete. Nella OOP (leggi Java) i socket, se possiamo ancora chiamarli così, sono sottoposti ad una specializzazione estrema ed è esattamente il contrario di quanto avviene nelle classiche Berkeley's sockets. Due approcci differenti a seconda del tipo di linguaggio utilizzato e purtroppo sono così differenti che non si può fare a meno di trattare entrambi.

                      Di certo per un programmatore pensare ai “socket TCP” come ai telefoni gli semplifica non poco la vita, qualcosa si simile si può dire per i “socket UDP”, dove il modello del sistema postale è quanto di meglio si avvicina alla loro realtà. Fare corrispondere ai nomi delle funzioni, che il programmatore userà, gesti della sua vita quotidiana, soprattutto per i principianti è una bella semplificazione mentre per i professionisti significa avere un codice leggibile e che si commenta da solo, il che non è affatto male.

                      Cosa è un socket nella realtà fisica è molto semplice da dirsi: è un buffer di memoria a cui è associato uno stato. Mentre l'interfaccia di rete è accessibile solo dal sistema operativo, la memoria del socket è accessibile anche dal software applicativo e questo significa che viene allocata nella memoria utente. La preparazione di un socket è a carico del sistema operativo che registra in sue tabelle sia l'identificativo del socket che del programma che lo ha aperto. Possono esserci più programmi con più socket aperti, se sulla macchina sono presenti più interfacce di rete (leggi:indirizzi IP) il programma può scegliere anche quale/i interfaccia/e associare il suo socket.

                      Il “numero di porta”, ma si tratta di una cattiva italianizzazione di “port number” poiché in inglese “port” significa “Porto” e non porta (door), alla buona e per ora identifica il programma che ha aperto il socket.

                      Quando arriva un pacchetto dati su una interfaccia di rete il sistema operativo lo rileva e controlla a chi è destinato destinato; se c'è un socket con il numero di porta indicato nel pacchetto ed il socket usa lo stesso protocollo del pacchetto, il sistema operativo copia i dati nel buffer dell'utente e ne aggiorna lo stato. Concettualmente semplice, trova complicazioni inverosimili se il protocollo è TCP. Tra il porre i dati del buffer e chiedere al sistema operativo di spedirli sono presenti sofisiticati meccanismi che sono nascosti all'utente, questo è proprio quello che l'incapsulamento e la stratificazione del software di rete (stack) impone. Volendo fare di testa propria è possibile avere accesso direttamente al socket in modalità RAW per preparare pacchetti completamente personalizzati, ovviamente non tutti i software possono agire in questo modo ed occorrono dei privilegi. Così si spiegano programmi quali che sono gli sniffer o altre amenità simili che procurano solo problemi, se si riesce ad aggirare lo stack di rete possiamo agire anche sulle intestazioni che accompagnano i dati e che di norma sono a carico del sistema operativo.


                      ... continua...
                      http://www.khet.net/libreria/networking/linux/berkeley/html/BerkeleySocket.php
                      Allenamento e dieta fanno di te un atleta

                      Commenta

                      Working...
                      X