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

📄 dce2_config.c

📁 snort2.8.4版本
💻 C
📖 第 1 页 / 共 5 页
字号:
                break;            case DCE2_SC_STATE__OPT_END:                if (DCE2_IsConfigEndChar(c))                {                    return DCE2_RET__SUCCESS;                }                else if (DCE2_IsOptEndChar(c))                {                    state = DCE2_SC_STATE__OPT_START;                }                else if (!DCE2_IsSpaceChar(c))                {                    _dpd.logMsg("%s(%d) => %s: Invalid end of option.\n",                                *_dpd.config_file, *_dpd.config_line, DCE2_GNAME);                    return DCE2_RET__ERROR;                }                break;            default:                _dpd.logMsg("%s(%d) => %s: Invalid option state.\n", __FILE__, __LINE__, DCE2_GNAME);                return DCE2_RET__ERROR;        }        last_char = c;        ptr++;    }    return DCE2_RET__ERROR;}/******************************************************************** * Function: DCE2_ScParseOption() * * Parses the option and returns an option flag.  Checks to make * sure option is only configured once. * * Arguments: *  char * *      Pointer to the first character of the option name. *  char * *      Pointer to the byte after the last character of *      the option name. *  int *      Pointer to the current option mask.  Contains bits set *      for each option that has already been configured.  Mask *      is checked and updated for new option. * * Returns: *  DCE2_ScOptFlag *      Flag for the server option that is being configured. *      NULL flag if not a valid option or option has already *          been configured. * ********************************************************************/static INLINE DCE2_ScOptFlag DCE2_ScParseOption(char *opt_start, char *opt_end, int *opt_mask){    DCE2_ScOptFlag opt_flag = DCE2_SC_OPT_FLAG__NULL;    size_t opt_len = opt_end - opt_start;    if (opt_len == strlen(DCE2_SOPT__DEFAULT) &&        strncasecmp(DCE2_SOPT__DEFAULT, opt_start, opt_len) == 0)    {        opt_flag = DCE2_SC_OPT_FLAG__DEFAULT;    }    else if (opt_len == strlen(DCE2_SOPT__NET) &&             strncasecmp(DCE2_SOPT__NET, opt_start, opt_len) == 0)    {        opt_flag = DCE2_SC_OPT_FLAG__NET;    }    else if (opt_len == strlen(DCE2_SOPT__POLICY) &&             strncasecmp(DCE2_SOPT__POLICY, opt_start, opt_len) == 0)    {        opt_flag = DCE2_SC_OPT_FLAG__POLICY;    }    else if (opt_len == strlen(DCE2_SOPT__DETECT) &&             strncasecmp(DCE2_SOPT__DETECT, opt_start, opt_len) == 0)    {        opt_flag = DCE2_SC_OPT_FLAG__DETECT;    }    else if (opt_len == strlen(DCE2_SOPT__AUTODETECT) &&             strncasecmp(DCE2_SOPT__AUTODETECT, opt_start, opt_len) == 0)    {        opt_flag = DCE2_SC_OPT_FLAG__AUTODETECT;    }    else if (opt_len == strlen(DCE2_SOPT__NO_AUTODETECT_HTTP_PROXY_PORTS) &&             strncasecmp(DCE2_SOPT__NO_AUTODETECT_HTTP_PROXY_PORTS, opt_start, opt_len) == 0)    {        opt_flag = DCE2_SC_OPT_FLAG__NO_AUTODETECT_HTTP_PROXY_PORTS;    }    else if (opt_len == strlen(DCE2_SOPT__SMB_INVALID_SHARES) &&             strncasecmp(DCE2_SOPT__SMB_INVALID_SHARES, opt_start, opt_len) == 0)    {        opt_flag = DCE2_SC_OPT_FLAG__SMB_INVALID_SHARES;    }    else if (opt_len == strlen(DCE2_SOPT__SMB_MAX_CHAIN) &&             strncasecmp(DCE2_SOPT__SMB_MAX_CHAIN, opt_start, opt_len) == 0)    {        opt_flag = DCE2_SC_OPT_FLAG__SMB_MAX_CHAIN;    }    if (DCE2_CheckAndSetMask(opt_flag, opt_mask) != DCE2_RET__SUCCESS)    {        _dpd.logMsg("%s(%d) => %s: Can only configure option once: %.*s\n",                    *_dpd.config_file, *_dpd.config_line, DCE2_SNAME, opt_len, opt_start);        return DCE2_SC_OPT_FLAG__NULL;    }    return opt_flag;}/******************************************************************** * Function: DCE2_ScParsePolicy() * * Parses the argument given to the policy option. * * Arguments: *  DCE2_ServerConfig * *      Pointer to a server configuration structure. *  char ** *      Pointer to the pointer to the current position in the *      configuration line.  This is updated to the current position *      after parsing the policy argument. *  char * *      Pointer to the end of the configuration line. * * Returns: *  DCE2_Ret *      DCE2_RET__SUCCESS if we were able to successfully parse the *          value for the policy. *      DCE2_RET__ERROR if an error occured in parsing the policy. * ********************************************************************/static DCE2_Ret DCE2_ScParsePolicy(DCE2_ServerConfig *sc, char **ptr, char *end){    DCE2_WordListState state = DCE2_WORD_LIST_STATE__START;    char *policy_start = *ptr;    char last_char = 0;    while (*ptr < end)    {        char c = **ptr;        if (state == DCE2_WORD_LIST_STATE__END)            break;        switch (state)        {            case DCE2_WORD_LIST_STATE__START:                if (DCE2_IsWordChar(c, DCE2_WORD_CHAR_POSITION__START))                {                    policy_start = *ptr;                    state = DCE2_WORD_LIST_STATE__WORD;                }                else if (!DCE2_IsSpaceChar(c))                {                    _dpd.logMsg("%s(%d) => %s: Invalid events argument.\n",                                *_dpd.config_file, *_dpd.config_line, DCE2_GNAME);                    return DCE2_RET__ERROR;                }                break;            case DCE2_WORD_LIST_STATE__WORD:                if (!DCE2_IsWordChar(c, DCE2_WORD_CHAR_POSITION__MIDDLE))                {                    size_t policy_len = *ptr - policy_start;                    if (!DCE2_IsWordChar(last_char, DCE2_WORD_CHAR_POSITION__END))                    {                        _dpd.logMsg("%s(%d) => %s: Invalid events argument.\n",                                    *_dpd.config_file, *_dpd.config_line, DCE2_GNAME);                        return DCE2_RET__ERROR;                    }                    if (policy_len == strlen(DCE2_SARG__POLICY_WIN2000) &&                        strncasecmp(DCE2_SARG__POLICY_WIN2000, policy_start, policy_len) == 0)                    {                        sc->policy = DCE2_POLICY__WIN2000;                    }                    else if (policy_len == strlen(DCE2_SARG__POLICY_WINXP) &&                             strncasecmp(DCE2_SARG__POLICY_WINXP, policy_start, policy_len) == 0)                    {                        sc->policy = DCE2_POLICY__WINXP;                    }                    else if (policy_len == strlen(DCE2_SARG__POLICY_WINVISTA) &&                             strncasecmp(DCE2_SARG__POLICY_WINVISTA, policy_start, policy_len) == 0)                    {                        sc->policy = DCE2_POLICY__WINVISTA;                    }                    else if (policy_len == strlen(DCE2_SARG__POLICY_WIN2003) &&                             strncasecmp(DCE2_SARG__POLICY_WIN2003, policy_start, policy_len) == 0)                    {                        sc->policy = DCE2_POLICY__WIN2003;                    }                    else if (policy_len == strlen(DCE2_SARG__POLICY_SAMBA) &&                             strncasecmp(DCE2_SARG__POLICY_SAMBA, policy_start, policy_len) == 0)                    {                        sc->policy = DCE2_POLICY__SAMBA;                    }                    else if (policy_len == strlen(DCE2_SARG__POLICY_SAMBA_3_0_22) &&                             strncasecmp(DCE2_SARG__POLICY_SAMBA_3_0_22, policy_start, policy_len) == 0)                    {                        sc->policy = DCE2_POLICY__SAMBA_3_0_22;                    }                    else if (policy_len == strlen(DCE2_SARG__POLICY_SAMBA_3_0_20) &&                             strncasecmp(DCE2_SARG__POLICY_SAMBA_3_0_20, policy_start, policy_len) == 0)                    {                        sc->policy = DCE2_POLICY__SAMBA_3_0_20;                    }                    else                    {                        _dpd.logMsg("%s(%d) => %s: Invalid policy specified.\n",                                    *_dpd.config_file, *_dpd.config_line, DCE2_SNAME);                        return DCE2_RET__ERROR;                    }                    return DCE2_RET__SUCCESS;                }                break;            default:                _dpd.logMsg("%s(%d) => %s: Invalid policy state.\n", __FILE__, __LINE__, DCE2_SNAME);                return DCE2_RET__ERROR;        }        last_char = c;        (*ptr)++;    }    return DCE2_RET__ERROR;}/******************************************************************** * Function: DCE2_ScParseDetect() * * Parses the arguments to the detect or autodetect options.  These * options take the same arguments. * * Arguments: *  DCE2_ServerConfig * *      Pointer to a server configuration structure. *  char ** *      Pointer to the pointer to the current position in the *      configuration line.  This is updated to the current position *      after parsing the policy argument. *  char * *      Pointer to the end of the configuration line. *  int *      Non-zero if we're configuring for the autodetect option. *      Zero if we're configuring for the detect option. * * Returns: *  DCE2_Ret *      DCE2_RET__SUCCESS if we were able to successfully parse the *          arguments for the detect or autodetect options. *      DCE2_RET__ERROR if an error occured in parsing the detect *          or autodetect arguments. * ********************************************************************/static DCE2_Ret DCE2_ScParseDetect(DCE2_ServerConfig *sc, char **ptr, char *end, int autodetect){    DCE2_DetectListState state = DCE2_DETECT_LIST_STATE__START;    char *type_start = *ptr;    uint8_t *port_array = NULL;    int dmask = DCE2_DETECT_FLAG__NULL;    int one_type = 0;    char last_char = 0;    DCE2_DetectFlag dflag = DCE2_DETECT_FLAG__NULL;    DCE2_ScResetPortsArrays(sc, autodetect);    while (*ptr < end)    {        char c = **ptr;        if (state == DCE2_DETECT_LIST_STATE__END)            break;        switch (state)        {            case DCE2_DETECT_LIST_STATE__START:                if (DCE2_IsWordChar(c, DCE2_WORD_CHAR_POSITION__START))                {                    type_start = *ptr;                    one_type = 1;                    state = DCE2_DETECT_LIST_STATE__TYPE;                }                else if (DCE2_IsListStartChar(c))                {                    state = DCE2_DETECT_LIST_STATE__TYPE_START;                }                else if (!DCE2_IsSpaceChar(c))                {                    _dpd.logMsg("%s(%d) => %s: Invalid detect/autodetect type.\n",                                *_dpd.config_file, *_dpd.config_line, DCE2_SNAME);                    return DCE2_RET__ERROR;                }                break;            case DCE2_DETECT_LIST_STATE__TYPE_START:                if (DCE2_IsWordChar(c, DCE2_WORD_CHAR_POSITION__START))                {                    type_start = *ptr;                    state = DCE2_DETECT_LIST_STATE__TYPE;                }                else if (!DCE2_IsSpaceChar(c))                {                    _dpd.logMsg("%s(%d) => %s: Invalid character to start events argument: %c\n",                                *_dpd.config_file, *_dpd.config_line, DCE2_GNAME, c);                    return DCE2_RET__ERROR;                }                break;            case DCE2_DETECT_LIST_STATE__TYPE:                if (!DCE2_IsWordChar(c, DCE2_WORD_CHAR_POSITION__MIDDLE))                {                    if (!DCE2_IsWordChar(last_char, DCE2_WORD_CHAR_POSITION__END))                    {                        _dpd.logMsg("%s(%d) => %s: Invalid detect/autodetect type.\n",                                    *_dpd.config_file, *_dpd.config_line, DCE2_GNAME);                        return DCE2_RET__ERROR;                    }                    dflag = DCE2_ScParseDetectType(type_start, *ptr, &dmask);                    switch (dflag)                    {                        case DCE2_DETECT_FLAG__NONE:                            /* This can only be used by itself */                            if (dmask != DCE2_DETECT_FLAG__NONE)                            {                                _dpd.logMsg("%s(%d) => %s: Can only use detect/autodetect "                                            "type \"none\" by itself.\n",                                            *_dpd.config_file, *_dpd.config_line, DCE2_SNAME);                                return DCE2_RET__ERROR;                            }                            return DCE2_RET__SUCCESS;                        case DCE2_DETECT_FLAG__SMB:                            if (autodetect)                                port_array = sc->auto_smb_ports;                            else                                port_array = sc->smb_ports;                            break;                        case DCE2_DETECT_FLAG__TCP:                            if (autodetect)                                port_array = sc->auto_tcp_ports;                            else                                port_array = sc->tcp_po

⌨️ 快捷键说明

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