#ifndef _Valwrapper_wsk #define _Valwrapper_wsk int timestamp(); #define vwtrace() writefile("valwrapperlog.txt",ctostr(__LINE__));\ //#include "sflib.cpp" #include #include #include #include "varlist.h" #include "filestream.h" #define ctocp(s) (char*)s.c_str() #define pause() cout<<"\npress any key...";getch();cout<<"\r \r"; #define BAD_SOCK(sock) \ wsa_error = GetLastError(); \ closesocket(sock); \ WSACleanup(); \ return ; #define BAD_SOCK_DL(sock) \ wsa_error = GetLastError(); \ closesocket(sock); \ WSACleanup(); \ return ; static filestream vallog("valwrapperlog.txt"); class valwrapper{ private: DWORD wsa_error; void cutheaders(); void ws_request(char *prot,char *host, unsigned short port, char *uri, char *referer, char * postdat); void ws_dl_request(char *prot,char *host, unsigned short port, char *uri, char *referer, char *filename, char*postdat); int tim_hold; public: int last_time; int last_size; int lastdl_size; int tot_pages; varlist cookies; valwrapper(string fname); unsigned short vwproxport; string headers,domain,whole; string name, pass, cursource, cooks, vwproxy; bool usecooks,savesource,useproxy,superspeed,cookiexport,autolocate; string parseheaders(); // returns Location: value void getcookies(); void get(string fname, string referer); void post(string fname, string data,string referer); void init(string dom); void getdl(string fname, string file,string referer); void savecookies(string fname,bool clear); void loadcookies(string fname,string cfname); int recv_for(SOCKET&,int,char*,int&); int vt_s(); int vt_e(); }; int valwrapper::vt_s(){ tim_hold=timestamp(); return tim_hold; } int valwrapper::vt_e(){ int i = timestamp(); last_time = i-tim_hold; return last_time; } #define SNPOS string::npos /* utility methods */ string readpass(string pr){ cout << pr << "==>"; string ret; char n; cin.clear(); //if(cin.peek()!=EOF)cin.ignore(numeric_limits::max(), '\n'); while(1){ n=getch(); if(n=='\b' && ret.length()>0){ ret.erase(ret.length()-1); cout << "\b \b"; } if(n=='\r')break; ret+=n; cout << "*"; } cout << endl; return ret; } string ctostr(int i){ char a[33]; itoa(i,a,10); return a; } int cctoint(string s){ if(s=="0")return 0; if(s=="")return -1; int i; while((i=s.find(",",0))!=SNPOS){ s.erase(i,1); } int t = atoi(ctocp(s)); return (t==0?-1:t); } int ctoint(string s){ if(s=="0")return 0; int t = atoi(ctocp(s)); return (t==0?-1:t); } bool instr(string o,string t){ if(o.find(t)!= SNPOS)return true; return false; } int findlast(string w,string p,int ind=0){ int i = w.rfind(p,ind); if(i== SNPOS) return -1; return i; } int findlastl(string w,string p,int ind=0){ int i = w.rfind(p,ind); if(i== SNPOS) return -1; return i+p.length(); } int findnext(string w,string p,int ind = 0){ int i = w.find(p,ind); if(i== SNPOS) return -1; return i; } int findnextl(string w, string p, int ind = 0){ int i = w.find(p,ind); if(i== SNPOS) return -1; return i+p.length(); } string getbetweeni(string w,string s, string e,int &ind){ int o = w.find(s,ind); int t=w.find(e,o+s.length()); ind=t; if(o == SNPOS || t == SNPOS || o==t) return ""; o+=+s.length(); return w.substr(o,t-o); } string getbetween(string w, string s, string e,int ind =0){ int o = w.find(s,ind); int t=w.find(e,o+s.length()); if(o == SNPOS || t == SNPOS || o==t) return ""; o+=+s.length(); return w.substr(o,t-o); } string getbetween(string w, int s, string e){ int t=w.find(e,s); if( t == SNPOS) return ""; return w.substr(s,t-s); } string getafter(string w, string p,int i=0){ int t = w.find(p,i); if(t==SNPOS)return ""; return w.substr(t + p.length()); } void valwrapper::get(string fname,string referer=""){ tot_pages++; if(!instr(fname,"/")) fname = "/"+fname; getcookies(); if(referer != "") referer = "\r\nReferer: "+referer; ws_request("GET",ctocp(domain), 80, ctocp(fname), ctocp(referer),""); string loc = parseheaders(); if(autolocate && loc != ""){autolocate = false; get(loc); autolocate = true;} } void valwrapper::post(string fname, string data, string referer=""){ tot_pages++; if(!instr(fname,"/")) fname = "/"+fname; getcookies(); if(referer != "") referer = "\r\nReferer: "+referer; ws_request("POST",ctocp(domain), 80, ctocp(fname), ctocp(referer), ctocp(data)); string loc = parseheaders(); if(autolocate && loc != ""){autolocate = false; get(loc); autolocate = true;} } void valwrapper::init(string dom){ domain = dom; //cookies.fillfromfile("systemfiles\\"+domain+".di"); usecooks = true; } void valwrapper::savecookies(string fname,bool clear=false){ cookies.tofile("system\\"+fname,clear); } void valwrapper::loadcookies(string fname,string cfname=""){ if(cfname != "") savecookies(cfname); cookies.clear(); cookies.fillfromfile(fname); } void valwrapper::getdl(string fname, string file, string referer=""){ if(!instr(fname,"/")) fname = "/"+fname; getcookies(); if(referer != "") referer = "\r\nReferer: "+referer; ws_dl_request("GET",ctocp(domain),80,ctocp(fname),ctocp(referer),ctocp(file),""); parseheaders(); } valwrapper::valwrapper(string fname=""){ init(fname); usecooks = true; savesource = false; useproxy = false; superspeed = false; cookiexport = true; tot_pages=0; } string valwrapper::parseheaders(){ if(usecooks){ string val,names; int ind = 0; while(true){ ind = findnext(headers,"Set-Cookie: ",ind+16); if( ind == -1) break; name = getbetween(headers, "Set-Cookie: ","=",ind-3); val = getbetween(headers, "=", ";",ind); cookies.set(name,val); //pause(); } if(cookiexport) cookies.tofile("system\\"+domain+".di",false,"\n"); } if(autolocate){ int ind = findnextl(headers,"Location: ",0); if(ind == -1)return ""; string val = getbetween(headers,"Location: ","\r\n"); //cout << headers<h_addr, target_ptr->h_length); sin.sin_port = htons(port); } // cout << "httprequest: "< 0 ) { bytes_received += nret; if(superspeed && nret)break; recv_string = (char*)realloc(recv_string, strlen(recv_string) + nret + 1); strncat(recv_string, data, nret); } closesocket(sock); cursource = recv_string; cutheaders(); WSACleanup(); free(httprequest); free(recv_string); } */ void valwrapper::ws_request( char *prot, char *host, unsigned short port, char *uri, char *referer, char *postdat) { WSADATA wsaData; struct hostent *target_ptr; struct sockaddr_in sin; SOCKET sock; char req[] = "%s %s HTTP/1.0\r\nHost: %s%s\r\nContent-Length: %s\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\n%s\r\n\r\n%s"; char *httprequest; char *recv_string; char data[512]; unsigned long bytes_received; unsigned short nret; string l = ctostr(strlen(postdat)); char* len = ctocp(l); if (WSAStartup(MAKEWORD(2,2), &wsaData) < 0) return ; if ( (sock = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET ) {BAD_SOCK(sock);} if ( (target_ptr = gethostbyname(host)) == NULL) {BAD_SOCK(sock);} if(useproxy){ string reuri = ""; reuri += "http://"; reuri +=host; reuri +=uri; uri=ctocp(reuri); httprequest = (char*)malloc(strlen(req) + strlen(uri) +strlen(len) + strlen(host) + strlen(referer) + 1 +cooks.length()+strlen(prot)+strlen(postdat) ); sprintf(httprequest, req,prot, uri, host, referer,len,ctocp(cooks),postdat); sin.sin_addr.s_addr = inet_addr(vwproxy.c_str()); sin.sin_port = htons(vwproxport); } else{ httprequest = (char*)malloc(strlen(req) + strlen(uri) +strlen(len) + strlen(host) + strlen(referer) + 1 +cooks.length()+strlen(prot)+strlen(postdat) ); sprintf(httprequest, req,prot, uri, host, referer,len,ctocp(cooks),postdat); memcpy(&sin.sin_addr.s_addr, target_ptr->h_addr, target_ptr->h_length); sin.sin_port = htons(port); } // cout << "httprequest: "<=30000){ // last_size=0; // if(loops==2){ // cout << "no good..."; // pause(); // } // loops++; // if(send(sock,httprequest,strlen(httprequest),0) ==-1){BAD_SOCK(sock);} // tot_time=0; // } // } // if(nret==0)break; // last_size+=nret; // recv_string = (char*)realloc(recv_string, strlen(recv_string) + nret + 1); // strncat(recv_string, data, nret); // // } recv_string = (char*)malloc(2); strcpy(recv_string, ""); while(1){ vwtrace(); vwtrace(); nret = recv_for(sock,5,data,temptime); vwtrace(); tot_time+=temptime; vwtrace(); if(nret==-1){ vwtrace(); if (tot_time>=30000){ vwtrace(); last_size=0; vwtrace(); if(loops==2){ vwtrace(); cout << "no good..."; vwtrace(); pause(); vwtrace(); } vwtrace(); loops++; vwtrace(); if(send(sock,httprequest,strlen(httprequest),0) ==-1){BAD_SOCK(sock);} vwtrace(); tot_time=0; vwtrace(); } vwtrace(); } vwtrace(); if(nret==0)break; vwtrace(); last_size+=nret; vwtrace(); recv_string = (char*)realloc(recv_string, strlen(recv_string) + nret + 1); // cout << strlen(recv_string); // cout< 0 ) { // bytes_received += nret; // if(superspeed && nret)break; // recv_string = (char*)realloc(recv_string, strlen(recv_string) + nret + 1); // strncat(recv_string, data, nret); // } closesocket(sock); cursource = recv_string; cutheaders(); WSACleanup(); free(httprequest); free(recv_string); } #define Ws_trace(i) ; // cout << "w "<h_addr, target_ptr->h_length); sin.sin_port = htons(port); } sin.sin_family = AF_INET; Ws_trace(2); if ( (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) ) ) { BAD_SOCK_DL(sock); } Ws_trace(3); httprequest = (char*)malloc(strlen(req) + strlen(uri) + strlen(host) + strlen(referer) + 1 +cooks.length()+strlen(prot)+strlen(postdat) ); //char req[] = "POST %s HTTP/1.0\r\nHost: %s\r\nReferer: %s\r\nContent-Length: %s\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\n\r\n%s"; sprintf(httprequest,req,prot, uri, host, referer,ctocp(cooks),postdat); Ws_trace(4); if ( send(sock, httprequest, strlen(httprequest), 0) == -1 ) { BAD_SOCK_DL(sock); } Ws_trace(5); recv_string = (char*)malloc(2); strcpy(recv_string, ""); FILE *fwt; fwt = fopen(filename,"wb"); // fwm = fopen("recv.di","wb"); int tmp = 0,tmp2=0,tmp3=2; Ws_trace(6); while ( (nret = recv(sock, data, 3000, 0)) > 0) { recv_string = (char*)realloc(recv_string, tmp + nret + 1); memcpy(tmp+recv_string,data,nret); tmp+= nret; } Ws_trace(7); // fwrite(recv_string,sizeof(recv_string[0]),sizeof(recv_string),fwm); // //// cout << datasize: "<': return "%3E"; break;case '/': return "%2F"; break;case '?': return "%3F"; break;case '`': return "%60"; break;case '~': return "%7E"; break; default: string ret = ""; ret += n; return ret; break; } } string ctoposthex(string text){ string ret; for(int i = 0; i < text.length(); i++){ ret += hex(text[i]); } return ret; } string ctomysql(string what){ string ret = ""; for(int i = 0; i < what.length(); i++){ if( what[i] == '\''){ ret += "\\\'"; } else if(what[i] == '\n'){ } else ret += what[i]; } return ret; } /* coppied from online... select method to make a noneblocking socket void shell(SOCKET s) { struct timeval timev; char buff[512]; fd_set rfds1; fd_set rfds2; timev.tv_sec=30; FD_ZERO (&rfds1); FD_ZERO (&rfds2); timev.tv_usec=0; int l = 0; FD_ZERO (&rfds1); if(select ((int)s, &rfds1, NULL, NULL, &timev)) { // printf("WOOT\n"); l = recv(s,buff,sizeof(buff),0); write(1,buff,l); } while(1) { FD_ZERO (&rfds2); FD_SET (s, &rfds1); FD_SET (0, &rfds2); if (_kbhit()!=0) { // printf("HEPP\n"); l = read(fileno(stdin),buff,sizeof(buff)); send(s,buff,l,0); } Sleep(1); // if (select ((int)stdin, &rfds2, NULL, NULL, &timev)) { //; // } //printf("(filtered)"); } } */ #endif