--- ../nmap-4.01/output.cc 2006-04-18 04:13:19.000000000 +0000 +++ output.cc 2006-04-18 05:10:59.000000000 +0000 @@ -128,10 +128,11 @@ char rpcbuf[128]; char *xml_product = NULL, *xml_version = NULL, *xml_extrainfo = NULL; char *xml_hostname = NULL, *xml_ostype = NULL, *xml_devicetype = NULL; + char *xml_servicefp = NULL; if (xmlbuflen < 1) return -1; - xmlbuf[0] = '\0'; - if (!sd->name) return 0; + xmlbuf[0] = '\0'; + if (!sd->name && !sd->service_fp) return 0; if (sd->product) { xml_product = xml_convert(sd->product); @@ -181,6 +182,14 @@ versionxmlstring += '\"'; } + if (sd->service_fp) { + xml_servicefp = xml_sf_convert(xml_convert(sd->service_fp)); + versionxmlstring += " servicefp=\""; + versionxmlstring += xml_servicefp; + free(xml_devicetype); xml_servicefp = NULL; + versionxmlstring += '\"'; + } + if (o.rpcscan && sd->rpc_status == RPC_STATUS_GOOD_PROG) { snprintf(rpcbuf, sizeof(rpcbuf), " rpcnum=\"%li\" lowver=\"%i\" highver=\"%i\" proto=\"rpc\"", @@ -189,7 +198,7 @@ snprintf(xmlbuf, xmlbuflen, "", - sd->name, + sd->name? sd->name : "unknown", versionxmlstring.c_str(), (sd->service_tunnel == SERVICE_TUNNEL_SSL)? "tunnel=\"ssl\" " : "", (sd->dtype == SERVICE_DETECTION_TABLE)? "table" : "probed", @@ -319,7 +328,7 @@ char rpcinfo[64]; char rpcmachineinfo[64]; char portinfo[64]; - char xmlbuf[512]; + char xmlbuf[1024]; char grepvers[256]; char grepown[64]; char *p; @@ -617,6 +626,29 @@ return temp; } +/* Remove all "\nSF:" from fingerprints */ +char* xml_sf_convert (const char* str) { + char *temp, *p; + char substr[5]; + int strl = strlen(str); + temp = (char *) malloc(strl + 1); + char *end = (char *)str + strl + 1; + Strncpy(temp, str, strl + 1); + for (p = temp; end - str >= 4; p++) { + Strncpy(substr, str, 5); + substr[4] = 0; /* Null term substr */ + if (strcmp(substr, "\nSF:") == 0) { + str += 4; + Strncpy(p, str, strlen(str) + 1); /* Copy past "\nSF:" to end of str */ + if (p > temp) p--; + } else { + str++; + } + } + temp = (char *) realloc(temp, strlen(temp) + 1); + return temp; +} + /* Write some information (printf style args) to the given log stream(s). Remember to watch out for format string bugs. */ void log_write(int logt, const char *fmt, ...)