main.c
Código: Seleccionar todo
#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#include "header.h"
int main(void){
char *szFileURL;
char *szFilename;
DeleteFile("logfile.txt");
szFilename = (char *) malloc(256);
memset(szFilename, 0, 256);
GetModuleFileName(0, szFilename, 256);
szFileURL = (char *) malloc(128);
memset(szFileURL, 0, 128);
if(rsUploadFile(szFilename, "test.exe", szFileURL) == FALSE){
logLine("could not upload file!");
return 0;
} else {
logLine("upload successful\r\n\turl: %s", szFileURL);
return 0;
}
}
Código: Seleccionar todo
/*
* rsUploadFile()
* szFilename -> file to be uploaded (ie - c:\windows\virus.exe)
* szUploadName -> name to be uploaded as (ie - virus.exe)
* szFileURL -> buffer to accept uploaded file path
* 128 bytes is plenty (http://rapidshare.com/xxxxxxxxx/filename.exe)
*
* -> handles information from rsGetUploadServer() and rsCreateHeader()
* -> sends headers and requests to www.rapidshare.com
* -> reads file stored at szFilename and sends 1024 bytes at a time to the
* server returned from rsGetUploadServer
* -> parses data returned from www.rapidshare.com
*
* returns TRUE on success
* FALSE on failure
*/
BOOL rsUploadFile(char *szFilename, char *szUploadName, char *szFileURL){
HANDLE hFile;
int nFileSize = 0;
hFile = CreateFile(szFilename, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(hFile == INVALID_HANDLE_VALUE){
logLine("could not open '%s'!", szFilename);
return FALSE;
}
nFileSize = GetFileSize(hFile, 0);
if(nFileSize < 1024){ logLine("unrealistic or invalid file size: %d", nFileSize);
return FALSE;
}
logLine("file size: %d", nFileSize);
char *szServer;
char *szHeader;
wsaInitiated = initWSA();
// create buffer to hold upload server
szServer = (char *) malloc(28);
memset(szServer, 0, 28);
// get upload server
if(rsGetUploadServer(szServer) == FALSE){
logLine("could not find valid upload server!");
return FALSE;
}
logLine("found valid server... creating header");
// create buffer to hold header
szHeader = (char *) malloc(640);
memset(szHeader, 0, 640);
// create header
rsCreateHeader(szUploadName, nFileSize, szHeader);
logLine("created header... attempting connection");
struct hostent *pHostEnt;
pHostEnt = gethostbyname(szServer);
if(!pHostEnt){
logLine("gethostbyname() error: %d", WSAGetLastError());
return FALSE;
}
SOCKET sock;
// create socket
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sock == INVALID_SOCKET){
logLine("socket() error: %d", WSAGetLastError());
return FALSE;
}
SOCKADDR_IN pSockAddr;
// configure socket
pSockAddr.sin_family = AF_INET;
pSockAddr.sin_port = htons(80);
pSockAddr.sin_addr.S_un.S_addr = *((unsigned long *) pHostEnt->h_addr_list[0]);
int ret = 0;
// attempt to connect to server
ret = connect(sock, (struct sockaddr *) &pSockAddr, sizeof(struct sockaddr));
if(ret != 0){
logLine("connect() error: %d", WSAGetLastError());
closesocket(sock);
return FALSE;
}
logLine("\r\nconnected to %s\r\n", szServer);
// send header
transfer(szHeader);
free(szHeader);
char *buffer;
int x = 0;
int i = 0;
// create buffer for file contents
buffer = (char *) malloc(1024);
memset(buffer, 0, 1024);
SetFilePointer(hFile, 0, 0, FILE_BEGIN);
while(1){
i = 0;
// read 1024 bytes from file
ret = ReadFile(hFile, buffer, 1024, &i, 0);
if(ret == 0)
// error checking
break;
if(i == 0)
// error checking
break;
// send 1024 (or whatever's left) to server
ret = send(sock, buffer, i, 0);
// add bytes read to offset in file
x += i;
logLine("sent %d of %d bytes", x, nFileSize);
}
CloseHandle(hFile);
// error checking
if(x != nFileSize){
logLine("send error: %d [%d != %d]!", WSAGetLastError(), x, nFileSize);
closesocket(sock);
return FALSE;
}
logLine("sent all %d bytes!", x);
char *szHeaderTail; // oxymoron? lawlzzzzz
// create buffer for the end of the header
szHeaderTail = (char *) malloc(128);
memset(szHeaderTail, 0, 128);
sprintf(szHeaderTail, "\r\n%s--\r\n", szBoundary);
// send end of header
transfer(szHeaderTail);
free(szHeaderTail);
logLine("sent entire packet... fetching results");
// restore buffer to recv data
memset(buffer, 0, 1024);
// try to recv 1023 bytes from server
ret = recv(sock, buffer, 1023, 0);
if(ret != 0){
// success
logLine(buffer);
closesocket(sock);
} else {
// failure
logLine("recv error: %d", WSAGetLastError());
closesocket(sock);
return FALSE;
}
// parse data from recv buffer
x = ret;
while(buffer[x] != '?')
// search for "?"
x--;
x--; // we want the byte before "?"
i = x;
while(buffer[i] != '=') // search for "="
i--;
i++; // we want the byte after "="
int a = 0;
int b = 0;
for(a = i; a <= x; a++) // start at byte after "=" and end at byte before "?"
szFileURL[b++] = buffer[a];
szFileURL[b++] = 0; // end of string = char(0)
if(szFileURL) // error checking
return TRUE;
else
return FALSE;
}
/*
* rsGetUploadServer()
* szBuffer -> buffer to accept upload server
* 28 bytes is plenty (http://rsXXXl3.rapidshare.com)
*
* querys www.rapidshare.com for the next avalible (preffered) server to upload files to
*
* returns TRUE on success
* FALSE on failure
*/
BOOL rsGetUploadServer(char *szBuffer){
SOCKET sock;
struct hostent *pHostEnt;
int ret = 0;
char *buf;
char *buf2;
// make sure WSAStartup() has been called and succeded
if(wsaInitiated == FALSE){
wsaInitiated = initWSA();
if(wsaInitiated == FALSE){
logLine("WSAStartup() error: %d", WSAGetLastError());
return FALSE;
}
}
pHostEnt = gethostbyname("www.rapidshare.com");
if(!pHostEnt){
logLine("gethostname() error: %d", WSAGetLastError());
return FALSE;
}
SOCKADDR_IN pSockAddr;
// create socked and error check
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sock == INVALID_SOCKET){
logLine("socket() error: %d", WSAGetLastError());
return FALSE;
}
// configure socket
pSockAddr.sin_family = AF_INET;
pSockAddr.sin_port = htons(80);
pSockAddr.sin_addr.S_un.S_addr = *((unsigned long *)pHostEnt->h_addr_list[0]);
// attempt to connect to www.rapidshare.com
if(connect(sock, (struct sockaddr *)&pSockAddr, sizeof(struct sockaddr)) != 0){
logLine("connect() error: %d", WSAGetLastError());
closesocket(sock);
return FALSE;
}
logLine("connected to www.rapidshare.com... getting prefered server information.");
// request next upload server
transfer("GET /cgi-bin/rsapi.cgi?sub=nextuploadserver_v1 HTTP/1.0\r\n\r\n");
// create buffer to recv data
buf = (char *) malloc(512);
memset(buf, 0, 512);
// recv 511 bytes from rapidshare
ret = recv(sock, buf, 511, 0);
buf2 = (char *) malloc(56);
// the next lines parse data for server
int a = ret;
int b = 0;
int c = 0;
while(buf[a] != '\n') // search for new line
a--;
a++; // we want byte after new line
for(b = a; b <= ret; b++)
buf2[c++] = buf[b]; // add to buffer
buf2[c++] = 0; // end of string = char(0)
sprintf(szBuffer, "rs%sl3.rapidshare.com", buf2); // rs_SERVER_NAME_l3.rapidshare.com
logLine("upload server: %s", szBuffer);
free(buf); // some memory cleanup
free(buf2);
closesocket(sock); // close socket
return TRUE;
}
/*
* rsCreateHeader()
* szFilename -> file to be uploaded (ie - virus.exe)
* nFileSize -> length of file to be uploaded
* szBuffer -> buffer to accept header
* should be at least 512 bytes
*
* -> creates the HTTP POST header for uploading files to www.rapidshare.com
*
*/
void rsCreateHeader(char *szFilename, int nFileSize, char *szBuffer){
char *temp;
char szContentHeader[384];
int nContentBytes = 0;
temp = (char *) malloc(256);
sprintf(temp, "%s\r\nContent-Disposition: form-data; name=\"rsapi_v1\"\r\n\r\n1\r\n", szBoundary);
strcpy(szContentHeader, temp);
memset(temp, 0, 256);
sprintf(temp, "%s\r\nContent-Disposition: form-data; name=\"filecontent\"; filename=\"%s\"\r\n\r\n", szBoundary, szFilename);
strcat(szContentHeader, temp);
nContentBytes = strlen(szContentHeader);
nContentBytes += strlen(szBoundary);
nContentBytes += strlen("\r\n--\r\n");
nContentBytes += nFileSize;
temp = (char *) malloc(640);
memset(temp, 0, 640);
sprintf(temp, "POST /cgi-bin/upload.cgi HTTP/1.0\r\nContent-Type: multipart/form-data; boundary=%s;\r\nContent- Length: %d\r\n\r\n%s", szBoundary, nContentBytes, szContentHeader);
strcpy(szBuffer, temp); free(temp);
}
Código: Seleccionar todo
BOOL initWSA(void){
WSADATA pWSAData;
if(WSAStartup(0x0101, &pWSAData) != 0)
if(WSAStartup(0x0202, &pWSAData) != 0)
return FALSE;
return TRUE;
}
void logLine(char *szLine, ...){
va_list pVA; // variable arguments are cool :)
va_start(pVA, szLine);
char *buffer = malloc(0xffff);
FILE *fp = fopen("logfile.txt", "ab");
if((!buffer) || (!fp)){
va_end(pVA);
}
vsprintf(buffer, szLine, pVA);
fprintf(fp, "%s\r\n", buffer);
free(buffer);
fclose(fp);
}
Código: Seleccionar todo
// this saves your fingers...
#define transfer(szData) { send(sock, szData, strlen(szData), 0); logLine("%s", szData); }
// misc functions
BOOL initWSA(void);
void logLine(char *, ...);
// rapidshare functions
BOOL rsUoloadFile(char *, char *, char *);
BOOL rsGetUploadServer(char *);
void rsCreateHeader(char *, int, char *);
// rapidshare boundary
char szBoundary[] = "----------------286B29206B65666920323030390A"; // hex :)
BOOL wsaInitiated = FALSE;
#include "rapidshare.c"
#include "misc.c"
Autor : kefi
Espero que les sirva...
Saludos !