📄 print-snmp.c
字号:
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 + -