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

📄 dcerpc.c

📁 linux network safe toolse
💻 C
📖 第 1 页 / 共 2 页
字号:
                    if ( _dcerpc->dcerpc_req_buf_len < _dcerpc->dcerpc_req_buf_size )                    {                                           if ( _dcerpc->dcerpc_req_buf_len + dcerpc_len > _dcerpc->dcerpc_req_buf_size )                        {                            dcerpc_len = _dcerpc->dcerpc_req_buf_size - _dcerpc->dcerpc_req_buf_len;                        }                        ret = SafeMemcpy(_dcerpc->dcerpc_req_buf + _dcerpc->dcerpc_req_buf_len,                                         data + sizeof(DCERPC_REQ), dcerpc_len,                                         _dcerpc->dcerpc_req_buf, _dcerpc->dcerpc_req_buf + _dcerpc->dcerpc_req_buf_size);                        if (ret == 0)                        {                            DCERPC_FragFree(_dcerpc->dcerpc_req_buf, 0);                            _dcerpc->dcerpc_req_buf_len = 0;                            _dcerpc->dcerpc_req_buf_size = 0;                            _dcerpc->dcerpc_req_buf = NULL;                            _dcerpc->fragmentation |= SUSPEND_FRAGMENTATION;                            return 0;                        }                        _dcerpc->dcerpc_req_buf_len += dcerpc_len;                        if ( _debug_print )                            PrintBuffer("DCE/RPC fragment", data + sizeof(DCERPC_REQ), dcerpc_len);                    }                }            }            else            {                /* Check for DCE/RPC fragmentation */                if ( (dcerpc_hdr->flags & DCERPC_FIRST_FRAG) && !(dcerpc_hdr->flags & DCERPC_LAST_FRAG) )                {                    u_int16_t  alloc_size = DCERPC_FRAG_ALLOC;                    _dcerpc->dcerpc_req_buf_len = frag_length - sizeof(DCERPC_REQ);                    if ( _dcerpc->dcerpc_req_buf_len > (data_size - sizeof(DCERPC_REQ)) )                    {                        _dcerpc->dcerpc_req_buf_len = data_size - sizeof(DCERPC_REQ);                    }                    if ( _dcerpc->dcerpc_req_buf_len > DCERPC_FRAG_ALLOC )                    {                        alloc_size = _dcerpc->dcerpc_req_buf_len;                    }                    _dcerpc->dcerpc_req_buf = (u_int8_t *) DCERPC_FragAlloc(NULL, 0, &alloc_size);                    if ( alloc_size == 0 )                    {                        DEBUG_WRAP(DebugMessage(DEBUG_DCERPC, "Memcap reached, ignoring DCE/RPC fragmentation reassembly.\n"););                        DCERPC_FragFree(_dcerpc->dcerpc_req_buf, 0);                        _dcerpc->dcerpc_req_buf_len = 0;                        _dcerpc->dcerpc_req_buf_size = 0;                        _dcerpc->dcerpc_req_buf = NULL;                        _dcerpc->fragmentation |= SUSPEND_FRAGMENTATION;                        return 0;                    }                    if ( !_dcerpc->dcerpc_req_buf )                        DynamicPreprocessorFatalMessage("Failed to allocate space for first DCE/RPC fragmented request\n");                    if ( _dcerpc->dcerpc_req_buf_len > alloc_size )                    {                        _dcerpc->dcerpc_req_buf_len = alloc_size;                    }                    _dcerpc->dcerpc_req_buf_size = alloc_size;                    ret = SafeMemcpy(_dcerpc->dcerpc_req_buf, data + sizeof(DCERPC_REQ), _dcerpc->dcerpc_req_buf_len,                                     _dcerpc->dcerpc_req_buf, _dcerpc->dcerpc_req_buf + _dcerpc->dcerpc_req_buf_size);                    if (ret == 0)                    {                        DCERPC_FragFree(_dcerpc->dcerpc_req_buf, 0);                        _dcerpc->dcerpc_req_buf_len = 0;                        _dcerpc->dcerpc_req_buf_size = 0;                        _dcerpc->dcerpc_req_buf = NULL;                        _dcerpc->fragmentation |= SUSPEND_FRAGMENTATION;                        return 0;                    }                    _dcerpc->fragmentation |= RPC_FRAGMENTATION;                    if ( _debug_print )                        PrintBuffer("DCE/RPC fragment", data + sizeof(DCERPC_REQ), _dcerpc->dcerpc_req_buf_len);                                }                else                {                    return 0;                }            }        }              /* Check for last frag */        if ( (_dcerpc->fragmentation & RPC_FRAGMENTATION) && dcerpc_hdr->flags & DCERPC_LAST_FRAG )        {            return 1;        }    }    return 0;}void ReassembleDCERPCRequest(const u_int8_t *smb_hdr, u_int16_t smb_hdr_len, const u_int8_t *data){    int pkt_len;    DCERPC_REQ fake_req;    unsigned int dcerpc_req_len = sizeof(DCERPC_REQ);    int status;    u_int16_t data_len = 0;    /* Make sure we have room to fit into buffer */    if (smb_hdr != NULL)    {        pkt_len =            sizeof(NBT_HDR) + smb_hdr_len +            dcerpc_req_len + _dcerpc->dcerpc_req_buf_len;    }    else    {        pkt_len = dcerpc_req_len + _dcerpc->dcerpc_req_buf_len;    }    if (pkt_len > dce_reassembly_buf_size)    {        DEBUG_WRAP(DebugMessage(DEBUG_DCERPC, "Reassembled DCE/RPC packet "                                "greater than %d bytes, skipping.\n", dce_reassembly_buf_size));        /* just shorten it - don't want to lose all of         * this information */        _dcerpc->dcerpc_req_buf_len =            dce_reassembly_buf_size - (pkt_len - _dcerpc->dcerpc_req_buf_len);    }    /* Mock up header */    status = SafeMemcpy(&fake_req, data, dcerpc_req_len,                        &fake_req, (u_int8_t *)&fake_req + dcerpc_req_len);        if (status != SAFEMEM_SUCCESS)    {        DEBUG_WRAP(DebugMessage(DEBUG_DCERPC, "Failed to copy DCERPC header, "                                "skipping DCERPC reassembly.\n"));        goto dcerpc_frag_free;    }    fake_req.dcerpc_hdr.frag_length =        dcerpc_htons(fake_req.dcerpc_hdr.byte_order, dcerpc_req_len + _dcerpc->dcerpc_req_buf_len);    fake_req.dcerpc_hdr.flags |= (DCERPC_FIRST_FRAG | DCERPC_LAST_FRAG);    fake_req.alloc_hint = dcerpc_htonl(fake_req.dcerpc_hdr.byte_order, _dcerpc->dcerpc_req_buf_len);    if (smb_hdr != NULL)    {        status = SafeMemcpy(dce_reassembly_buf, _dcerpc_pkt->payload, sizeof(NBT_HDR),                            dce_reassembly_buf, dce_reassembly_buf + dce_reassembly_buf_size);        if (status != SAFEMEM_SUCCESS)        {            DEBUG_WRAP(DebugMessage(DEBUG_DCERPC, "Failed to copy DCERPC header, "                                    "skipping DCERPC reassembly.\n"););            goto dcerpc_frag_free;        }        data_len = sizeof(NBT_HDR);        status = SafeMemcpy(dce_reassembly_buf + data_len,                            smb_hdr, smb_hdr_len,                            dce_reassembly_buf, dce_reassembly_buf + dce_reassembly_buf_size);        if (status != SAFEMEM_SUCCESS)        {            DEBUG_WRAP(DebugMessage(DEBUG_DCERPC, "Failed to copy DCERPC header, "                                    "skipping DCERPC reassembly.\n"););            goto dcerpc_frag_free;        }        data_len += smb_hdr_len;    }    status = SafeMemcpy(dce_reassembly_buf + data_len,                        &fake_req, dcerpc_req_len,                        dce_reassembly_buf, dce_reassembly_buf + dce_reassembly_buf_size);    if (status != SAFEMEM_SUCCESS)    {        DEBUG_WRAP(DebugMessage(DEBUG_DCERPC, "Failed to copy DCERPC header, "                                "skipping DCERPC reassembly.\n"););        goto dcerpc_frag_free;    }    data_len += dcerpc_req_len;    /* Copy data into buffer */    status = SafeMemcpy(dce_reassembly_buf + data_len,                        _dcerpc->dcerpc_req_buf, _dcerpc->dcerpc_req_buf_len,                        dce_reassembly_buf, dce_reassembly_buf + dce_reassembly_buf_size);    if (status != SAFEMEM_SUCCESS)    {        DEBUG_WRAP(DebugMessage(DEBUG_DCERPC, "Failed to copy DCERPC data, "                                "skipping DCERPC reassembly.\n"););        goto dcerpc_frag_free;    }    data_len += _dcerpc->dcerpc_req_buf_len;    if (_debug_print)    {        PrintBuffer("DCE/RPC reassembled fragment",                    (u_int8_t *)dce_reassembly_buf, data_len);    }    /* create pseudo packet */    real_dce_mock_pkt = DCERPC_SetPseudoPacket(_dcerpc_pkt, dce_reassembly_buf, data_len);    if (real_dce_mock_pkt == NULL)        goto dcerpc_frag_free;dcerpc_frag_free:        /* Get ready for next write */    DCERPC_FragFree(_dcerpc->dcerpc_req_buf, _dcerpc->dcerpc_req_buf_size);    _dcerpc->dcerpc_req_buf = NULL;    _dcerpc->dcerpc_req_buf_len = 0;    _dcerpc->dcerpc_req_buf_size = 0;    _dcerpc->fragmentation &= ~RPC_FRAGMENTATION;    _dcerpc->fragmentation &= ~SUSPEND_FRAGMENTATION;}

⌨️ 快捷键说明

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