📄 service_scan.h
字号:
char *servicename; int matchtype; // SERVICEMATCH_REGEX or SERVICESCAN_STATIC char *matchstr; // Regular expression text, or static string int matchstrlen; // Because static strings may have embedded NULs pcre *regex_compiled; pcre_extra *regex_extra; bool matchops_ignorecase; bool matchops_dotall; bool isSoft; // is this a soft match? ("softmatch" keyword in nmap-service-probes) // If any of these 3 are non-NULL, a product, version, or template // string was given to deduce the application/version info via // substring matches. char *product_template; char *version_template; char *info_template; // More templates: char *hostname_template; char *ostype_template; char *devicetype_template; // The anchor is for SERVICESCAN_STATIC matches. If the anchor is not -1, the match must // start at that zero-indexed position in the response str. int matchops_anchor;// Details to fill out and return for testMatch() calls struct MatchDetails MD_return; // Use the six version templates and the match data included here // to put the version info into the given strings, (as long as the sizes // are sufficient). Returns zero for success. If no template is available // for a string, that string will have zero length after the function // call (assuming the corresponding length passed in is at least 1) int getVersionStr(const u8 *subject, int subjectlen, int *ovector, int nummatches, char *product, int productlen, char *version, int versionlen, char *info, int infolen, char *hostname, int hostnamelen, char *ostype, int ostypelen, char *devicetype, int devicetypelen);};class ServiceProbe { public: ServiceProbe(); ~ServiceProbe(); const char *getName() { return probename; } // Returns true if this is the "null" probe, meaning it sends no probe and // only listens for a banner. Only TCP services have this. bool isNullProbe() { return (probestringlen == 0); } bool isProbablePort(u16 portno); // Returns true if the portnumber given was listed // as a port that is commonly identified by this // probe (e.g. an SMTP probe would commonly identify port 25)// Amount of time to wait after a connection succeeds (or packet sent) for a responses. int totalwaitms; // Parses the "probe " line in the nmap-service-probes file. Pass the rest of the line // after "probe ". The format better be: // [TCP|UDP] [probename] "probetext" // the lineno is requested because this function will bail with an error // (giving the line number) if it fails to parse the string. void setProbeDetails(char *pd, int lineno); // obtains the probe string (in raw binary form) and the length. The string will be // NUL-terminated, but there may be other \0 in the string, so the termination is only // done for ease of printing ASCII probes in debugging cases. const u8 *getProbeString(int *stringlen) { *stringlen = probestringlen; return probestring; } void setProbeString(const u8 *ps, int stringlen); /* Protocols are IPPROTO_TCP and IPPROTO_UDP */ u8 getProbeProtocol() { assert(probeprotocol == IPPROTO_TCP || probeprotocol == IPPROTO_UDP); return probeprotocol; } void setProbeProtocol(u8 protocol) { probeprotocol = protocol; } // Takes a string as given in the 'ports '/'sslports ' line of // nmap-service-probes. Pass in the list from the appropriate // line. For 'sslports', tunnel should be specified as // SERVICE_TUNNEL_SSL. Otherwise use SERVICE_TUNNEL_NONE. The line // number is requested because this function will bail with an error // (giving the line number) if it fails to parse the string. Ports // are a comma separated list of ports and ranges // (e.g. 53,80,6000-6010). void setProbablePorts(enum service_tunnel_type tunnel, const char *portstr, int lineno); /* Returns true if the passed in port is on the list of probable ports for this probe and tunnel type. Use a tunnel of SERVICE_TUNNEL_SSL or SERVICE_TUNNEL_NONE as appropriate */ bool portIsProbable(enum service_tunnel_type tunnel, u16 portno); // Returns true if the passed in service name is among those that can // be detected by the matches in this probe; bool serviceIsPossible(const char *sname); // Takes a string following a Rarity directive in the probes file. // The string should contain a single integer between 1 and 9. The // default rarity is 5. This function will bail if the string is invalid. void setRarity(const char *portstr, int lineno); // Simply returns the rarity of this probe const int getRarity() { return rarity; } // Takes a match line in a probe description and adds it to the // list of matches for this probe. This function should be passed // the whole line starting with "match" or "softmatch" in // nmap-service-probes. The line number is requested because this // function will bail with an error (giving the line number) if it // fails to parse the string. void addMatch(const char *match, int lineno); // If the buf (of length buflen) matches one of the regexes in this // ServiceProbe, returns the details of the match (service name, // version number if applicable, and whether this is a "soft" match. // If the buf doesn't match, the serviceName field in the structure // will be NULL. The MatchDetails returned is only valid until the // next time this function is called. The only exception is that the // serviceName field can be saved throughought program execution. If // no version matched, that field will be NULL. This function may // return NULL if there are no match lines at all in this probe. const struct MatchDetails *testMatch(const u8 *buf, int buflen); char *fallbackStr; ServiceProbe *fallbacks[MAXFALLBACKS+1]; private: void setPortVector(std::vector<u16> *portv, const char *portstr, int lineno); char *probename; u8 *probestring; int probestringlen; std::vector<u16> probableports; std::vector<u16> probablesslports; int rarity; std::vector<const char *> detectedServices; int probeprotocol; std::vector<ServiceProbeMatch *> matches; // first-ever use of STL in Nmap!};class AllProbes {public: AllProbes(); ~AllProbes(); // Tries to find the probe in this AllProbes class which have the // given name and protocol. It can return the NULL probe. ServiceProbe *getProbeByName(const char *name, int proto); std::vector<ServiceProbe *> probes; // All the probes except nullProbe ServiceProbe *nullProbe; // No probe text - just waiting for banner // Before this function is called, the fallbacks exist as unparsed // comma-separated strings in the fallbackStr field of each probe. // This function fills out the fallbacks array in each probe with // an ordered list of pointers to which probes to try. This is both for // efficiency and to deal with odd cases like the NULL probe and falling // back to probes later in the file. This function also free()s all the // fallbackStrs. void compileFallbacks(); int isExcluded(unsigned short port, int proto); struct scan_lists *excludedports; static AllProbes *service_scan_init(void); static void service_scan_free(void);protected: static AllProbes *global_AP;};/********************** PROTOTYPES ***********************************//* Parses the given nmap-service-probes file into the AP class Must NOT be made static because I have external maintenance tools (servicematch) which use this */void parse_nmap_service_probe_file(AllProbes *AP, char *filename);/* Execute a service fingerprinting scan against all open ports of the Targets specified. */int service_scan(std::vector<Target *> &Targets);#endif /* SERVICE_SCAN_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -