⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spo_unified.c

📁 著名的入侵检测系统snort的最新版本的源码
💻 C
📖 第 1 页 / 共 4 页
字号:
    {        if((unifiedData->data->current +            sizeof(UnifiedLog)+            unifiedData->logheader->pkth.caplen) >             unifiedData->data->limit)        {            UnifiedLogRotateFile(unifiedData->data);        }    }    else    {           if((unifiedData->data->current + sizeof(UnifiedLog) + sizeof(DataHeader)                     + unifiedData->logheader->pkth.caplen) > unifiedData->data->limit)            UnifiedRotateFile(unifiedData->data);    }    if(unifiedData->dHdr)    {        SafeMemcpy(write_pkt_buffer, unifiedData->dHdr, sizeof(DataHeader),                   write_pkt_buffer, write_pkt_buffer +                   sizeof(DataHeader) + sizeof(UnifiedLog) + IP_MAXPACKET);        offset = sizeof(DataHeader);        unifiedData->data->current += sizeof(DataHeader);    }    SafeMemcpy(write_pkt_buffer + offset, unifiedData->logheader,                 sizeof(UnifiedLog), write_pkt_buffer,                 write_pkt_buffer + sizeof(DataHeader) +                 sizeof(UnifiedLog) + IP_MAXPACKET);    offset += sizeof(UnifiedLog);    unifiedData->data->current += sizeof(UnifiedLog);    if(packet_data)    {        SafeMemcpy(write_pkt_buffer, packet_data,                offset + unifiedData->logheader->pkth.caplen,               write_pkt_buffer, write_pkt_buffer +                sizeof(DataHeader) + sizeof(UnifiedLog) + IP_MAXPACKET);        if(fwrite(write_pkt_buffer, offset + unifiedData->logheader->pkth.caplen,                  1, unifiedData->data->stream) != 1)            FatalError("SpoUnified: write failed: %s\n", strerror(errno));        unifiedData->data->current += unifiedData->logheader->pkth.caplen;    }    else     {        if(fwrite(write_pkt_buffer, offset,                  1, unifiedData->data->stream) != 1)            FatalError("SpoUnified: write failed: %s\n", strerror(errno));    }    /* after the first logged packet modify the event headers */    if(!unifiedData->once++)    {        unifiedData->logheader->event.sig_generator = GENERATOR_TAG;        unifiedData->logheader->event.sig_id = TAG_LOG_PKT;        unifiedData->logheader->event.sig_rev = 1;        unifiedData->logheader->event.classification = 0;        unifiedData->logheader->event.priority = unifiedData->event->priority;        /* Note that event_id is now incorrect.          * See OldUnifiedLogPacketAlert() for details. */    }    return 0;}/** * Log a set of packets stored in the stream reassembler * */void RealUnifiedLogStreamAlert(Packet *p, char *msg, void *arg, Event *event,        DataHeader *dHdr){    UnifiedLogStreamCallbackData unifiedData;    UnifiedLog logheader;    UnifiedConfig *data = (UnifiedConfig *)arg;    int once = 0;    /* setup the event header */    if(event != NULL)    {        logheader.event.sig_generator = event->sig_generator;        logheader.event.sig_id = event->sig_id;        logheader.event.sig_rev = event->sig_rev;        logheader.event.classification = event->classification;        logheader.event.priority = event->priority;        logheader.event.event_id = event->event_id;        logheader.event.event_reference = event->event_reference;        /* Note that ref_time is probably incorrect.           * See OldUnifiedLogPacketAlert() for details. */        logheader.event.ref_time.tv_sec = event->ref_time.tv_sec;        logheader.event.ref_time.tv_usec = event->ref_time.tv_usec;        DEBUG_WRAP(DebugMessage(DEBUG_LOG, "------------\n");        DebugMessage(DEBUG_LOG, "gen: %u\n", logheader.event.sig_generator);        DebugMessage(DEBUG_LOG, "sid: %u\n", logheader.event.sig_id);        DebugMessage(DEBUG_LOG, "rev: %u\n", logheader.event.sig_rev);        DebugMessage(DEBUG_LOG, "cls: %u\n", logheader.event.classification);        DebugMessage(DEBUG_LOG, "pri: %u\n", logheader.event.priority);        DebugMessage(DEBUG_LOG, "eid: %u\n", logheader.event.event_id);        DebugMessage(DEBUG_LOG, "erf: %u\n",                logheader.event.event_reference);        DebugMessage(DEBUG_LOG, "sec: %lu\n",                logheader.event.ref_time.tv_sec);        DebugMessage(DEBUG_LOG, "usc: %lu\n",                logheader.event.ref_time.tv_usec););    }    /* queue up the stream for logging */    if(p && stream_api)    {        unifiedData.logheader = &logheader;        unifiedData.data = data;        unifiedData.dHdr = dHdr;        unifiedData.event = event;        unifiedData.once = once;        stream_api->traverse_reassembled(p, UnifiedLogStreamCallback, &unifiedData);    }        fflush(data->stream);}/* * Function: UnifiedParseArgs(char *) * * Purpose: Process the preprocessor arguements from the rules file and  *          initialize the preprocessor's data struct.  This function doesn't *          have to exist if it makes sense to parse the args in the init  *          function. * * Arguments: args => argument list * * Returns: void function * */UnifiedConfig *UnifiedParseArgs(char *args, char *default_filename){    UnifiedConfig *tmp;    int limit = 0;    tmp = (UnifiedConfig *)calloc(sizeof(UnifiedConfig), sizeof(char));    if(tmp == NULL)    {        FatalError("Unable to allocate Unified Data struct!\n");    }    /* This is so the if 'nostamps' option is used on the command line,     * it will be honored by unified, and only one variable is used. */    tmp->nostamp = pv.nostamp;    DEBUG_WRAP(DebugMessage(DEBUG_PLUGIN, "Args: %s\n", args););    if(args != NULL)    {        char **toks;        int num_toks;        int i = 0;        toks = mSplit(args, ",", 31, &num_toks, '\\');        for(i = 0; i < num_toks; ++i)        {            char **stoks;            int num_stoks;            char *index = toks[i];            while(isspace((int)*index))                ++index;                      stoks = mSplit(index, " ", 2, &num_stoks, 0);                        if(strcasecmp("filename", stoks[0]) == 0)            {                if(num_stoks > 1 && tmp->filename == NULL)                    tmp->filename = strdup(stoks[1]);                else                    LogMessage("Argument Error in %s(%i): %s\n",                            file_name, file_line, index);            }            else if(strcasecmp("limit", stoks[0]) == 0)            {                if(num_stoks > 1 && limit == 0)                {                    limit = atoi(stoks[1]);                }                else                {                    LogMessage("Argument Error in %s(%i): %s\n",                            file_name, file_line, index);                }            }            else if(strcasecmp("nostamp", stoks[0]) == 0)            {                   tmp->nostamp = 1;            }            else            {                LogMessage("Argument Error in %s(%i): %s\n",                        file_name, file_line, index);            }                        mSplitFree(&stoks, num_stoks);        }        mSplitFree(&toks, num_toks);    }    if(tmp->filename == NULL)        tmp->filename = strdup(default_filename);        //LogMessage("limit == %i\n", limit);    if(limit <= 0)    {        limit = 128;    }    if(limit > 512)    {        LogMessage("spo_unified %s(%d)=> Lowering limit of %iMB to 512MB\n", file_name, file_line, limit);        limit = 512;    }    /* convert the limit to "MB" */    tmp->limit = limit << 20;    return tmp;}/* * Function: UnifiedCleanExitFunc() * * Purpose: Cleanup at exit time * * Arguments: signal => signal that caused this event *            arg => data ptr to reference this plugin's data * * Returns: void function */static void UnifiedCleanExit(int signal, void *arg){    /* cast the arg pointer to the proper type */    UnifiedConfig *data = (UnifiedConfig *)arg;    DEBUG_WRAP(DebugMessage(DEBUG_FLOW, "SpoUnified: CleanExit\n"););    fclose(data->stream);    /* free up initialized memory */    free(data->filename);    free(data);}/* * Function: Restart() * * Purpose: For restarts (SIGHUP usually) clean up structs that need it * * Arguments: signal => signal that caused this event *            arg => data ptr to reference this plugin's data * * Returns: void function */static void UnifiedRestart(int signal, void *arg){    UnifiedConfig *data = (UnifiedConfig *)arg;    DEBUG_WRAP(DebugMessage(DEBUG_FLOW, "SpoUnified: Restart\n"););    fclose(data->stream);    free(data->filename);    free(data);}/* Unified Alert functions (deprecated) */void UnifiedAlertInit(char *args){    UnifiedConfig *data;    DEBUG_WRAP(DebugMessage(DEBUG_INIT, "Output: Unified Alert Initialized\n"););    pv.alert_plugin_active = 1;    /* parse the argument list from the rules file */    data = UnifiedParseArgs(args, "snort-unified.alert");    UnifiedInitAlertFile(data);    //LogMessage("UnifiedAlertFilename = %s\n", data->filename);    /* Set the preprocessor function into the function list */    AddFuncToOutputList(OldUnifiedLogAlert, NT_OUTPUT_ALERT, data);    AddFuncToCleanExitList(UnifiedCleanExit, data);    AddFuncToRestartList(UnifiedRestart, data);}/* * Function: UnifiedInitAlertFile() * * Purpose: Initialize the unified log alert file * * Arguments: data => pointer to the plugin's reference data struct  * * Returns: void function */void UnifiedInitAlertFile(UnifiedConfig *data){    time_t curr_time;      /* place to stick the clock data */    char logdir[STD_BUF];    int value;    UnifiedAlertFileHeader hdr;    bzero(logdir, STD_BUF);    curr_time = time(NULL);    if(data->nostamp)     {        if(data->filename[0] == '/')            value = SnortSnprintf(logdir, STD_BUF, "%s", data->filename,                               (u_int32_t)curr_time);        else            value = SnortSnprintf(logdir, STD_BUF, "%s/%s", pv.log_dir,                               data->filename, (u_int32_t)curr_time);    }    else    {        if(data->filename[0] == '/')            value = SnortSnprintf(logdir, STD_BUF, "%s.%lu", data->filename,                                   (u_int32_t)curr_time);        else            value = SnortSnprintf(logdir, STD_BUF, "%s/%s.%lu", pv.log_dir,                                   data->filename, (u_int32_t)curr_time);    }    if(value != SNORT_SNPRINTF_SUCCESS)    {        FatalError("unified log file logging path and file name are "                   "too long, aborting!\n");    }    DEBUG_WRAP(DebugMessage(DEBUG_LOG, "Opening %s\n", logdir););    if((data->stream = fopen(logdir, "wb+")) == NULL)    {        FatalError("UnifiedInitAlertFile(%s): %s\n", logdir, strerror(errno));    }    hdr.magic = ALERT_MAGIC;    hdr.version_major = 1;    hdr.version_minor = 81;    hdr.timezone = thiszone;    if(fwrite((char *)&hdr, sizeof(hdr), 1, data->stream) != 1)    {        FatalError("UnifiedAlertInit(): %s\n", strerror(errno));    }            fflush(data->stream);    return;}void OldUnifiedLogAlert(Packet *p, char *msg, void *arg, Event *event){    RealUnifiedLogAlert(p, msg, arg, event, NULL);}void UnifiedAlertRotateFile(UnifiedConfig *data){    fclose(data->stream);    data->current = 0;    UnifiedInitAlertFile(data);}/* Unified Packet Log functions (deprecated) */void UnifiedLogInit(char *args){    UnifiedConfig *UnifiedInfo;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -