#include #include "libsockets.h" #include "libkeef.h" // for strmatch(), etc. #if defined (UNIX) #include // for signal() #include // for SIGBUS, etc. #include #else if defined(WIN32) // Windows #include // for closesocket() #include // for _getcwd() #include // for getpid() #define sleep(SECS) Sleep(SECS*1000) #define close(SOCKET) closesocket(SOCKET) #define read(SOCKET,BUF,LEN) recv(SOCKET,BUF,LEN,/*flags=*/0) #define write(SOCKET,BUF,LEN) send(SOCKET,BUF,LEN,/*flags=*/0) #endif #include // for time(), strftime(), etc. /*global*/int g_fDebug = 0; #define ErrorLog printf #define DebugLog if (g_fDebug) printf #define MAXLEN_HOSTNAME 200 #ifndef PATH_SLASH #ifdef UNIX #define PATH_SLASH '/' #else #define PATH_SLASH '\\' #endif #endif #ifndef TXTNL #define TXTNL "\r\n" #endif #define MAXLEN_OBSERVATIONS 200 #define MAXLEN_IP (3+1+3+1+3+1+3+1) #define MAX_IPS 20 #define MAXLEN_WEBSERVER 100 #define MAXLEN_PROTOCOL 50 #define MAXLEN_PROTOCODE 100 typedef struct { char* pszSourceURL; BOOL fVignette; BOOL fWebObjects; BOOL fOpenMarket; BOOL fFutureTense; BOOL fColdFusion; // - - - - - - - - - - - - - - - BOOL fHostnameResolves; char* pszCanonicalName; BOOL fDNSRoundRobin; char szIP[(MAXLEN_IP+3) * MAX_IPS]; // - - - - - - - - - - - - - - - BOOL fHostConnects; BOOL fHostResponds; char szProtocol[MAXLEN_PROTOCOL+1]; char szProtocode[MAXLEN_PROTOCODE+1]; char szWebServer[MAXLEN_WEBSERVER+1]; BOOL fCookies; BOOL fFrames; BOOL fClientSideScripting; } ANALYSIS; //----------------------------------------------------------------------------- static char *g_Synopsis[] = { //----------------------------------------------------------------------------- " ", "analyze - hit site to determine certain things by sockets", " ", "usage: analyze [-v] [-html] ", " ", "where:", " -v : verbosity for sockets debugging", " -html : put output in HTML wrapper", " : just copy and paste from a browser", " ", "History:", " 05 Aug 99 : keef wrote", " ", "(c) Copyright 1999 Ridgeware, Inc.", " ", NULL }; //----------------------------------------------------------------------------- static void Exit (int iExitCode) //----------------------------------------------------------------------------- { #ifdef WIN32 WSACleanup(); #endif exit (iExitCode); } // Exit //----------------------------------------------------------------------------- static void SynopsisAndExit () //----------------------------------------------------------------------------- { for (int ii=0; g_Synopsis[ii]; ++ii) { printf ("%s\n", g_Synopsis[ii]); } Exit(0); } // SynopsisAndExit #define TF(X) ((X)?"TRUE":"false") //----------------------------------------------------------------------------- void HtmlReport (WEBURL* pWebURL, ANALYSIS* pAnalysis) //----------------------------------------------------------------------------- { printf ("
\n"); printf ("%s\n", pAnalysis->pszSourceURL); printf ("
\n"); printf ("
\n"); printf ("Straight off the URL...\n"); printf ("
\n");
	printf ("  %-20s ==> %s\n", "Hostname",     pWebURL->szWebHostname);
	printf ("  %-20s ==> %s\n", "Vignette?",    TF(pAnalysis->fVignette));
	printf ("  %-20s ==> %s\n", "WebObjects?",  TF(pAnalysis->fWebObjects));
	printf ("  %-20s ==> %s\n", "OpenMarket?",  TF(pAnalysis->fOpenMarket));
	printf ("  %-20s ==> %s\n", "FutureTense?", TF(pAnalysis->fFutureTense));
	printf ("  %-20s ==> %s\n", "ColdFusion?",  TF(pAnalysis->fColdFusion));
	printf ("\n
"); printf ("Using DNS (domain name service)...\n"); printf ("
\n");
	printf ("  %-20s ==> %s\n", "Hostname Resolves?", TF(pAnalysis->fHostnameResolves));
	//printf ("  %-20s ==> %s\n", "Canonical Hostname", pAnalysis->pszCanonicalName);
	printf ("  %-20s ==> %s\n", "DNS Round Robin?", TF(pAnalysis->fDNSRoundRobin));
	if (pAnalysis->fDNSRoundRobin)
		printf ("  %-20s\n  %s\n", "IP Address Pool:", pAnalysis->szIP);
	else
		printf ("  %-20s ==> %s\n", "Current IP Address", pAnalysis->szIP);
	printf ("\n
"); printf ("By connecting to the host...\n"); printf ("
\n");
	printf ("  %-20s ==> %s\n", "Host Connects?",   TF(pAnalysis->fHostConnects));
	printf ("  %-20s ==> %s\n", "Host Responds?",   TF(pAnalysis->fHostResponds));
	printf ("  %-20s ==> %s\n", "Protocol Version", pAnalysis->szProtocol);
	printf ("  %-20s ==> %s\n", "Protocol Response", pAnalysis->szProtocode);
	printf ("  %-20s ==> %s\n", "HTTP Software",    pAnalysis->szWebServer);
	printf ("  %-20s ==> %s\n", "Cookies?",         TF(pAnalysis->fCookies));
	printf ("  %-20s ==> %s\n", "Frames?",          TF(pAnalysis->fFrames));
	printf ("  %-20s ==> %s\n", "Client-side Scripts?", TF(pAnalysis->fClientSideScripting));
	printf ("
\n"); } // HtmlReport //----------------------------------------------------------------------------- void ConsoleReport (WEBURL* pWebURL, ANALYSIS* pAnalysis) //----------------------------------------------------------------------------- { printf ("----------------------------------------------------------------------\n"); printf ("%s\n", pAnalysis->pszSourceURL); printf ("----------------------------------------------------------------------\n"); printf ("\n"); printf (" Straight off the URL...\n"); printf (" %-20s ==> %s\n", "Hostname", pWebURL->szWebHostname); printf (" %-20s ==> %s\n", "Vignette?", TF(pAnalysis->fVignette)); printf (" %-20s ==> %s\n", "WebObjects?", TF(pAnalysis->fWebObjects)); printf (" %-20s ==> %s\n", "OpenMarket?", TF(pAnalysis->fOpenMarket)); printf (" %-20s ==> %s\n", "FutureTense?", TF(pAnalysis->fFutureTense)); printf (" %-20s ==> %s\n", "ColdFusion?", TF(pAnalysis->fColdFusion)); printf ("\n"); printf (" Using DNS (domain name service)...\n"); printf (" %-20s ==> %s\n", "Hostname Resolves?", TF(pAnalysis->fHostnameResolves)); //printf (" %-20s ==> %s\n", "Canonical Hostname", pAnalysis->pszCanonicalName); printf (" %-20s ==> %s\n", "DNS Round Robin?", TF(pAnalysis->fDNSRoundRobin)); if (pAnalysis->fDNSRoundRobin) printf (" %-20s\n %s\n", "IP Address Pool:", pAnalysis->szIP); else printf (" %-20s ==> %s\n", "Current IP Address", pAnalysis->szIP); printf ("\n"); printf (" By connecting to the host...\n"); printf (" %-20s ==> %s\n", "Host Connects?", TF(pAnalysis->fHostConnects)); printf (" %-20s ==> %s\n", "Host Responds?", TF(pAnalysis->fHostResponds)); printf (" %-20s ==> %s\n", "Protocol Version", pAnalysis->szProtocol); printf (" %-20s ==> %s\n", "Protocol Response", pAnalysis->szProtocode); printf (" %-20s ==> %s\n", "HTTP Software", pAnalysis->szWebServer); printf (" %-20s ==> %s\n", "Cookies?", TF(pAnalysis->fCookies)); printf (" %-20s ==> %s\n", "Frames?", TF(pAnalysis->fFrames)); printf (" %-20s ==> %s\n", "Client-side Scripts?", TF(pAnalysis->fClientSideScripting)); } // ConsoleReport //------------------------------------------------------------------------------ main (int argc, char* argv[]) //------------------------------------------------------------------------------ { char* pszFullURL = NULL; char** pArgArray[] = {&pszFullURL, NULL}; int iThisArg = 0; int iMaxArgs = 1; BOOL fHTML = FALSE; ANALYSIS analysis; for (int ii=1; ii= iMaxArgs) { printf ("analyze: argument '%s' not understood.\n", argv[ii]); SynopsisAndExit(); } *(pArgArray[iThisArg]) = argv[ii]; ++iThisArg; } } // check required args: if (!pszFullURL || !(*pszFullURL)) SynopsisAndExit (); WEBURL WebURL; DebugLog ("Parse the URL...\n"); if (!ParseWebURL (pszFullURL, &WebURL)) { ErrorLog ("analyze: invalid URL '%s'.\n", pszFullURL); Exit (-1); } memset (&analysis, sizeof(analysis), 0); analysis.pszSourceURL = pszFullURL; analysis.fVignette = (strchr (WebURL.szWebRestURL, ',') != NULL); analysis.fWebObjects = FALSE; // TODO analysis.fOpenMarket = FALSE; // TODO analysis.fFutureTense = FALSE; // TODO analysis.fColdFusion = (strstr (WebURL.szWebRestURL, ".cfm") != NULL); #ifdef WIN32 WORD wVersionRequested = MAKEWORD(1,1); WSADATA wsaData; if (WSAStartup (wVersionRequested, &wsaData)) { ErrorLog ("analyze: could not find a compatible WINSOCK DLL\n"); Exit (-1); } #endif struct sockaddr_in AddrServer; //char szCanonical[MAXLEN_HOSTNAME+1]; int iLineNum = 0; int fdSocket; DebugLog ("Resolve hostname into an IP address...\n"); if (!ValidateHost (&AddrServer, WebURL.szWebHostname)) /*szCanonical, MAXLEN_HOSTNAME*/ { analysis.fHostnameResolves = FALSE; goto Report; } analysis.fHostnameResolves = TRUE; analysis.fDNSRoundRobin = FALSE; strcpy (analysis.szIP, addr2ascii (AF_INET, &(AddrServer.sin_addr.s_addr), sizeof(AddrServer.sin_addr.s_addr), NULL)); analysis.pszCanonicalName = ""; /*szCanonical*/ DebugLog ("Look for DNS round-robin...\n"); for (int ii=0; ii // ... DebugLog ("-| %s\n", szLine); if (++iLineNum == 1) { char* pSpace = strchr (szLine, ' '); if (pSpace) *pSpace = 0; strncpy (analysis.szProtocol, szLine, MAXLEN_PROTOCOL); analysis.szProtocol[MAXLEN_PROTOCOL] = 0; if (pSpace) { *pSpace = ' '; strncpy (analysis.szProtocode, pSpace+1, MAXLEN_PROTOCODE); analysis.szProtocode[MAXLEN_PROTOCODE] = 0; } } else if (strmatchN (szLine, "Server:")) { strncpy (analysis.szWebServer, szLine+sizeof("Server:"), MAXLEN_WEBSERVER); analysis.szWebServer[MAXLEN_WEBSERVER] = 0; } if (strmatchN (szLine, "Set-cookie:")) analysis.fCookies = TRUE; if (strstr (szLine, "