Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 36
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    30

    Programmazione C

    Ciao a tutti ho un disperato bisogno di aiuto...devo modificare alcuni file in C che analizzano file tcpdump (di cattura del traffico), ovvero analizzano tutto il pacchetto IP. La modifica che devo fare io consiste nel vedere se il valore corrente di alcuni campi del pacchetto tipo IP destinazione corrispondono ad un dato valore. Ovviamente si ha a che fare con strutture: come si confronta una struct con una sequenza di bit?ovvero ad esempio confrontare se l'IP dest del pacchetto coincide con un dato indirizzo??

    Grazie dell'attenzione!!!

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301

    Moderazione

    Ciao, usa titoli più significativi per le tue discussioni.

    Questo l'ho corretto io...
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    Le sequenze di bit si trattano con le funzioni mem***, per esempio potresti usare la memcmp, pucrhè tu sia in grado di rendere compatibile un campo di struct con una sequenza di bit.

    la memcmp ha questa sintassi:

    codice:
    #include <string.h>
    
    int * memcmp (const void * ptr1 , const void ptr2 *, size_t n_byte)

  4. #4

    Re: Programmazione C

    Originariamente inviato da danim79
    Ciao a tutti ho un disperato bisogno di aiuto...devo modificare alcuni file in C che analizzano file tcpdump (di cattura del traffico), ovvero analizzano tutto il pacchetto IP. La modifica che devo fare io consiste nel vedere se il valore corrente di alcuni campi del pacchetto tipo IP destinazione corrispondono ad un dato valore. Ovviamente si ha a che fare con strutture: come si confronta una struct con una sequenza di bit?ovvero ad esempio confrontare se l'IP dest del pacchetto coincide con un dato indirizzo??

    Grazie dell'attenzione!!!
    Cioè tu hai un asequenza di bit in cuio sai che ci sono le informazioni su indirizzi porte eccetera e vuoi accedervi?
    Beh allora se sai esattamente quanti byte occupa ognuna di queste info puoi scrivere una scruct e poi fare un cast.Mi speigo con un esempio semplice.

    Supponi di avere un buffer di memoria di 80 (32+ 32 + 8 + 8) bit che sai essere così composto: i primi 32 bit indirizzo di destinazione, i successivi 32 indirizzo sorgente, i possimi 8 bit porta destinazione,gli ultimi 8 porta sorgente. Allora definisci una struttura di questo tipo

    codice:
    typedef struct myheader
    {
      int destAddr;
      int sourceAddr;
      char destPort;
      char sourcePort;
    }MyHeader;
    Supposto che il buffer di memoria sia puntato dalla variabile puntatore a carattere char* buffer, (un puntatore a caratetre è un puntatore a byte, granularità massima), puoi castare il puntatore così:

    codice:
    MyHeader* myHeaderPtr = (MyHeader*)buffer
    ed accedere ai singoli campi della struttura normalmente.In altre parole ora se ti serve il valore di porta della sorgente non hai che da fare : myHeaderPtr->sourcePort per ottenerlo.

    Il tutto presuppone che tu sappia con esattezza la dimension in byte di ogni campo nella sequenza di bit e la dimnsione esatta di ogni tipo di dato sulla tua piattaforma, ma per quello c'è la sizeof.
    Spero di esserti stato utile,ciao
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    30
    Veramente la definizione di struttura del pacchetto e di tutti i suoi campi già ce l'ho:il programma dovrebbe vedere se il pacchetto corrente ha valori dei campi particolari, ad esempio se l'IP destinazione è 192.168.1.1 ed è un pacchetto TCP o IP... si dovrebbe fare una struttura switch-case in cui se la variabile ad es IP dest assume quel valore da un messaggio di uscita op se il campo protocol corrisponde a TCP ecc... Se definissi con define 192.168.1.1 in modo che se la variabile IPdest= a quel valore dà il messaggio??Ma come definisco quel valore in C?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Ma scusa ... se hai la struttura del pacchetto e dei campi (e hai anche il programma) non capisco quale sia la difficolta' ... Si trattera' di fare qualche if ...

    Mostra il codice in cui definisci la struttura e il codice in cui la variabile di quel tipo assume i valori che vuoi controllare ...

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    30
    Vi scrivo le definizioni di header IP e pacchetto:

    typedef struct _IPHdr
    {
    u_int8_t ip_verhl; /* version & header length */
    u_int8_t ip_tos; /* type of service */
    u_int16_t ip_len; /* datagram length */
    u_int16_t ip_id; /* identification */
    u_int16_t ip_off; /* fragment offset */
    u_int8_t ip_ttl; /* time to live field */
    u_int8_t ip_proto; /* datagram protocol */
    u_int16_t ip_csum; /* checksum */
    struct in_addr ip_src; /* source IP */
    struct in_addr ip_dst; /* dest IP */
    } IPHdr;




    typedef struct _Packet
    {
    struct pcap_pkthdr *pkth; /* BPF data */
    u_int8_t *pkt; /* base pointer to the raw packet data */

    Fddi_hdr *fddihdr; /* FDDI support headers */
    Fddi_llc_saps *fddisaps;
    Fddi_llc_sna *fddisna;
    Fddi_llc_iparp *fddiiparp;
    Fddi_llc_other *fddiother;

    Trh_hdr *trh; /* Token Ring support headers */
    Trh_llc *trhllc;
    Trh_mr *trhmr;

    SLLHdr *sllh; /* Linux cooked sockets header */

    PflogHdr *pfh; /* OpenBSD pflog interface header */

    EtherHdr *eh; /* standard TCP/IP/Ethernet/ARP headers */
    VlanTagHdr *vh;
    EthLlc *ehllc;
    EthLlcOther *ehllcother;

    WifiHdr *wifih; /* wireless LAN header */

    EtherARP *ah;

    EtherEapol *eplh; /* 802.1x EAPOL header */
    EAPHdr *eaph;
    u_int8_t *eaptype;
    EapolKey *eapolk;

    IPHdr *iph, *orig_iph; /* and orig. headers for ICMP_*_UNREACH family */
    u_int32_t ip_options_len;
    u_int8_t *ip_options_data;

    TCPHdr *tcph, *orig_tcph;
    u_int32_t tcp_options_len;
    u_int8_t *tcp_options_data;

    UDPHdr *udph, *orig_udph;
    ICMPHdr *icmph, *orig_icmph;

    echoext *ext; /* ICMP echo extension struct */

    u_int8_t *data; /* packet payload pointer */
    u_int16_t dsize; /* packet payload size */
    u_int16_t alt_dsize; /* the dsize of a packet before munging
    (used for log)*/

    u_int8_t frag_flag; /* flag to indicate a fragmented packet */
    u_int16_t frag_offset; /* fragment offset number */
    u_int8_t mf; /* more fragments flag */
    u_int8_t df; /* don't fragment flag */
    u_int8_t rf; /* IP reserved bit */

    u_int16_t sp; /* source port (TCP/UDP) */
    u_int16_t dp; /* dest port (TCP/UDP) */
    u_int16_t orig_sp; /* source port (TCP/UDP) of original datagram */
    u_int16_t orig_dp; /* dest port (TCP/UDP) of original datagram */
    u_int32_t caplen;

    u_int8_t uri_count; /* number of URIs in this packet */

    void *ssnptr; /* for tcp session tracking info... */
    void *cloned_ssnptr;
    void *ftrptr;
    void *flow; /* for flow info */
    void *streamptr; /* for tcp pkt dump */

    Options ip_options[40]; /* ip options decode structure */
    u_int32_t ip_option_count; /* number of options in this packet */
    u_char ip_lastopt_bad; /* flag to indicate that option decoding was
    halted due to a bad option */
    Options tcp_options[TCP_OPTLENMAX]; /* tcp options decode struct */
    u_int32_t tcp_option_count;
    u_char tcp_lastopt_bad; /* flag to indicate that option decoding was
    halted due to a bad option */

    u_int8_t csum_flags; /* checksum flags */
    u_int32_t packet_flags; /* special flags for the packet */
    int preprocessors; /* flags for preprocessors to check */
    } Packet;


    Quello che devo fare è confrontare il valore corrente nel pacchetto e verificare se il destIP corrisponde ad un dato IP e se è un pacchetto TCP op se ha quel destIP ed è un pck ICMP, lo stesso se è UDP in tal caso ci sarà una variabile "label" che assume valore "attack".

  8. #8
    Originariamente inviato da oregon
    Ma scusa ... se hai la struttura del pacchetto e dei campi (e hai anche il programma) non capisco quale sia la difficolta' ... Si trattera' di fare qualche if ...

    Mostra il codice in cui definisci la struttura e il codice in cui la variabile di quel tipo assume i valori che vuoi controllare ...
    A questo punto mi associo alle preplessità :master:
    Posta codice e spiegati meglio perchè se devi solo fare degli if e/o uno switch non mi sembr aquesto gran problema
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    30
    come allego il file?qui fa allegare solo immagini...ho provato a cambiare l'estansione ma nn va!

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Perche' allegare tutto il file ?

    A parte le strutture (che hai gia' inviato) puoi mostrare e commentare le poche linee vicine a dove ti serve il controllo ...

    Dovrebbe essere qualcosa del tipo

    codice:
    if(p.iph->ip_proto == IPPROTO_TCP &&
       p.iph->ip_dst.S_un.S_un_b.s_b1 == 192 &&
       p.iph->ip_dst.S_un.S_un_b.s_b2 == 168 &&	   
       p.iph->ip_dst.S_un.S_un_b.s_b3 == 1   &&	   
       p.iph->ip_dst.S_un.S_un_b.s_b4 == 2)
    ma potrebbe essere altro ...

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 © 2024 vBulletin Solutions, Inc. All rights reserved.