smbutil.c
来自「TCPDUMP的C语言源代码,是在数据链路层的应用」· C语言 代码 · 共 1,890 行 · 第 1/5 页
C
1,890 行
strsize = *len - 2; } } else { /* * Counted string. */ strsize = *len; } if (!use_unicode) { while (strsize != 0) { TCHECK(s[0]); if (l >= MAX_UNISTR_SIZE) break; if (isprint(s[0])) buf[l] = s[0]; else { if (s[0] == 0) break; buf[l] = '.'; } l++; s++; strsize--; } } else { while (strsize != 0) { TCHECK2(s[0], 2); if (l >= MAX_UNISTR_SIZE) break; if (s[1] == 0 && isprint(s[0])) { /* It's a printable ASCII character */ buf[l] = s[0]; } else { /* It's a non-ASCII character or a non-printable ASCII character */ if (s[0] == 0 && s[1] == 0) break; buf[l] = '.'; } l++; s += 2; if (strsize == 1) break; strsize -= 2; } } buf[l] = 0; return buf;trunc: return NULL;}static const u_char *smb_fdata1(const u_char *buf, const char *fmt, const u_char *maxbuf, int unicodestr){ int reverse = 0; const char *attrib_fmt = "READONLY|HIDDEN|SYSTEM|VOLUME|DIR|ARCHIVE|"; while (*fmt && buf<maxbuf) { switch (*fmt) { case 'a': TCHECK(buf[0]); write_bits(buf[0], attrib_fmt); buf++; fmt++; break; case 'A': TCHECK2(buf[0], 2); write_bits(EXTRACT_LE_16BITS(buf), attrib_fmt); buf += 2; fmt++; break; case '{': { char bitfmt[128]; char *p; int l; p = strchr(++fmt, '}'); l = PTR_DIFF(p, fmt); if ((unsigned int)l > sizeof(bitfmt) - 1) l = sizeof(bitfmt)-1; strncpy(bitfmt, fmt, l); bitfmt[l] = '\0'; fmt = p + 1; TCHECK(buf[0]); write_bits(buf[0], bitfmt); buf++; break; } case 'P': { int l = atoi(fmt + 1); TCHECK2(buf[0], l); buf += l; fmt++; while (isdigit((unsigned char)*fmt)) fmt++; break; } case 'r': reverse = !reverse; fmt++; break; case 'b': { unsigned int x; TCHECK(buf[0]); x = buf[0]; printf("%u (0x%x)", x, x); buf += 1; fmt++; break; } case 'd': { unsigned int x; TCHECK2(buf[0], 2); x = reverse ? EXTRACT_16BITS(buf) : EXTRACT_LE_16BITS(buf); printf("%d (0x%x)", x, x); buf += 2; fmt++; break; } case 'D': { unsigned int x; TCHECK2(buf[0], 4); x = reverse ? EXTRACT_32BITS(buf) : EXTRACT_LE_32BITS(buf); printf("%d (0x%x)", x, x); buf += 4; fmt++; break; } case 'L': { u_int64_t x; TCHECK2(buf[0], 8); x = reverse ? EXTRACT_64BITS(buf) : EXTRACT_LE_64BITS(buf); printf("%" PRIu64 " (0x%" PRIx64 ")", x, x); buf += 8; fmt++; break; } case 'M': { /* Weird mixed-endian length values in 64-bit locks */ u_int32_t x1, x2; u_int64_t x; TCHECK2(buf[0], 8); x1 = reverse ? EXTRACT_32BITS(buf) : EXTRACT_LE_32BITS(buf); x2 = reverse ? EXTRACT_32BITS(buf + 4) : EXTRACT_LE_32BITS(buf + 4); x = (((u_int64_t)x1) << 32) | x2; printf("%" PRIu64 " (0x%" PRIx64 ")", x, x); buf += 8; fmt++; break; } case 'B': { unsigned int x; TCHECK(buf[0]); x = buf[0]; printf("0x%X", x); buf += 1; fmt++; break; } case 'w': { unsigned int x; TCHECK2(buf[0], 2); x = reverse ? EXTRACT_16BITS(buf) : EXTRACT_LE_16BITS(buf); printf("0x%X", x); buf += 2; fmt++; break; } case 'W': { unsigned int x; TCHECK2(buf[0], 4); x = reverse ? EXTRACT_32BITS(buf) : EXTRACT_LE_32BITS(buf); printf("0x%X", x); buf += 4; fmt++; break; } case 'l': { fmt++; switch (*fmt) { case 'b': TCHECK(buf[0]); stringlen = buf[0]; printf("%u", stringlen); buf += 1; break; case 'd': TCHECK2(buf[0], 2); stringlen = reverse ? EXTRACT_16BITS(buf) : EXTRACT_LE_16BITS(buf); printf("%u", stringlen); buf += 2; break; case 'D': TCHECK2(buf[0], 4); stringlen = reverse ? EXTRACT_32BITS(buf) : EXTRACT_LE_32BITS(buf); printf("%u", stringlen); buf += 4; break; } fmt++; break; } case 'S': case 'R': /* like 'S', but always ASCII */ { /*XXX unistr() */ const char *s; u_int32_t len; len = 0; s = unistr(buf, &len, (*fmt == 'R') ? 0 : unicodestr); if (s == NULL) goto trunc; printf("%s", s); buf += len; fmt++; break; } case 'Z': case 'Y': /* like 'Z', but always ASCII */ { const char *s; u_int32_t len; TCHECK(*buf); if (*buf != 4 && *buf != 2) { printf("Error! ASCIIZ buffer of type %u", *buf); return maxbuf; /* give up */ } len = 0; s = unistr(buf + 1, &len, (*fmt == 'Y') ? 0 : unicodestr); if (s == NULL) goto trunc; printf("%s", s); buf += len + 1; fmt++; break; } case 's': { int l = atoi(fmt + 1); TCHECK2(*buf, l); printf("%-*.*s", l, l, buf); buf += l; fmt++; while (isdigit((unsigned char)*fmt)) fmt++; break; } case 'c': { TCHECK2(*buf, stringlen); printf("%-*.*s", (int)stringlen, (int)stringlen, buf); buf += stringlen; fmt++; while (isdigit((unsigned char)*fmt)) fmt++; break; } case 'C': { const char *s; s = unistr(buf, &stringlen, unicodestr); if (s == NULL) goto trunc; printf("%s", s); buf += stringlen; fmt++; break; } case 'h': { int l = atoi(fmt + 1); TCHECK2(*buf, l); while (l--) printf("%02x", *buf++); fmt++; while (isdigit((unsigned char)*fmt)) fmt++; break; } case 'n': { int t = atoi(fmt+1); char nbuf[255]; int name_type; int len; switch (t) { case 1: name_type = name_extract(startbuf, PTR_DIFF(buf, startbuf), maxbuf, nbuf); if (name_type < 0) goto trunc; len = name_len(buf, maxbuf); if (len < 0) goto trunc; buf += len; printf("%-15.15s NameType=0x%02X (%s)", nbuf, name_type, name_type_str(name_type)); break; case 2: TCHECK(buf[15]); name_type = buf[15]; printf("%-15.15s NameType=0x%02X (%s)", buf, name_type, name_type_str(name_type)); buf += 16; break; } fmt++; while (isdigit((unsigned char)*fmt)) fmt++; break; } case 'T': { time_t t; struct tm *lt; const char *tstring; u_int32_t x; switch (atoi(fmt + 1)) { case 1: TCHECK2(buf[0], 4); x = EXTRACT_LE_32BITS(buf); if (x == 0 || x == 0xFFFFFFFF) t = 0; else t = make_unix_date(buf); buf += 4; break; case 2: TCHECK2(buf[0], 4); x = EXTRACT_LE_32BITS(buf); if (x == 0 || x == 0xFFFFFFFF) t = 0; else t = make_unix_date2(buf); buf += 4; break; case 3: TCHECK2(buf[0], 8); t = interpret_long_date(buf); buf += 8; break; default: t = 0; break;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?