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

📄 sp_icmp_type_check.c

📁 Linux snort-2.4.4源代码
💻 C
字号:
/*** Copyright (C) 1998-2002 Martin Roesch <roesch@sourcefire.com>**** This program is free software; you can redistribute it and/or modify** it under the terms of the GNU General Public License as published by** the Free Software Foundation; either version 2 of the License, or** (at your option) any later version.**** This program is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the** GNU General Public License for more details.**** You should have received a copy of the GNU General Public License** along with this program; if not, write to the Free Software** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.*//* $Id$ */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <stdlib.h>#include <string.h>#include <ctype.h>#include "rules.h"#include "decode.h"#include "plugbase.h"#include "parser.h"#include "debug.h"#include "util.h"#include "plugin_enum.h"#include "sp_icmp_type_check.h" void IcmpTypeCheckInit(char *, OptTreeNode *, int);void ParseIcmpType(char *, OptTreeNode *);int IcmpTypeCheck(Packet *, struct _OptTreeNode *, OptFpList *);/**************************************************************************** *  * Function: SetupIcmpTypeCheck() * * Purpose: Register the itype keyword and configuration function * * Arguments: None. * * Returns: void function * ****************************************************************************/void SetupIcmpTypeCheck(void){    /* map the keyword to an initialization/processing function */    RegisterPlugin("itype", IcmpTypeCheckInit);    DEBUG_WRAP(DebugMessage(DEBUG_PLUGIN,"Plugin: IcmpTypeCheck Initialized\n"););}/**************************************************************************** *  * Function: IcmpTypeCheckInit(char *, OptTreeNode *) * * Purpose: Initialize the rule data structs and parse the rule argument *          data, then link in the detection function * * Arguments: data => rule arguments/data *            otn => pointer to the current rule option list node * * Returns: void function * ****************************************************************************/void IcmpTypeCheckInit(char *data, OptTreeNode *otn, int protocol){    if(protocol != IPPROTO_ICMP)    {        FatalError("%s(%d): ICMP Options on non-ICMP rule\n", file_name, file_line);    }        /* multiple declaration check */     if(otn->ds_list[PLUGIN_ICMP_TYPE])    {        FatalError("%s(%d): Multiple ICMP type options in rule\n", file_name,                file_line);    }            /* allocate the data structure and attach it to the       rule's data struct list */    otn->ds_list[PLUGIN_ICMP_TYPE] = (IcmpTypeCheckData *)            SnortAlloc(sizeof(IcmpTypeCheckData));    /* this is where the keyword arguments are processed and placed into the        rule option's data structure */    ParseIcmpType(data, otn);    /* finally, attach the option's detection function to the rule's        detect function pointer list */    AddOptFuncToList(IcmpTypeCheck, otn);}/**************************************************************************** *  * Function: ParseIcmpType(char *, OptTreeNode *) * * Purpose: Process the itype argument and stick it in the data struct * * Arguments: data => argument data *            otn => pointer to the current rule's OTN * * Returns: void function * ****************************************************************************/void ParseIcmpType(char *data, OptTreeNode *otn){    char *type;    IcmpTypeCheckData *ds_ptr;  /* data struct pointer */    /* set the ds pointer to make it easier to reference the option's       particular data struct */    ds_ptr = otn->ds_list[PLUGIN_ICMP_TYPE];    /* set a pointer to the data so to leave the original unchanged */    type = data;    if(!data)    {        FatalError("%s (%d): No ICMP Type Specified : %s\n", file_name,                 file_line, type);    }        /* get rid of spaces before the data */    while(isspace((int)*data))        data++;    if(data[0] == '\0')    {        FatalError( "%s (%d): No ICMP Type Specified : %s\n", file_name,                file_line, type);    }    /*     * if a range is specified, put the min in icmp_type, and the max in      * icmp_type2     */    if (isdigit((int)*data) && strchr(data, '<') && strchr(data, '>'))    {        ds_ptr->icmp_type  = atoi(strtok(data, " <>"));        ds_ptr->icmp_type2 = atoi(strtok(NULL, " <>"));        ds_ptr->operator = ICMP_TYPE_TEST_RG;        /* all done */        return;    }    /* otherwise if its greater than... */    else if (*data == '>')    {        data++;        while(isspace((int)*data)) data++;        ds_ptr->icmp_type = atoi(data);        ds_ptr->operator = ICMP_TYPE_TEST_GT;    }    /* otherwise if its less than ... */    else if (*data == '<')    {        data++;        while(isspace((int)*data)) data++;        ds_ptr->icmp_type = atoi(data);        ds_ptr->operator  = ICMP_TYPE_TEST_LT;    }    /* otherwise check if its a digit */    else if (isdigit((int)*data))    {        ds_ptr->icmp_type = atoi(data);        ds_ptr->operator = ICMP_TYPE_TEST_EQ;    }    /* uh oh */    else     {        FatalError("%s (%d): Bad ICMP type: %s\n", file_name, file_line,                 type);    }    return;}/**************************************************************************** *  * Function: IcmpTypeCheck(char *, OptTreeNode *) * * Purpose: Test the packet's ICMP type field value against the option's *          ICMP type * * Arguments: data => argument data *            otn => pointer to the current rule's OTN * * Returns: void function * ****************************************************************************/int IcmpTypeCheck(Packet *p, struct _OptTreeNode *otn, OptFpList *fp_list){    IcmpTypeCheckData *ds_ptr;    int success = 0;    ds_ptr = otn->ds_list[PLUGIN_ICMP_TYPE];    /* return 0  if we don't have an icmp header */    if(!p->icmph)        return 0;    switch(ds_ptr->operator)    {        case ICMP_TYPE_TEST_EQ:            if (p->icmph->type == ds_ptr->icmp_type)                success = 1;            break;        case ICMP_TYPE_TEST_GT:            if (p->icmph->type > ds_ptr->icmp_type)                success = 1;            break;        case ICMP_TYPE_TEST_LT:            if (p->icmph->type < ds_ptr->icmp_type)                success = 1;            break;        case ICMP_TYPE_TEST_RG:            if (p->icmph->type > ds_ptr->icmp_type &&                     p->icmph->type < ds_ptr->icmp_type2)                success = 1;            break;    }    if (success)    {        DEBUG_WRAP(DebugMessage(DEBUG_PLUGIN, "Got icmp type match!\n"););        return fp_list->next->OptTestFunc(p, otn, fp_list->next);    }    /* return 0 on failed test */    DEBUG_WRAP(DebugMessage(DEBUG_PLUGIN, "Failed icmp code match!\n"););    return 0;}

⌨️ 快捷键说明

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