Beispiel #1
0
int CaptDisMain(int argc, char *argv[])
{
    char errbuf[PCAP_ERRBUF_SIZE];
    char infile[PCAP_PATH_DIM], dirpath[PCAP_PATH_DIM];
    char **list;
    char *pcap_file;
    int i, num;
    pcap_t *cap = NULL;
    int ret;
    DIR *dir;
    struct dirent *entry;
    struct cap_ref ref;
    FILE *fp;
    struct snoop_file_header snooph;
    static bool tresp;

    /* pcapfile  protocol id */
    pcap_prot_id = ProtId("pcapf");
    if (pcap_prot_id == -1) {
        printf("It is necessary to load (from config file) the dissector pcapf\n");
        return -1;
    }
    
    /* serial number of packet */
    pkt_serial = 1;

    /* pcap file/dir name */
    infile[0] = '\0';
    dirpath[0] = '\0';
    tresp = FALSE;
    ret = PcapParam(argc, argv, infile, dirpath, &tresp);
    if (ret != 0) {
        return -1;
    }
    /* ^C */
    ciao = FALSE;
    signal(SIGTERM, PcapCiao);
    signal(SIGINT, PcapCiao);
    
    list = NULL;
    num = 0;
    if (dirpath[0] != '\0') {
        dir = opendir(dirpath);
        if (dir == NULL) {
            perror("");
            return -1;
        }
        /* file list */
        while((entry = readdir(dir)) != NULL) {
            if (entry->d_name[0] == '.')
                continue;
            list = xrealloc(list, sizeof(char *)*(num+1));
            list[num] = xmalloc(strlen(dirpath)+strlen(entry->d_name)+5);
            sprintf(list[num], "%s/%s", dirpath, entry->d_name);
            num++;
        }
        qsort(list, num, sizeof(char *), ListSort);
        closedir(dir);
        if (num == 0) {
            printf("Directory without pcap/snoop file\n");
            return -1;
        }
#if 0
        /* list debug */
        printf("Files list:\n");
        for (i=0; i!=num; i++) {
            printf(" %s\n", list[i]);
        }
#endif
        pcap_file = list[0];
    }
    else
        pcap_file = infile;

    i = 0;
    do {
        errbuf[sizeof(errbuf) - 1] = '\0';
        errbuf[0] = '\0';
        
        /* open the input pcap file */
        cap = pcap_open_offline(pcap_file, errbuf);
        if (cap != NULL) {
            /* file name */
            ref.file_name = pcap_file;
            strncpy(file_source, pcap_file, PCAP_PATH_DIM);
            /* data link type */
            ref.dlt = pcap_datalink(cap);
            /* packet counter */
            ref.cnt = 0;
            
            /* let pcap loop over the input, passing data to the decryptor */
            if (tresp)
                pcap_loop(cap, -1, (pcap_handler)&PcapDissectorTsec, (u_char*)&ref);
            else
                pcap_loop(cap, -1, (pcap_handler)&PcapDissector, (u_char*)&ref);

            pcap_close(cap);
        }
        else {
            /* try with snoop */
            fp = fopen(pcap_file, "r");
            if (fp != NULL) {
                if (fread(&snooph, 1, sizeof(snooph), fp) == sizeof(snooph)) {
                    if (strcmp(snooph.format_name, "snoop") != 0) {
                        fclose(fp);
                        fp = NULL;
                        LogPrintf(LV_ERROR, "File %s: %s", pcap_file, errbuf);
                    }
                    else {
                        snooph.version = ntohl(snooph.version);
                        snooph.mac = ntohl(snooph.mac);
                        /* file name */
                        ref.file_name = pcap_file;
                        strncpy(file_source, pcap_file, PCAP_PATH_DIM);
                        /* data link type */
                        switch (snooph.mac) {
                        case 0x04: 
                            ref.dlt = DLT_EN10MB;
                            break;
                            
                        case 0x08:
                            ref.dlt = DLT_FDDI;
                            break;
                            
                        case 0x12:
                            ref.dlt = DLT_SUNATM;
                            break;
                        }
                        
                        /* packet counter */
                        ref.cnt = 0;

                        SnoopDissector(fp, &ref);
                        fclose(fp);
                        fp = NULL;
                    }
                }
                else {
                    fclose(fp);
                    fp = NULL;
                    LogPrintf(LV_ERROR, "File %s: %s", pcap_file, errbuf);
                }
            }
            else {
                 LogPrintf(LV_ERROR, "File %s: %s", pcap_file, errbuf);
            }
        }
        
        i++;
        if (i < num)
            pcap_file = list[i];
    } while (i<num && !ciao);

    return 0;
}
Beispiel #2
0
int CaptDisMain(int argc, char *argv[])
{
    char errbuf[PCAP_ERRBUF_SIZE];
    char dirpath[PCAP_PATH_DIM];
    char tmp[PCAP_PATH_DIM];
    char ifile[PCAP_PATH_DIM];
    char *pcap_file, *param;
    bool end, ses_id, pol_id;
    pcap_t *cap = NULL;
    int res;
    struct cap_ref ref;
    struct timespec to;
    FILE *fp;
    struct stat info_a, info_b;
    struct snoop_file_header snooph;
    char *filter_app;
    struct bpf_program filter;     /* The compiled filter */
    bool one;

    end = FALSE;
    ses_id = FALSE;
    pol_id = FALSE;
    pcap_file = NULL;
    filter_app = NULL;
    
    /* pol  protocol id */
    pol_prot_id = ProtId("pol");
    if (pol_prot_id == -1) {
        return -1;
    }
    
    /* serial number of packet */
    pkt_serial = 1;

    /* pol dir name */
    dirpath[0] = '\0';
    res = PolParam(argc, argv, dirpath, &filter_app);
    if (res != 0) {
        return -1;
    }

    /* check name dir */
    if (dirpath[0] == '\0') {
        return -1;
    }

    /* read pol info */
    sprintf(ifile, "%s/%s", dirpath, POL_INIT_SESSION_FILE);
    fp = fopen(ifile, "r");
    if (fp == NULL) {
        LogPrintf(LV_ERROR, "Pol info file (%s) not present!", ifile);

        return -1;
    }
    while (fgets(tmp, CFG_LINE_MAX_SIZE, fp) != NULL) {
        /* check if line is a comment */
        if (!CfgParIsComment(tmp)) {
            param = strstr(tmp, POL_SESSION_ID);
            if (param != NULL) {
                res = sscanf(param, POL_SESSION_ID"=%lu", &ref.ses_id);
                if (res == 1) {
                    ses_id = TRUE;
                }
            }
            param = strstr(tmp, POL_POL_ID);
            if (param != NULL) {
                res = sscanf(param, POL_POL_ID"=%lu", &ref.pol_id);
                if (res == 1) {
                    pol_id = TRUE;
                }
            }
        }
    }
    fclose(fp);
    remove(ifile);

    sprintf(file_status, "%s/../../tmp/%s", dirpath, POL_POL_STATUS);

    if (ses_id == FALSE || pol_id == FALSE) {
        LogPrintf(LV_ERROR, "Pol info file (%s) incomplete!", tmp);

        return -1;
    }
    
    /* pcap file decoding */
    do {
        /* pcap file name */
        do {
            pcap_file = PolFile(dirpath, &one);
            if (pcap_file == NULL) {
                /* timeout */
                to.tv_sec = 2;
                to.tv_nsec = 1;
                if (!end) {
                    /* wait new file */
                    while (nanosleep(&to, &to) != 0)
                        ;
                }
            }
            else {
                /* check if the file is the end file flag */
                if (strstr(pcap_file, POL_END_SESSION_FILE) != NULL) {
                    end = TRUE;
                    remove(pcap_file);
                    xfree(pcap_file);
                    pcap_file = PolFile(dirpath, &one);
                }
            }
        } while (pcap_file == NULL && end == FALSE);

        if (pcap_file != NULL) {
            /* wait file download completition */
            if (one) {
                do {
                    /* timeout */
                    to.tv_sec = 5;
                    to.tv_nsec = 1;
                    stat(pcap_file, &info_a);
                    nanosleep(&to, NULL);
                    stat(pcap_file, &info_b);
                } while (info_a.st_size != info_b.st_size);
            }

            errbuf[sizeof(errbuf) - 1] = '\0';
            errbuf[0] = '\0';
            
            /* open the input pcap file (or stdin) */
            cap = pcap_open_offline(pcap_file, errbuf);
            if (cap != NULL) {
                /* compile and apply the filter */
                if (filter_app != NULL) {
                    if (pcap_compile(cap, &filter, filter_app, 1, 0) < 0) {
                        printf("Bad filter %s\n", filter_app);
                        pcap_perror(cap, "Filter");
                        return -1;
                    }
                    
                    pcap_setfilter(cap, &filter);
                    pcap_freecode(&filter);
                }
                
                /* file name */
                ref.file_name = pcap_file;
                strncpy(file_source, pcap_file, PCAP_PATH_DIM);
                
                /* data link type */
                ref.dlt = pcap_datalink(cap);
                
                /* packet counter */
                ref.cnt = 0;
                
                /* let pcap loop over the input, passing data to the decryptor */
                pcap_loop(cap, -1, (pcap_handler)&PcapDissector, (u_char*)&ref);
                
                pcap_close(cap);
            }
            else {
                /* try with snoop */
                fp = fopen(pcap_file, "r");
                if (fp != NULL) {
                    if (fread(&snooph, 1, sizeof(snooph), fp) == sizeof(snooph)) {
                        if (strcmp(snooph.format_name, "snoop") != 0) {
                            fclose(fp);
                            fp = NULL;
                            LogPrintf(LV_ERROR, "File %s: %s", pcap_file, errbuf);
                        }
                        else {
                            snooph.version = ntohl(snooph.version);
                            snooph.mac = ntohl(snooph.mac);
                            /* file name */
                            ref.file_name = pcap_file;
                            strncpy(file_source, pcap_file, PCAP_PATH_DIM);
                            /* data link type */
                            switch (snooph.mac) {
                            case 0x04: 
                                ref.dlt = DLT_EN10MB;
                                break;
                                
                            case 0x08:
                                ref.dlt = DLT_FDDI;
                                break;
                                
                            case 0x12:
                                ref.dlt = DLT_SUNATM;
                                break;
                            }
                            
                            /* packet counter */
                            ref.cnt = 0;
                            
                            SnoopDissector(fp , &ref);
                            fclose(fp);
                            fp = NULL;
                        }
                    }
                    else {
                        fclose(fp);
                        fp = NULL;
                        LogPrintf(LV_ERROR, "File %s: %s", pcap_file, errbuf);
                    }
                }
                else {
                    LogPrintf(LV_ERROR, "File %s: %s", pcap_file, errbuf);
                }
            }
            /* remove file */
            remove(pcap_file);
            xfree(pcap_file);
        }
    } while (pcap_file);

    if (filter_app != NULL)
        xfree(filter_app);
    
    return 0;
}