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

📄 print-snmp.c

📁 Windump3.6.2源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
			if (elem.type != BE_NULL) {				fputs("[objVal!=NULL]", stdout);				asn1_print(&elem);			}		} else {		        if (elem.type != BE_NULL) {#ifdef LIBSMI			        smi_print_value(smiNode, pduid, &elem);				smiFreeNode(smiNode);#else				asn1_print(&elem);#endif			}		}		length = vblength;		np = vbend;	}}/* * Decode SNMP PDUs: GetRequest, GetNextRequest, GetResponse, SetRequest, * GetBulk, Inform, V2Trap, and Report */static voidsnmppdu_print(u_char pduid, const u_char *np, u_int length){	struct be elem;	int count = 0, error;	/* reqId (Integer) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_INT) {		fputs("[reqId!=INT]", stdout);		asn1_print(&elem);		return;	}	if (vflag)		printf("R=%d ", elem.data.integer);	length -= count;	np += count;	/* errorStatus (Integer) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_INT) {		fputs("[errorStatus!=INT]", stdout);		asn1_print(&elem);		return;	}	error = 0;	if ((pduid == GETREQ || pduid == GETNEXTREQ || pduid == SETREQ	    || pduid == INFORMREQ || pduid == V2TRAP || pduid == REPORT)	    && elem.data.integer != 0) {		char errbuf[10];		printf("[errorStatus(%s)!=0]",			DECODE_ErrorStatus(elem.data.integer));	} else if (pduid == GETBULKREQ) {	        printf(" N=%d", elem.data.integer);	} else if (elem.data.integer != 0) {		char errbuf[10];		printf(" %s", DECODE_ErrorStatus(elem.data.integer));		error = elem.data.integer;	}	length -= count;	np += count;	/* errorIndex (Integer) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_INT) {		fputs("[errorIndex!=INT]", stdout);		asn1_print(&elem);		return;	}	if ((pduid == GETREQ || pduid == GETNEXTREQ || pduid == SETREQ	    || pduid == INFORMREQ || pduid == V2TRAP || pduid == REPORT)	    && elem.data.integer != 0)		printf("[errorIndex(%d)!=0]", elem.data.integer);	else if (pduid == GETBULKREQ)	        printf(" M=%d", elem.data.integer);	else if (elem.data.integer != 0) {		if (!error)			printf("[errorIndex(%d) w/o errorStatus]",				elem.data.integer);		else {			printf("@%d", elem.data.integer);			error = elem.data.integer;		}	} else if (error) {		fputs("[errorIndex==0]", stdout);		error = 0;	}	length -= count;	np += count;	varbind_print(pduid, np, length);	return;}/* * Decode SNMP Trap PDU */static voidtrappdu_print(const u_char *np, u_int length){	struct be elem;	int count = 0, generic;	putchar(' ');	/* enterprise (oid) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_OID) {		fputs("[enterprise!=OID]", stdout);		asn1_print(&elem);		return;	}	asn1_print(&elem);	length -= count;	np += count;	putchar(' ');	/* agent-addr (inetaddr) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_INETADDR) {		fputs("[agent-addr!=INETADDR]", stdout);		asn1_print(&elem);		return;	}	asn1_print(&elem);	length -= count;	np += count;	/* generic-trap (Integer) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_INT) {		fputs("[generic-trap!=INT]", stdout);		asn1_print(&elem);		return;	}	generic = elem.data.integer;	{		char buf[10];		printf(" %s", DECODE_GenericTrap(generic));	}	length -= count;	np += count;	/* specific-trap (Integer) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_INT) {		fputs("[specific-trap!=INT]", stdout);		asn1_print(&elem);		return;	}	if (generic != GT_ENTERPRISE) {		if (elem.data.integer != 0)			printf("[specific-trap(%d)!=0]", elem.data.integer);	} else		printf(" s=%d", elem.data.integer);	length -= count;	np += count;	putchar(' ');	/* time-stamp (TimeTicks) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_UNS) {			/* XXX */		fputs("[time-stamp!=TIMETICKS]", stdout);		asn1_print(&elem);		return;	}	asn1_print(&elem);	length -= count;	np += count;	varbind_print (TRAP, np, length);	return;}/* * Decode arbitrary SNMP PDUs. */static voidpdu_print(const u_char *np, u_int length, int version){	struct be pdu;	int count = 0;	/* PDU (Context) */	if ((count = asn1_parse(np, length, &pdu)) < 0)		return;	if (pdu.type != BE_PDU) {		fputs("[no PDU]", stdout);		return;	}	if (count < length)		printf("[%d extra after PDU]", length - count);	if (vflag) {		fputs("{ ", stdout);	}	asn1_print(&pdu);	fputs(" ", stdout);	/* descend into PDU */	length = pdu.asnlen;	np = (u_char *)pdu.data.raw;	if (version == SNMP_VERSION_1 &&	    (pdu.id == GETBULKREQ || pdu.id == INFORMREQ || 	     pdu.id == V2TRAP || pdu.id == REPORT)) {	        printf("[v2 PDU in v1 message]");		return;	}	if (version == SNMP_VERSION_2 && pdu.id == TRAP) {	        printf("[v1 PDU in v2 message]");		return;	}	switch (pdu.id) {	case TRAP:		trappdu_print(np, length);		break;	case GETREQ:	case GETNEXTREQ:	case GETRESP:	case SETREQ:	case GETBULKREQ:	case INFORMREQ:	case V2TRAP:	case REPORT:		snmppdu_print(pdu.id, np, length);		break;	}	if (vflag) {		fputs("} ", stdout);	}}/* * Decode a scoped SNMP PDU. */static voidscopedpdu_print(const u_char *np, u_int length, int version){	struct be elem;	int i, count = 0;	/* Sequence */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_SEQ) {		fputs("[!scoped PDU]", stdout);		asn1_print(&elem);		return;	}	length = elem.asnlen;	np = (u_char *)elem.data.raw;	/* contextEngineID (OCTET STRING) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_STR) {		fputs("[contextEngineID!=STR]", stdout);		asn1_print(&elem);		return;	}	length -= count;	np += count;	fputs("E= ", stdout);	for (i = 0; i < (int)elem.asnlen; i++) {            printf("0x%02X", elem.data.str[i]);        }	fputs(" ", stdout);	/* contextName (OCTET STRING) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_STR) {		fputs("[contextName!=STR]", stdout);		asn1_print(&elem);		return;	}	length -= count;	np += count;	printf("C=%.*s ", (int)elem.asnlen, elem.data.str);	pdu_print(np, length, version);}/* * Decode SNMP Community Header (SNMPv1 and SNMPv2c) */static voidcommunity_print(const u_char *np, u_int length, int version){	struct be elem;	int count = 0;	/* Community (String) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_STR) {		fputs("[comm!=STR]", stdout);		asn1_print(&elem);		return;	}	/* default community */	if (strncmp((char *)elem.data.str, DEF_COMMUNITY,	    sizeof(DEF_COMMUNITY) - 1))		/* ! "public" */		printf("C=%.*s ", (int)elem.asnlen, elem.data.str);	length -= count;	np += count;	pdu_print(np, length, version);}/* * Decode SNMPv3 User-based Security Message Header (SNMPv3) */static voidusm_print(const u_char *np, u_int length){        struct be elem;	int count = 0;	/* Sequence */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_SEQ) {		fputs("[!usm]", stdout);		asn1_print(&elem);		return;	}	length = elem.asnlen;	np = (u_char *)elem.data.raw;	/* msgAuthoritativeEngineID (OCTET STRING) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_STR) {		fputs("[msgAuthoritativeEngineID!=STR]", stdout);		asn1_print(&elem);		return;	}	length -= count;	np += count;	/* msgAuthoritativeEngineBoots (INTEGER) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_INT) {		fputs("[msgAuthoritativeEngineBoots!=INT]", stdout);		asn1_print(&elem);		return;	}	if (vflag) 	        printf("B=%d ", elem.data.integer);	length -= count;	np += count;	/* msgAuthoritativeEngineTime (INTEGER) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_INT) {		fputs("[msgAuthoritativeEngineTime!=INT]", stdout);		asn1_print(&elem);		return;	}	if (vflag) 	        printf("T=%d ", elem.data.integer);	length -= count;	np += count;	/* msgUserName (OCTET STRING) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_STR) {		fputs("[msgUserName!=STR]", stdout);		asn1_print(&elem);		return;	}	length -= count;        np += count;	printf("U=%.*s ", (int)elem.asnlen, elem.data.str);	/* msgAuthenticationParameters (OCTET STRING) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_STR) {		fputs("[msgAuthenticationParameters!=STR]", stdout);		asn1_print(&elem);		return;	}	length -= count;        np += count;	/* msgPrivacyParameters (OCTET STRING) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_STR) {		fputs("[msgPrivacyParameters!=STR]", stdout);		asn1_print(&elem);		return;	}	length -= count;        np += count;	if (count < length)		printf("[%d extra after usm SEQ]", length - count);}/* * Decode SNMPv3 Message Header (SNMPv3) */static voidv3msg_print(const u_char *np, u_int length){	struct be elem;	int count = 0;	u_char flags;	int model;	const u_char *xnp = np;	int xlength = length;	/* Sequence */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_SEQ) {		fputs("[!message]", stdout);		asn1_print(&elem);		return;	}	length = elem.asnlen;	np = (u_char *)elem.data.raw;	if (vflag) {		fputs("{ ", stdout);	}	/* msgID (INTEGER) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_INT) {		fputs("[msgID!=INT]", stdout);		asn1_print(&elem);		return;	}	length -= count;	np += count;	/* msgMaxSize (INTEGER) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_INT) {		fputs("[msgMaxSize!=INT]", stdout);		asn1_print(&elem);		return;	}	length -= count;	np += count;	/* msgFlags (OCTET STRING) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_STR) {		fputs("[msgFlags!=STR]", stdout);		asn1_print(&elem);		return;	}	if (elem.asnlen != 1) {	        printf("[msgFlags size %d]", elem.asnlen);		return;	}	flags = elem.data.str[0];	if (flags != 0x00 && flags != 0x01 && flags != 0x03 	    && flags != 0x04 && flags != 0x05 && flags != 0x07) {		printf("[msgFlags=0x%02X]", flags);		return;	}	length -= count;	np += count;	fputs("F=", stdout);	if (flags & 0x01) fputs("a", stdout);	if (flags & 0x02) fputs("p", stdout);	if (flags & 0x04) fputs("r", stdout);	fputs(" ", stdout);	/* msgSecurityModel (INTEGER) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_INT) {		fputs("[msgSecurityModel!=INT]", stdout);		asn1_print(&elem);		return;	}	model = elem.data.integer;	length -= count;	np += count;	if (count < length)		printf("[%d extra after message SEQ]", length - count);	if (vflag) {		fputs("} ", stdout);	}	if (model == 3) {	    if (vflag) {		fputs("{ USM ", stdout);	    }	} else {	    printf("[security model %d]", model);            return;	}	np = xnp + (np - xnp);	length = xlength - (np - xnp);	/* msgSecurityParameters (OCTET STRING) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_STR) {		fputs("[msgSecurityParameters!=STR]", stdout);		asn1_print(&elem);		return;	}	length -= count;	np += count;	if (model == 3) {	    usm_print(elem.data.str, elem.asnlen);	    if (vflag) {		fputs("} ", stdout);	    }	}	if (vflag) {	    fputs("{ ScopedPDU ", stdout);	}	scopedpdu_print(np, length, 3);	if (vflag) {		fputs("} ", stdout);	}}/* * Decode SNMP header and pass on to PDU printing routines */voidsnmp_print(const u_char *np, u_int length){	struct be elem;	int count = 0;	int version = 0;	truncated = 0;	/* truncated packet? */	if (np + length > snapend) {		truncated = 1;		length = snapend - np;	}	putchar(' ');	/* initial Sequence */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_SEQ) {		fputs("[!init SEQ]", stdout);		asn1_print(&elem);		return;	}	if (count < length)		printf("[%d extra after iSEQ]", length - count);	/* descend */	length = elem.asnlen;	np = (u_char *)elem.data.raw;	/* Version (INTEGER) */	if ((count = asn1_parse(np, length, &elem)) < 0)		return;	if (elem.type != BE_INT) {		fputs("[version!=INT]", stdout);		asn1_print(&elem);		return;	}	switch (elem.data.integer) {	case SNMP_VERSION_1:	case SNMP_VERSION_2:	case SNMP_VERSION_3:	        if (vflag)		        printf("{ %s ", SnmpVersion[elem.data.integer]);		break;	default:	        printf("[version = %d]", elem.data.integer);		return;	}	version = elem.data.integer;	length -= count;	np += count;	switch (version) {	case SNMP_VERSION_1:        case SNMP_VERSION_2:		community_print(np, length, version);		break;	case SNMP_VERSION_3:		v3msg_print(np, length);		break;	default:	        printf("[version = %d]", elem.data.integer);		break;	}	if (vflag) {		fputs("} ", stdout);	}}

⌨️ 快捷键说明

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