|
|
@ -1091,40 +1091,40 @@ int32_t DCERPCParser(DCERPC *dcerpc, uint8_t *input, uint32_t input_len) {
|
|
|
|
dcerpc->dcerpcresponse.stub_data_fresh = 0;
|
|
|
|
dcerpc->dcerpcresponse.stub_data_fresh = 0;
|
|
|
|
|
|
|
|
|
|
|
|
while(input_len) {
|
|
|
|
while(input_len) {
|
|
|
|
while (dcerpc->bytesprocessed < DCERPC_HDR_LEN && input_len) {
|
|
|
|
while (dcerpc->bytesprocessed < DCERPC_HDR_LEN && input_len) {
|
|
|
|
hdrretval = DCERPCParseHeader(dcerpc, input + parsed, input_len);
|
|
|
|
hdrretval = DCERPCParseHeader(dcerpc, input + parsed, input_len);
|
|
|
|
if (hdrretval == -1) {
|
|
|
|
if (hdrretval == -1) {
|
|
|
|
dcerpc->bytesprocessed = 0;
|
|
|
|
dcerpc->bytesprocessed = 0;
|
|
|
|
SCReturnInt(0);
|
|
|
|
SCReturnInt(0);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
parsed += hdrretval;
|
|
|
|
parsed += hdrretval;
|
|
|
|
input_len -= hdrretval;
|
|
|
|
input_len -= hdrretval;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
SCLogDebug("Done with DCERPCParseHeader bytesprocessed %u/%u left %u",
|
|
|
|
SCLogDebug("Done with DCERPCParseHeader bytesprocessed %u/%u left %u",
|
|
|
|
dcerpc->bytesprocessed, dcerpc->dcerpchdr.frag_length, input_len);
|
|
|
|
dcerpc->bytesprocessed, dcerpc->dcerpchdr.frag_length, input_len);
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
#if 0
|
|
|
|
printf("Done with DCERPCParseHeader bytesprocessed %u/%u input_len left %u\n",
|
|
|
|
printf("Done with DCERPCParseHeader bytesprocessed %u/%u input_len left %u\n",
|
|
|
|
dcerpc->bytesprocessed, dcerpc->dcerpchdr.frag_length, input_len);
|
|
|
|
dcerpc->bytesprocessed, dcerpc->dcerpchdr.frag_length, input_len);
|
|
|
|
printf("\nDCERPC Version:\t%u\n", dcerpc->dcerpchdr.rpc_vers);
|
|
|
|
printf("\nDCERPC Version:\t%u\n", dcerpc->dcerpchdr.rpc_vers);
|
|
|
|
printf("DCERPC Version Minor:\t%u\n", dcerpc->dcerpchdr.rpc_vers_minor);
|
|
|
|
printf("DCERPC Version Minor:\t%u\n", dcerpc->dcerpchdr.rpc_vers_minor);
|
|
|
|
printf("DCERPC Type:\t%u\n", dcerpc->dcerpchdr.type);
|
|
|
|
printf("DCERPC Type:\t%u\n", dcerpc->dcerpchdr.type);
|
|
|
|
printf("DCERPC Flags:\t0x%02x\n", dcerpc->dcerpchdr.pfc_flags);
|
|
|
|
printf("DCERPC Flags:\t0x%02x\n", dcerpc->dcerpchdr.pfc_flags);
|
|
|
|
printf("DCERPC Packed Drep:\t%02x %02x %02x %02x\n",
|
|
|
|
printf("DCERPC Packed Drep:\t%02x %02x %02x %02x\n",
|
|
|
|
dcerpc->dcerpchdr.packed_drep[0], dcerpc->dcerpchdr.packed_drep[1],
|
|
|
|
dcerpc->dcerpchdr.packed_drep[0], dcerpc->dcerpchdr.packed_drep[1],
|
|
|
|
dcerpc->dcerpchdr.packed_drep[2], dcerpc->dcerpchdr.packed_drep[3]);
|
|
|
|
dcerpc->dcerpchdr.packed_drep[2], dcerpc->dcerpchdr.packed_drep[3]);
|
|
|
|
printf("DCERPC Frag Length:\t0x%04x %u\n",
|
|
|
|
printf("DCERPC Frag Length:\t0x%04x %u\n",
|
|
|
|
dcerpc->dcerpchdr.frag_length, dcerpc->dcerpchdr.frag_length);
|
|
|
|
dcerpc->dcerpchdr.frag_length, dcerpc->dcerpchdr.frag_length);
|
|
|
|
printf("DCERPC Auth Length:\t0x%04x\n", dcerpc->dcerpchdr.auth_length);
|
|
|
|
printf("DCERPC Auth Length:\t0x%04x\n", dcerpc->dcerpchdr.auth_length);
|
|
|
|
printf("DCERPC Call Id:\t0x%08x\n", dcerpc->dcerpchdr.call_id);
|
|
|
|
printf("DCERPC Call Id:\t0x%08x\n", dcerpc->dcerpchdr.call_id);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
switch (dcerpc->dcerpchdr.type) {
|
|
|
|
switch (dcerpc->dcerpchdr.type) {
|
|
|
|
case BIND:
|
|
|
|
case BIND:
|
|
|
|
case ALTER_CONTEXT:
|
|
|
|
case ALTER_CONTEXT:
|
|
|
|
while (dcerpc->bytesprocessed < DCERPC_HDR_LEN + 12
|
|
|
|
while (dcerpc->bytesprocessed < DCERPC_HDR_LEN + 12
|
|
|
|
&& dcerpc->bytesprocessed < dcerpc->dcerpchdr.frag_length
|
|
|
|
&& dcerpc->bytesprocessed < dcerpc->dcerpchdr.frag_length
|
|
|
|
&& input_len) {
|
|
|
|
&& input_len) {
|
|
|
|
retval = DCERPCParseBIND(dcerpc, input + parsed, input_len);
|
|
|
|
retval = DCERPCParseBIND(dcerpc, input + parsed, input_len);
|
|
|
|
if (retval) {
|
|
|
|
if (retval) {
|
|
|
|
parsed += retval;
|
|
|
|
parsed += retval;
|
|
|
@ -1136,11 +1136,11 @@ int32_t DCERPCParser(DCERPC *dcerpc, uint8_t *input, uint32_t input_len) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
SCLogDebug(
|
|
|
|
SCLogDebug(
|
|
|
|
"Done with DCERPCParseBIND bytesprocessed %u/%u numctxitems %u",
|
|
|
|
"Done with DCERPCParseBIND bytesprocessed %u/%u numctxitems %u",
|
|
|
|
dcerpc->bytesprocessed, dcerpc->dcerpchdr.frag_length,
|
|
|
|
dcerpc->bytesprocessed, dcerpc->dcerpchdr.frag_length,
|
|
|
|
dcerpc->dcerpcbindbindack.numctxitems);
|
|
|
|
dcerpc->dcerpcbindbindack.numctxitems);
|
|
|
|
while (dcerpc->dcerpcbindbindack.numctxitemsleft && dcerpc->bytesprocessed
|
|
|
|
while (dcerpc->dcerpcbindbindack.numctxitemsleft && dcerpc->bytesprocessed
|
|
|
|
< dcerpc->dcerpchdr.frag_length && input_len) {
|
|
|
|
< dcerpc->dcerpchdr.frag_length && input_len) {
|
|
|
|
retval = DCERPCParseBINDCTXItem(dcerpc, input + parsed, input_len);
|
|
|
|
retval = DCERPCParseBINDCTXItem(dcerpc, input + parsed, input_len);
|
|
|
|
if (retval) {
|
|
|
|
if (retval) {
|
|
|
|
if (dcerpc->dcerpcbindbindack.ctxbytesprocessed == 44) {
|
|
|
|
if (dcerpc->dcerpcbindbindack.ctxbytesprocessed == 44) {
|
|
|
@ -1149,9 +1149,9 @@ int32_t DCERPCParser(DCERPC *dcerpc, uint8_t *input, uint32_t input_len) {
|
|
|
|
parsed += retval;
|
|
|
|
parsed += retval;
|
|
|
|
input_len -= retval;
|
|
|
|
input_len -= retval;
|
|
|
|
SCLogDebug("BIND processed %u/%u ctxitems %u/%u input_len left %u\n",
|
|
|
|
SCLogDebug("BIND processed %u/%u ctxitems %u/%u input_len left %u\n",
|
|
|
|
dcerpc->bytesprocessed,
|
|
|
|
dcerpc->bytesprocessed,
|
|
|
|
dcerpc->dcerpchdr.frag_length, dcerpc->dcerpcbindbindack.numctxitemsleft,
|
|
|
|
dcerpc->dcerpchdr.frag_length, dcerpc->dcerpcbindbindack.numctxitemsleft,
|
|
|
|
dcerpc->dcerpcbindbindack.numctxitems, input_len);
|
|
|
|
dcerpc->dcerpcbindbindack.numctxitems, input_len);
|
|
|
|
} else if (input_len) {
|
|
|
|
} else if (input_len) {
|
|
|
|
//parsed -= input_len;
|
|
|
|
//parsed -= input_len;
|
|
|
|
parsed = 0;
|
|
|
|
parsed = 0;
|
|
|
@ -1169,14 +1169,14 @@ int32_t DCERPCParser(DCERPC *dcerpc, uint8_t *input, uint32_t input_len) {
|
|
|
|
case BIND_ACK:
|
|
|
|
case BIND_ACK:
|
|
|
|
case ALTER_CONTEXT_RESP:
|
|
|
|
case ALTER_CONTEXT_RESP:
|
|
|
|
while (dcerpc->bytesprocessed < DCERPC_HDR_LEN + 9
|
|
|
|
while (dcerpc->bytesprocessed < DCERPC_HDR_LEN + 9
|
|
|
|
&& dcerpc->bytesprocessed < dcerpc->dcerpchdr.frag_length
|
|
|
|
&& dcerpc->bytesprocessed < dcerpc->dcerpchdr.frag_length
|
|
|
|
&& input_len) {
|
|
|
|
&& input_len) {
|
|
|
|
retval = DCERPCParseBINDACK(dcerpc, input + parsed, input_len);
|
|
|
|
retval = DCERPCParseBINDACK(dcerpc, input + parsed, input_len);
|
|
|
|
if (retval) {
|
|
|
|
if (retval) {
|
|
|
|
parsed += retval;
|
|
|
|
parsed += retval;
|
|
|
|
input_len -= retval;
|
|
|
|
input_len -= retval;
|
|
|
|
SCLogDebug("DCERPCParseBINDACK processed %u/%u input_len left %u",
|
|
|
|
SCLogDebug("DCERPCParseBINDACK processed %u/%u input_len left %u",
|
|
|
|
dcerpc->bytesprocessed, dcerpc->dcerpchdr.frag_length, input_len);
|
|
|
|
dcerpc->bytesprocessed, dcerpc->dcerpchdr.frag_length, input_len);
|
|
|
|
} else if (input_len) {
|
|
|
|
} else if (input_len) {
|
|
|
|
SCLogDebug("Error parsing %s\n", (dcerpc->dcerpchdr.type == BIND_ACK) ? "BIND_ACK" : "ALTER_CONTEXT_RESP");
|
|
|
|
SCLogDebug("Error parsing %s\n", (dcerpc->dcerpchdr.type == BIND_ACK) ? "BIND_ACK" : "ALTER_CONTEXT_RESP");
|
|
|
|
parsed = 0;
|
|
|
|
parsed = 0;
|
|
|
@ -1185,16 +1185,16 @@ int32_t DCERPCParser(DCERPC *dcerpc, uint8_t *input, uint32_t input_len) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
while (dcerpc->bytesprocessed < DCERPC_HDR_LEN + 10
|
|
|
|
while (dcerpc->bytesprocessed < DCERPC_HDR_LEN + 10
|
|
|
|
+ dcerpc->dcerpcbindbindack.secondaryaddrlen
|
|
|
|
+ dcerpc->dcerpcbindbindack.secondaryaddrlen
|
|
|
|
&& dcerpc->bytesprocessed < dcerpc->dcerpchdr.frag_length && input_len) {
|
|
|
|
&& dcerpc->bytesprocessed < dcerpc->dcerpchdr.frag_length && input_len) {
|
|
|
|
retval = DCERPCParseSecondaryAddr(dcerpc, input + parsed, input_len);
|
|
|
|
retval = DCERPCParseSecondaryAddr(dcerpc, input + parsed, input_len);
|
|
|
|
if (retval) {
|
|
|
|
if (retval) {
|
|
|
|
parsed += retval;
|
|
|
|
parsed += retval;
|
|
|
|
input_len -= retval;
|
|
|
|
input_len -= retval;
|
|
|
|
SCLogDebug(
|
|
|
|
SCLogDebug(
|
|
|
|
"DCERPCParseSecondaryAddr %u/%u left %u secondaryaddr len(%u)",
|
|
|
|
"DCERPCParseSecondaryAddr %u/%u left %u secondaryaddr len(%u)",
|
|
|
|
dcerpc->bytesprocessed, dcerpc->dcerpchdr.frag_length, input_len,
|
|
|
|
dcerpc->bytesprocessed, dcerpc->dcerpchdr.frag_length, input_len,
|
|
|
|
dcerpc->dcerpcbindbindack.secondaryaddrlen);
|
|
|
|
dcerpc->dcerpcbindbindack.secondaryaddrlen);
|
|
|
|
} else if (input_len) {
|
|
|
|
} else if (input_len) {
|
|
|
|
SCLogDebug("Error parsing Secondary Address");
|
|
|
|
SCLogDebug("Error parsing Secondary Address");
|
|
|
|
parsed = 0;
|
|
|
|
parsed = 0;
|
|
|
@ -1203,7 +1203,7 @@ int32_t DCERPCParser(DCERPC *dcerpc, uint8_t *input, uint32_t input_len) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (dcerpc->bytesprocessed == DCERPC_HDR_LEN + 10
|
|
|
|
if (dcerpc->bytesprocessed == DCERPC_HDR_LEN + 10
|
|
|
|
+ dcerpc->dcerpcbindbindack.secondaryaddrlen) {
|
|
|
|
+ dcerpc->dcerpcbindbindack.secondaryaddrlen) {
|
|
|
|
if (dcerpc->bytesprocessed % 4) {
|
|
|
|
if (dcerpc->bytesprocessed % 4) {
|
|
|
|
dcerpc->pad = (4 - dcerpc->bytesprocessed % 4);
|
|
|
|
dcerpc->pad = (4 - dcerpc->bytesprocessed % 4);
|
|
|
|
dcerpc->padleft = dcerpc->pad;
|
|
|
|
dcerpc->padleft = dcerpc->pad;
|
|
|
@ -1211,15 +1211,15 @@ int32_t DCERPCParser(DCERPC *dcerpc, uint8_t *input, uint32_t input_len) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
while (dcerpc->bytesprocessed < DCERPC_HDR_LEN + 10
|
|
|
|
while (dcerpc->bytesprocessed < DCERPC_HDR_LEN + 10
|
|
|
|
+ dcerpc->dcerpcbindbindack.secondaryaddrlen + dcerpc->pad
|
|
|
|
+ dcerpc->dcerpcbindbindack.secondaryaddrlen + dcerpc->pad
|
|
|
|
&& dcerpc->bytesprocessed < dcerpc->dcerpchdr.frag_length && input_len) {
|
|
|
|
&& dcerpc->bytesprocessed < dcerpc->dcerpchdr.frag_length && input_len) {
|
|
|
|
retval = PaddingParser(dcerpc, input + parsed, input_len);
|
|
|
|
retval = PaddingParser(dcerpc, input + parsed, input_len);
|
|
|
|
if (retval) {
|
|
|
|
if (retval) {
|
|
|
|
parsed += retval;
|
|
|
|
parsed += retval;
|
|
|
|
input_len -= retval;
|
|
|
|
input_len -= retval;
|
|
|
|
SCLogDebug("PaddingParser %u/%u left %u pad(%u)",
|
|
|
|
SCLogDebug("PaddingParser %u/%u left %u pad(%u)",
|
|
|
|
dcerpc->bytesprocessed, dcerpc->dcerpchdr.frag_length, input_len,
|
|
|
|
dcerpc->bytesprocessed, dcerpc->dcerpchdr.frag_length, input_len,
|
|
|
|
dcerpc->pad);
|
|
|
|
dcerpc->pad);
|
|
|
|
} else if (input_len) {
|
|
|
|
} else if (input_len) {
|
|
|
|
SCLogDebug("Error parsing DCERPC Padding");
|
|
|
|
SCLogDebug("Error parsing DCERPC Padding");
|
|
|
|
parsed = 0;
|
|
|
|
parsed = 0;
|
|
|
@ -1228,15 +1228,15 @@ int32_t DCERPCParser(DCERPC *dcerpc, uint8_t *input, uint32_t input_len) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
while (dcerpc->bytesprocessed >= DCERPC_HDR_LEN + 10 + dcerpc->pad
|
|
|
|
while (dcerpc->bytesprocessed >= DCERPC_HDR_LEN + 10 + dcerpc->pad
|
|
|
|
+ dcerpc->dcerpcbindbindack.secondaryaddrlen && dcerpc->bytesprocessed
|
|
|
|
+ dcerpc->dcerpcbindbindack.secondaryaddrlen && dcerpc->bytesprocessed
|
|
|
|
< DCERPC_HDR_LEN + 14 + dcerpc->pad + dcerpc->dcerpcbindbindack.secondaryaddrlen
|
|
|
|
< DCERPC_HDR_LEN + 14 + dcerpc->pad + dcerpc->dcerpcbindbindack.secondaryaddrlen
|
|
|
|
&& dcerpc->bytesprocessed < dcerpc->dcerpchdr.frag_length && input_len) {
|
|
|
|
&& dcerpc->bytesprocessed < dcerpc->dcerpchdr.frag_length && input_len) {
|
|
|
|
retval = DCERPCGetCTXItems(dcerpc, input + parsed, input_len);
|
|
|
|
retval = DCERPCGetCTXItems(dcerpc, input + parsed, input_len);
|
|
|
|
if (retval) {
|
|
|
|
if (retval) {
|
|
|
|
parsed += retval;
|
|
|
|
parsed += retval;
|
|
|
|
input_len -= retval;
|
|
|
|
input_len -= retval;
|
|
|
|
SCLogDebug("DCERPCGetCTXItems %u/%u (%u)", dcerpc->bytesprocessed,
|
|
|
|
SCLogDebug("DCERPCGetCTXItems %u/%u (%u)", dcerpc->bytesprocessed,
|
|
|
|
dcerpc->dcerpchdr.frag_length, dcerpc->dcerpcbindbindack.numctxitems);
|
|
|
|
dcerpc->dcerpchdr.frag_length, dcerpc->dcerpcbindbindack.numctxitems);
|
|
|
|
} else if (input_len) {
|
|
|
|
} else if (input_len) {
|
|
|
|
SCLogDebug("Error parsing CTX Items");
|
|
|
|
SCLogDebug("Error parsing CTX Items");
|
|
|
|
parsed = 0;
|
|
|
|
parsed = 0;
|
|
|
@ -1245,12 +1245,12 @@ int32_t DCERPCParser(DCERPC *dcerpc, uint8_t *input, uint32_t input_len) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (dcerpc->bytesprocessed == DCERPC_HDR_LEN + 14 + dcerpc->pad
|
|
|
|
if (dcerpc->bytesprocessed == DCERPC_HDR_LEN + 14 + dcerpc->pad
|
|
|
|
+ dcerpc->dcerpcbindbindack.secondaryaddrlen) {
|
|
|
|
+ dcerpc->dcerpcbindbindack.secondaryaddrlen) {
|
|
|
|
dcerpc->dcerpcbindbindack.ctxbytesprocessed = 0;
|
|
|
|
dcerpc->dcerpcbindbindack.ctxbytesprocessed = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
while (dcerpc->dcerpcbindbindack.numctxitemsleft && dcerpc->bytesprocessed
|
|
|
|
while (dcerpc->dcerpcbindbindack.numctxitemsleft && dcerpc->bytesprocessed
|
|
|
|
< dcerpc->dcerpchdr.frag_length && input_len) {
|
|
|
|
< dcerpc->dcerpchdr.frag_length && input_len) {
|
|
|
|
retval = DCERPCParseBINDACKCTXItem(dcerpc, input + parsed, input_len);
|
|
|
|
retval = DCERPCParseBINDACKCTXItem(dcerpc, input + parsed, input_len);
|
|
|
|
if (retval) {
|
|
|
|
if (retval) {
|
|
|
|
if (dcerpc->dcerpcbindbindack.ctxbytesprocessed == 24) {
|
|
|
|
if (dcerpc->dcerpcbindbindack.ctxbytesprocessed == 24) {
|
|
|
@ -1267,7 +1267,7 @@ int32_t DCERPCParser(DCERPC *dcerpc, uint8_t *input, uint32_t input_len) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
SCLogDebug("BINDACK processed %u/%u input_len left %u", dcerpc->bytesprocessed,
|
|
|
|
SCLogDebug("BINDACK processed %u/%u input_len left %u", dcerpc->bytesprocessed,
|
|
|
|
dcerpc->dcerpchdr.frag_length, input_len);
|
|
|
|
dcerpc->dcerpchdr.frag_length, input_len);
|
|
|
|
if (dcerpc->bytesprocessed == dcerpc->dcerpchdr.frag_length) {
|
|
|
|
if (dcerpc->bytesprocessed == dcerpc->dcerpchdr.frag_length) {
|
|
|
|
dcerpc->bytesprocessed = 0;
|
|
|
|
dcerpc->bytesprocessed = 0;
|
|
|
|
dcerpc->dcerpcbindbindack.ctxbytesprocessed = 0;
|
|
|
|
dcerpc->dcerpcbindbindack.ctxbytesprocessed = 0;
|
|
|
@ -1277,7 +1277,7 @@ int32_t DCERPCParser(DCERPC *dcerpc, uint8_t *input, uint32_t input_len) {
|
|
|
|
/* update transaction id */
|
|
|
|
/* update transaction id */
|
|
|
|
dcerpc->transaction_id++;
|
|
|
|
dcerpc->transaction_id++;
|
|
|
|
SCLogDebug("transaction_id updated to %"PRIu16,
|
|
|
|
SCLogDebug("transaction_id updated to %"PRIu16,
|
|
|
|
dcerpc->transaction_id);
|
|
|
|
dcerpc->transaction_id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -1285,8 +1285,8 @@ int32_t DCERPCParser(DCERPC *dcerpc, uint8_t *input, uint32_t input_len) {
|
|
|
|
case REQUEST:
|
|
|
|
case REQUEST:
|
|
|
|
case RESPONSE:
|
|
|
|
case RESPONSE:
|
|
|
|
while (dcerpc->bytesprocessed < DCERPC_HDR_LEN + 8
|
|
|
|
while (dcerpc->bytesprocessed < DCERPC_HDR_LEN + 8
|
|
|
|
&& dcerpc->bytesprocessed < dcerpc->dcerpchdr.frag_length
|
|
|
|
&& dcerpc->bytesprocessed < dcerpc->dcerpchdr.frag_length
|
|
|
|
&& input_len) {
|
|
|
|
&& input_len) {
|
|
|
|
retval = DCERPCParseREQUEST(dcerpc, input + parsed, input_len);
|
|
|
|
retval = DCERPCParseREQUEST(dcerpc, input + parsed, input_len);
|
|
|
|
if (retval) {
|
|
|
|
if (retval) {
|
|
|
|
parsed += retval;
|
|
|
|
parsed += retval;
|
|
|
@ -1294,7 +1294,7 @@ int32_t DCERPCParser(DCERPC *dcerpc, uint8_t *input, uint32_t input_len) {
|
|
|
|
dcerpc->padleft = dcerpc->dcerpchdr.frag_length - dcerpc->bytesprocessed;
|
|
|
|
dcerpc->padleft = dcerpc->dcerpchdr.frag_length - dcerpc->bytesprocessed;
|
|
|
|
} else if (input_len) {
|
|
|
|
} else if (input_len) {
|
|
|
|
SCLogDebug("Error parsing DCERPC %s",
|
|
|
|
SCLogDebug("Error parsing DCERPC %s",
|
|
|
|
(dcerpc->dcerpchdr.type == REQUEST) ? "REQUEST" : "RESPONSE");
|
|
|
|
(dcerpc->dcerpchdr.type == REQUEST) ? "REQUEST" : "RESPONSE");
|
|
|
|
parsed = 0;
|
|
|
|
parsed = 0;
|
|
|
|
dcerpc->padleft = 0;
|
|
|
|
dcerpc->padleft = 0;
|
|
|
|
input_len = 0;
|
|
|
|
input_len = 0;
|
|
|
@ -1302,8 +1302,8 @@ int32_t DCERPCParser(DCERPC *dcerpc, uint8_t *input, uint32_t input_len) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
while (dcerpc->bytesprocessed >= DCERPC_HDR_LEN + 8
|
|
|
|
while (dcerpc->bytesprocessed >= DCERPC_HDR_LEN + 8
|
|
|
|
&& dcerpc->bytesprocessed < dcerpc->dcerpchdr.frag_length
|
|
|
|
&& dcerpc->bytesprocessed < dcerpc->dcerpchdr.frag_length
|
|
|
|
&& dcerpc->padleft && input_len) {
|
|
|
|
&& dcerpc->padleft && input_len) {
|
|
|
|
retval = StubDataParser(dcerpc, input + parsed, input_len);
|
|
|
|
retval = StubDataParser(dcerpc, input + parsed, input_len);
|
|
|
|
if (retval) {
|
|
|
|
if (retval) {
|
|
|
|
parsed += retval;
|
|
|
|
parsed += retval;
|
|
|
@ -1318,10 +1318,10 @@ int32_t DCERPCParser(DCERPC *dcerpc, uint8_t *input, uint32_t input_len) {
|
|
|
|
|
|
|
|
|
|
|
|
if (dcerpc->dcerpchdr.type == REQUEST) {
|
|
|
|
if (dcerpc->dcerpchdr.type == REQUEST) {
|
|
|
|
SCLogDebug("REQUEST processed %u frag length %u opnum %u input_len %u", dcerpc->bytesprocessed,
|
|
|
|
SCLogDebug("REQUEST processed %u frag length %u opnum %u input_len %u", dcerpc->bytesprocessed,
|
|
|
|
dcerpc->dcerpchdr.frag_length, dcerpc->dcerpcrequest.opnum, input_len);
|
|
|
|
dcerpc->dcerpchdr.frag_length, dcerpc->dcerpcrequest.opnum, input_len);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
SCLogDebug("RESPONSE processed %u frag length %u opnum %u input_len %u", dcerpc->bytesprocessed,
|
|
|
|
SCLogDebug("RESPONSE processed %u frag length %u opnum %u input_len %u", dcerpc->bytesprocessed,
|
|
|
|
dcerpc->dcerpchdr.frag_length, dcerpc->dcerpcrequest.opnum, input_len);
|
|
|
|
dcerpc->dcerpchdr.frag_length, dcerpc->dcerpcrequest.opnum, input_len);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (dcerpc->bytesprocessed == dcerpc->dcerpchdr.frag_length) {
|
|
|
|
if (dcerpc->bytesprocessed == dcerpc->dcerpchdr.frag_length) {
|
|
|
@ -1333,7 +1333,7 @@ int32_t DCERPCParser(DCERPC *dcerpc, uint8_t *input, uint32_t input_len) {
|
|
|
|
/* update transaction id */
|
|
|
|
/* update transaction id */
|
|
|
|
dcerpc->transaction_id++;
|
|
|
|
dcerpc->transaction_id++;
|
|
|
|
SCLogDebug("transaction_id updated to %"PRIu16,
|
|
|
|
SCLogDebug("transaction_id updated to %"PRIu16,
|
|
|
|
dcerpc->transaction_id);
|
|
|
|
dcerpc->transaction_id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
@ -1341,9 +1341,9 @@ int32_t DCERPCParser(DCERPC *dcerpc, uint8_t *input, uint32_t input_len) {
|
|
|
|
SCLogDebug("DCERPC Type 0x%02x not implemented yet", dcerpc->dcerpchdr.type);
|
|
|
|
SCLogDebug("DCERPC Type 0x%02x not implemented yet", dcerpc->dcerpchdr.type);
|
|
|
|
dcerpc->bytesprocessed = 0;
|
|
|
|
dcerpc->bytesprocessed = 0;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
dcerpc->bytesprocessed = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
dcerpc->bytesprocessed = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
SCReturnInt(parsed);
|
|
|
|
SCReturnInt(parsed);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|