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

📄 snort_dcerpc.c

📁 snort2.8.4版本
💻 C
📖 第 1 页 / 共 3 页
字号:
#endif  /* TARGET_BASED */    return DCERPC_TRANS_TYPE__NONE;}int DCERPCDecode(void *pkt){    SFSnortPacket *p = (SFSnortPacket *) pkt;    DCERPC *x = NULL;    DCERPC_TransType trans = DCERPC_TRANS_TYPE__NONE;    real_dce_mock_pkt = NULL;    x = (DCERPC *)_dpd.streamAPI->get_application_data(p->stream_session_ptr, PP_DCERPC);    if (x == NULL)    {        char autodetected = 0;        trans = DCERPC_GetTransport(p, &autodetected);        if (trans == DCERPC_TRANS_TYPE__NONE)            return 0;        x = (DCERPC *)calloc(1, sizeof(DCERPC));        if ( x == NULL )        {            DynamicPreprocessorFatalMessage("%s(%d) => Failed to allocate for SMB session data\n",                                             _dpd.config_file, _dpd.config_line);        }        else        {            _dpd.streamAPI->set_application_data(p->stream_session_ptr, PP_DCERPC,                                                 (void *)x, &DCERPC_SessionFree);                }        DEBUG_WRAP(DebugMessage(DEBUG_DCERPC, "Created new session\n"););        x->trans = trans;        if (autodetected)            x->autodetected = 1;        if (_dpd.streamAPI->get_reassembly_direction(p->stream_session_ptr) != SSN_DIR_SERVER)        {            _dpd.streamAPI->set_reassembly(p->stream_session_ptr, STREAM_FLPOLICY_FOOTPRINT,                                           SSN_DIR_SERVER, STREAM_FLPOLICY_SET_ABSOLUTE);        }        if (p->flags & FLAG_FROM_SERVER)        {            _dpd.streamAPI->response_flush_stream(p);            return 0;        }        if (p->flags & FLAG_STREAM_INSERT)            return 0;    }    else if (x->no_inspect)    {        return 0;    }    else if (p->flags & FLAG_FROM_SERVER)    {        _dpd.streamAPI->response_flush_stream(p);        return 0;    }    else if ((p->flags & FLAG_FROM_CLIENT) && !(p->flags & FLAG_REBUILT_STREAM))    {        /* Should be doing reassembly at this point */        return 0;    }    _dcerpc = x;    _dcerpc_pkt = p;    switch (_dcerpc->trans)    {        case DCERPC_TRANS_TYPE__SMB:            DEBUG_WRAP(DebugMessage(DEBUG_DCERPC, "Decoding SMB packet\n"););            ProcessRawSMB(p, p->payload, p->payload_size);            break;        case DCERPC_TRANS_TYPE__DCERPC:            DEBUG_WRAP(DebugMessage(DEBUG_DCERPC, "Decoding DCE/RPC packet\n"););            ProcessRawDCERPC(p, p->payload, p->payload_size);            break;        default:            /* Shouldn't get here.  Just adding action for default case */            return 0;    }    if (_dcerpc->fragmentation & SUSPEND_FRAGMENTATION)    {        DCERPC_DataFree(_dcerpc);        _dcerpc->no_inspect = 1;    }    /* If it's an autodetected session, still let other preprocessors     * look at it */    if (_dcerpc->autodetected)        return 0;    return 1;}void DCERPC_Exit(void){    if (dce_reassembly_buf != NULL)        free((void *)dce_reassembly_buf);    if (dce_mock_pkt != NULL)    {        if (dce_mock_pkt->pcap_header != NULL)            free((void *)dce_mock_pkt->pcap_header);        free((void *)dce_mock_pkt);    }#ifdef SUP_IP6    if (dce_mock_pkt_6 != NULL)    {        if (dce_mock_pkt_6->pcap_header != NULL)            free((void *)dce_mock_pkt_6->pcap_header);        free((void *)dce_mock_pkt_6);    }#endif#ifdef PERF_PROFILING#ifdef DEBUG_DCERPC_PRINT    printf("SMB Debug\n");    printf("  Number of packets seen:      %u\n", dcerpcPerfStats.checks);    printf("  Number of packets ignored: %d\n", dcerpcIgnorePerfStats.checks);#endif#endif}int ProcessNextSMBCommand(u_int8_t command, SMB_HDR *smbHdr,                          u_int8_t *data, u_int16_t size, u_int16_t total_size){    switch (command)    {        case SMB_COM_TREE_CONNECT_ANDX:            return ProcessSMBTreeConnXReq(smbHdr, data, size, total_size);        case SMB_COM_NT_CREATE_ANDX:            return ProcessSMBNTCreateX(smbHdr, data, size, total_size);        case SMB_COM_WRITE_ANDX:             return ProcessSMBWriteX(smbHdr, data, size, total_size);        case SMB_COM_TRANSACTION:            return ProcessSMBTransaction(smbHdr, data, size, total_size);        case SMB_COM_READ_ANDX:            return ProcessSMBReadX(smbHdr, data, size, total_size);#ifdef UNUSED_SMB_COMMAND        case SMB_COM_SESSION_SETUP_ANDX:            return ProcessSMBSetupXReq(smbHdr, data, size, total_size);        case SMB_COM_LOGOFF_ANDX:            return ProcessSMBLogoffXReq(smbHdr, data, size, total_size);        case SMB_COM_READ_ANDX:            return ProcessSMBReadX(smbHdr, data, size, total_size);        case SMB_COM_LOCKING_ANDX:            return ProcessSMBLockingX(smbHdr, data, size, total_size);        case SMB_COM_NEGOTIATE:            return ProcessSMBNegProtReq(smbHdr, data, size, total_size);        case SMB_COM_TRANSACTION2:            return ProcessSMBTransaction2(smbHdr, data, size, total_size);        case SMB_COM_TRANSACTION2_SECONDARY:            return ProcessSMBTransaction2Secondary(smbHdr, data, size, total_size);        case SMB_COM_NT_TRANSACT:            return ProcessSMBNTTransact(smbHdr, data, size, total_size);        case SMB_COM_NT_TRANSACT_SECONDARY:            return ProcessSMBNTTransactSecondary(smbHdr, data, size, total_size);        case SMB_COM_TRANSACTION_SECONDARY:            break;                case SMB_COM_ECHO:            return ProcessSMBEcho(smbHdr, data, size, total_size);        case SMB_COM_SEEK:            return ProcessSMBSeek(smbHdr, data, size, total_size);        case SMB_COM_FLUSH:            return ProcessSMBFlush(smbHdr, data, size, total_size);        case SMB_COM_CLOSE:        case SMB_COM_CLOSE_AND_TREE_DISC:            return ProcessSMBClose(smbHdr, data, size, total_size);        case SMB_COM_TREE_DISCONNECT:        case SMB_COM_NT_CANCEL:            return ProcessSMBNoParams(smbHdr, data, size, total_size);#endif        default:#ifdef DEBUG_DCERPC_PRINT            printf("====> Unprocessed command 0x%02x <==== \n", command);#endif            break;    }    return 0;}int DCERPC_BufferAddData(DCERPC *dce_ssn, DCERPC_Buffer *sbuf, const u_int8_t *data, u_int16_t data_size){    int status;    if ((sbuf == NULL) || (data == NULL))        return -1;    if (data_size == 0)        return 0;    if ((sbuf == &dce_ssn->smb_seg_buf) && _disable_smb_fragmentation)        return 0;    else if (_disable_dcerpc_fragmentation)        return 0;    if (sbuf->data == NULL)    {        u_int16_t alloc_size = data_size;        if (dce_ssn->fragmentation & SUSPEND_FRAGMENTATION)            return -1;        /* Add a minimum size so we don't have to realloc as often */        if (alloc_size < DCERPC_MIN_SEG_ALLOC_SIZE)            alloc_size = DCERPC_MIN_SEG_ALLOC_SIZE;        if (DCERPC_IsMemcapExceeded(alloc_size))            return -1;        sbuf->data = (u_int8_t *)calloc(alloc_size, 1);        if (sbuf->data == NULL)            DynamicPreprocessorFatalMessage("Failed to allocate space for TCP seg buf\n");        _total_memory += alloc_size;        sbuf->size = alloc_size;    }    else    {        u_int16_t buf_size_left = sbuf->size - sbuf->len;        if (data_size > buf_size_left)        {            u_int16_t alloc_size = data_size - buf_size_left;            if (dce_ssn->fragmentation & SUSPEND_FRAGMENTATION)                return -1;            if (alloc_size < DCERPC_MIN_SEG_ALLOC_SIZE)                alloc_size = DCERPC_MIN_SEG_ALLOC_SIZE;            if ((USHRT_MAX - sbuf->size) < alloc_size)                alloc_size = USHRT_MAX - sbuf->size;            if (alloc_size == 0)                return -1;            if (DCERPC_IsMemcapExceeded(alloc_size))                return -1;            sbuf->data = (u_int8_t *)realloc(sbuf->data, sbuf->size + alloc_size);            if (sbuf->data == NULL)                DynamicPreprocessorFatalMessage("Failed to allocate space for TCP seg buf\n");            _total_memory += alloc_size;            sbuf->size += alloc_size;            /* This would be because of potential overflow */            if (sbuf->len + data_size > sbuf->size)                data_size = sbuf->size - sbuf->len;        }    }    status = SafeMemcpy(sbuf->data + sbuf->len, data, data_size,                        sbuf->data + sbuf->len, sbuf->data + sbuf->size);    if (status != SAFEMEM_SUCCESS)        return -1;    sbuf->len += data_size;    return 0;}void DCERPC_BufferFreeData(DCERPC_Buffer *sbuf){    if (sbuf == NULL)        return;    if (sbuf->data != NULL)    {        if (_total_memory > sbuf->size)            _total_memory -= sbuf->size;        else            _total_memory = 0;        free(sbuf->data);        sbuf->data = NULL;        sbuf->len = 0;        sbuf->size = 0;    }}int DCERPC_IsMemcapExceeded(u_int16_t alloc_size){    if ((alloc_size + _total_memory) > _memcap)    {        if (_alert_memcap)        {            DCERPC_GenerateAlert(DCERPC_EVENT_MEMORY_OVERFLOW,                                     DCERPC_EVENT_MEMORY_OVERFLOW_STR);        }        return 1;    }    return 0;}

⌨️ 快捷键说明

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