/* **++ ** FACILITY: Remote URL Activator ** ** MODULE DESCRIPTION: ** ** This is a M$ Windoze-part of the "remote UTL activator", contains a code to receive ** packet with URL to start a default browser wih it. ** ** AUTHOR: Ruslan R. Laishev ** Copyright 2009, Ruslan R. Laishev ** ** Build: ** cl url_exec.c /ML ** ** Using: ** URL_Exec [] ** Example: ** c:\>URL_Exec trhdfh#$%gvbv 8133 ** ** MODIFICATION HISTORY: ** ** 7-JUL-2009 RRL Initial coding. **-- */ #include #include #include #include #include #include #include #include "md5.h" #pragma comment(lib, "ws2_32.lib") #pragma comment(lib, "shell32.lib") struct pdu { unsigned short len; unsigned char hash[16], url[1]; }; int main(int argc, char* argv[]) { int rc = 0,secretlen = 0, buflen, sock = 0; char *secret, buf [ 1024], cmd [1024],hash [16]; WSADATA wsadata; struct pdu *ptr = (struct pdu *) &buf; short port = 8133; struct sockaddr_in addr; MD5_CTX md5; /* ** Dumb checking for input arguments */ if ( argc < 2 ) { printf("Usage:\n URL_Exec []\n"); return -1; } /* ** Input arguments: shared secret & port */ secret = argv[1]; secretlen = strlen(secret); printf("Secret (%u): %.*s\n",secretlen,secretlen,secret); if ( (argc > 2) && argv[2] ) port = atoi(argv[2]); /* ** Create a UDP socket, start listening... */ if ( WSAStartup(MAKEWORD(1,1), &wsadata) ) return -1; if ( 0 > (sock = socket (AF_INET, SOCK_DGRAM, 0)) ) { perror( "socket"); return -1; } memset(&addr, 0, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htons(INADDR_ANY); addr.sin_port = htons(port); if ( bind(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0 ) { perror("bind"); WSACleanup(); return -1; } printf("Start listening - press Control+C to abort\n"); while ( 0 <= (rc = recv(sock , buf, sizeof(buf), 0)) ) { if ( rc > 0 ) printf("Got: %.*s\n",ntohs(ptr->len),ptr->url); else continue; ptr->len = ntohs(ptr->len); ptr->url[ptr->len] = '\0'; /* ** Compute etalon hash and compare */ MD5Init(&md5); MD5Update(&md5,&ptr->url,ptr->len); MD5Update(&md5,secret,secretlen); MD5Final(&hash,&md5); if ( memcmp(&hash,&ptr->hash,16) ) { printf("Hash error!!!"); continue; } /* ** Start Internet Browser with the URL as argument */ ShellExecute ( NULL, "open", ptr->url, NULL, NULL, SW_SHOWNORMAL ); } printf("rc = %d\n",rc); if ( rc < 0 ) { WSAGetLastError(); perror( "recv"); return -1; } /* ** Cleanup & exit */ WSACleanup(); return 0; }