/* ----------------------------------------------------------------------------- Source : NoPasting Tool Description : Ce code permet d'envoyer, en ligne de commande, un source sur le service NoPasting hébergé sur http://www.sagwin.org/NoPasting/ Auteur : Thaeron Date : 25/11/2006 Version : 0.2 Licence : GPL ------------------------------------------------------------------------------- */ #include #include #include #include #ifdef WIN32 #include #else #include #include #include #include #include #include #include #include typedef struct sockaddr_in SOCKADDR_IN; #define closesocket(x) close(x) #endif #define NPT_VERSION "0.2" int connexion_tcp (char *serv, int port) { SOCKADDR_IN SinDist; struct hostent *host; int sock; sock = socket (AF_INET, SOCK_STREAM, 0); if (sock == -1) { perror ("socket"); return (-1); } SinDist.sin_family = AF_INET; SinDist.sin_addr.s_addr = inet_addr (serv); SinDist.sin_port = htons (port); if (SinDist.sin_addr.s_addr == -1) { host = gethostbyname (serv); if (host == NULL) { printf ("Erreur : Résolution de l'host %s impossible", serv); return (-1); } memcpy ((char *) &SinDist.sin_addr.s_addr, host->h_addr, host->h_length); } if (connect (sock, (struct sockaddr *) &SinDist, sizeof (SOCKADDR_IN)) < 0) { printf ("Erreur : Connexion à %s impossible", serv); return (-1); } return (sock); } int send_file (int sock, char *filen) { FILE *f; char buffer[513], num[30]; int taille = 0, i; srand (time (NULL)); f = fopen (filen, "r"); if (!f) return (0); fseek (f, 0, SEEK_END); taille = ftell (f); rewind (f); for (i = 0; i < 29; i++) num[i] = (rand () % 10) + '0'; num[i] = 0; send (sock, "POST /NoPasting/uppasting.php HTTP/1.1\n", 39, 0); send (sock, "Host: www.sagwin.org\n", 21, 0); sprintf (buffer, "User-Agent: NoPasting Tool (v%s)\n", NPT_VERSION); send (sock, buffer, strlen (buffer), 0); send (sock, "Referer: http://www.sagwin.org/NoPasting/\n", 42, 0); sprintf (buffer, "Content-Type: multipart/form-data; boundary=---------------------------%s\n", num); send (sock, buffer, strlen (buffer), 0); sprintf (buffer, "Content-Length: %d\n\n", taille + 221 + strlen (filen)); send (sock, buffer, strlen (buffer), 0); sprintf (buffer, "-----------------------------%s\n", num); send (sock, buffer, strlen (buffer), 0); sprintf (buffer, "Content-Disposition: form-data; name=\"fichier\"; filename=\"%s\"\n", filen); send (sock, buffer, strlen (buffer), 0); send (sock, "Content-Type: application/octet-stream\n\n", 40, 0); while (1) { buffer[0] = 0; fgets (buffer, 512, f); if (feof (f) && buffer[0] == 0) break; send (sock, buffer, strlen (buffer), 0); } fclose (f); sprintf (buffer, "\n-----------------------------%s--\n", num); send (sock, buffer, strlen (buffer), 0); return (1); } char * recv_rep (int sock) { char *buffer = NULL, *url, *t1, *t2; int taille = 0, tmp_len; while (1) { buffer = realloc (buffer, taille + 513); tmp_len = recv (sock, buffer + taille, 512, 0); if (tmp_len <= 0) break; taille += tmp_len; buffer[taille] = 0; } t1 = strstr (buffer, ""); if (!t2) { puts ("Artunnng probleme !!!"); free (buffer); return (NULL); } url = (char *) malloc (t2 - t1 + 1); strncpy (url, t1, t2 - t1); url[t2 - t1] = 0; free (buffer); return (url); } int main (int argc, char *argv[]) { int sock, i; char *url; #ifdef WIN32 WSADATA Data; WSAStartup (MAKEWORD (2, 2), &Data); #else signal (SIGPIPE, SIG_IGN); #endif if (argc < 2) { printf ("NoPasting Tool : cet outil permet d'envoyer, en ligne de commande, un source"); printf (" sur le service NoPasting hébergé sur http://www.sagwin.org/NoPasting/\n"); printf ("Usage : %s source1.c source2.c ...\n", argv[0]); #ifdef WIN32 getchar(); #endif return (0); } for (i = 1; i < argc; i++) { sock = connexion_tcp ("www.sagwin.org", 80); if (sock == -1) return (0); if (send_file (sock, argv[i])) { url = recv_rep (sock); printf ("%s => %s\n", argv[i], url); free (url); } else printf ("Erreur : Impossible d'ouvrir le fichier %s\n", argv[i]); closesocket (sock); } #ifdef WIN32 getchar(); #endif return (0); }