Advertisement
asqapro

Proxy-Server

Dec 6th, 2013
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.32 KB | None | 0 0
  1. #include <iostream>
  2. #include <winsock.h> //note that this requires a linked .lib
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. WSADATA wsadata;
  8.  
  9. string password;
  10. bool pass_recieved = false;
  11.  
  12. string MESSAGE;
  13.  
  14. int TCP_PORT = 5721;
  15. char* TCP_IP;
  16.  
  17. bool CloseConnection (SOCKET s)
  18. {
  19.     //Close the socket if it exists
  20.     if(s){
  21.         closesocket(s);
  22.         return true;
  23.     }
  24.     return false;
  25. }
  26.  
  27. char* get_local_address(){
  28.     char ac[80];
  29.     gethostname(ac, sizeof(ac));
  30.  
  31.     struct hostent *phe = gethostbyname(ac);
  32.     if (phe == 0) {
  33.         cerr << "Yow! Bad host lookup." << endl;
  34.         return NULL;
  35.     }
  36.  
  37.     struct in_addr addr;
  38.     memcpy(&addr, phe->h_addr_list[0], sizeof(struct in_addr));
  39.     return inet_ntoa(addr);
  40. }
  41.  
  42. //CONNECTTOHOST – Connects to a remote host
  43. bool ConnectToHost(char* IPAddress, int PortNo)
  44. {
  45.     //Fill out the information needed to initialize a socket…
  46.     SOCKADDR_IN target; //Socket address information
  47.  
  48.     target.sin_family = AF_INET; // address family Internet
  49.     target.sin_port = htons (PortNo); //Port to connect on
  50.     target.sin_addr.s_addr = inet_addr (IPAddress); //Target IP
  51.  
  52.     SOCKET s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); //Create socket
  53.     if (s == INVALID_SOCKET)
  54.     {
  55.         return false; //Couldn't create the socket
  56.     }
  57.  
  58.     //Try connecting...
  59.  
  60.     if (connect(s, (SOCKADDR *)&target, sizeof(target)) == SOCKET_ERROR)
  61.     {
  62.         return false; //Couldn't connect
  63.     }
  64.     else
  65.         send(s, MESSAGE.c_str(), (int)(MESSAGE).size(), 0);
  66.         return true; //Success
  67.     CloseConnection(s);
  68. }
  69.  
  70. void handshake_send(char* ip_addr, int port){
  71.     ConnectToHost(ip_addr, port);
  72. }
  73.  
  74. SOCKET SetUpListener(const char* pcAddress, int nPort)
  75. {
  76.     u_long nInterfaceAddr = inet_addr(pcAddress);
  77.     if (nInterfaceAddr != INADDR_NONE) {
  78.         SOCKET sd = socket(AF_INET, SOCK_STREAM, 0);
  79.         if (sd != INVALID_SOCKET) {
  80.             sockaddr_in sinInterface;
  81.             sinInterface.sin_family = AF_INET;
  82.             sinInterface.sin_addr.s_addr = nInterfaceAddr;
  83.             sinInterface.sin_port = nPort;
  84.             if (bind(sd, (sockaddr*)&sinInterface,
  85.                     sizeof(sockaddr_in)) != SOCKET_ERROR) {
  86.                 listen(sd, 1);
  87.                 return sd;
  88.             }
  89.         }
  90.     }
  91.  
  92.     return INVALID_SOCKET;
  93. }
  94.  
  95. SOCKET AcceptConnection(SOCKET ListeningSocket, sockaddr_in& sinRemote)
  96. {
  97.     int nAddrSize = sizeof(sinRemote);
  98.     return accept(ListeningSocket, (sockaddr*)&sinRemote, &nAddrSize);
  99. }
  100.  
  101. SOCKET SetUpListener(const char* pcAddress, int nPort);
  102. SOCKET AcceptConnection(SOCKET ListeningSocket, sockaddr_in& sinRemote);
  103.  
  104. char acReadBuffer[5000];
  105. string url_request;
  106. bool get_url_request = false;
  107. bool url_request_recieved = false;
  108.  
  109. bool read_sock(SOCKET sd)
  110. {
  111.     // Read data from client
  112.     int nReadBytes = 1;
  113.     while(nReadBytes != 0){
  114.         nReadBytes = recv(sd, acReadBuffer, 5000, 0);
  115.         if((string)acReadBuffer == password){
  116.             pass_recieved = true;
  117.             return true;
  118.         }
  119.         if(strlen(acReadBuffer) > 0 && (string)acReadBuffer != "kill" && get_url_request){
  120.             url_request = (string)acReadBuffer;
  121.             url_request_recieved = true;
  122.             return true;
  123.         }
  124.         else if((string)acReadBuffer == "kill"){
  125.             exit(-1);
  126.         }
  127.         if (nReadBytes == SOCKET_ERROR) {
  128.             return false;
  129.         }
  130.     }
  131.     return false;
  132. }
  133.  
  134. WSADATA w;
  135.  
  136. bool exit_server;
  137.  
  138. int handshake_receive()
  139. {
  140.     string TCP_IP_str = get_local_address();
  141.     cout << TCP_IP_str << endl;
  142.     int TCP_PORT_OWN = 5721;
  143.  
  144.     //SOCKET ListeningSocket = SetUpListener(TCP_IP_str.c_str(), htons(TCP_PORT_OWN));
  145.     //if (ListeningSocket == INVALID_SOCKET) {
  146.     //    cout << "Error with listener1" << endl;
  147.     //    cout << WSAGetLastError() << endl;
  148.     //    return -1;
  149.     //}
  150.     // Spin forever handling clients
  151.     while (1) {
  152.         SOCKET ListeningSocket = SetUpListener(TCP_IP_str.c_str(), htons(TCP_PORT_OWN));
  153.         if (ListeningSocket == INVALID_SOCKET) {
  154.             cout << "Error with listener1" << endl;
  155.             cout << WSAGetLastError() << endl;
  156.             return -1;
  157.         }
  158.         // Wait for a connection, and accepting it when one arrives.
  159.         cout << "Waiting for a connection..." << flush;
  160.         sockaddr_in sinRemote;
  161.         SOCKET sd = AcceptConnection(ListeningSocket, sinRemote);
  162.         if (sd != INVALID_SOCKET) {
  163.             cout << "Accepted connection from " <<
  164.                     inet_ntoa(sinRemote.sin_addr) << ":" <<
  165.                     ntohs(sinRemote.sin_port) << "." << endl;
  166.             TCP_IP = inet_ntoa(sinRemote.sin_addr);
  167.         }
  168.         else {
  169.             cout << "Error with accepter" << endl;
  170.             cout << WSAGetLastError() << endl;
  171.             return -1;
  172.         }
  173.         if(read_sock(sd)){
  174.             if(pass_recieved && !get_url_request){
  175.                 MESSAGE = "got";
  176.                 //if(CloseConnection(sd) && CloseConnection(ListeningSocket)){}
  177.                 //else{
  178.                 //    cout << "Error disconnecting" << endl;
  179.                 //    return -1;
  180.                 //}
  181.                 handshake_send(TCP_IP, TCP_PORT);
  182.                 get_url_request = true;
  183.                 //SOCKET ListeningSocket = SetUpListener(TCP_IP_str.c_str(), htons(TCP_PORT_OWN));
  184.                 //if (ListeningSocket == INVALID_SOCKET) {
  185.                 //    cout << "Error with listener2" << endl;
  186.                 //    cout << WSAGetLastError() << endl;
  187.                 //    return -1;
  188.                 //}
  189.             }
  190.             else if(get_url_request){
  191.                 if(url_request_recieved){
  192.                     exit_server = true;
  193.                 }
  194.             }
  195.             else{
  196.                 MESSAGE = "password";
  197.                 //if(CloseConnection(sd) && CloseConnection(ListeningSocket)){}
  198.                 //else{
  199.                 //    cout << "Error disconnecting" << endl;
  200.                 //    return -1;
  201.                 //}
  202.                 handshake_send(TCP_IP, TCP_PORT);
  203.                 //SOCKET ListeningSocket = SetUpListener(TCP_IP_str.c_str(), htons(TCP_PORT_OWN));
  204.                 //if (ListeningSocket == INVALID_SOCKET) {
  205.                 //    cout << "Error with listener3" << endl;
  206.                 //    cout << WSAGetLastError() << endl;
  207.                 //    return -1;
  208.                 //}
  209.             }
  210.         }
  211.         if(exit_server){
  212.             break;
  213.         }
  214.         if(CloseConnection(sd) && CloseConnection(ListeningSocket)){}
  215.         else{
  216.             cout << "Error disconnecting" << endl;
  217.             return -1;
  218.         }
  219.     }
  220.     return 0;
  221. }
  222.  
  223. void set_char_string(string str){
  224.     const char* str_char = str.c_str();
  225.     for(unsigned int iter = 0; iter < strlen(str_char); iter++){
  226.         MESSAGE[iter] = str_char[iter];
  227.     }
  228. }
  229.  
  230. void server(){
  231.     cout << "Password? ";
  232.     cin >> password;
  233.     cout << "Setting up server." << endl;
  234.     while(true){
  235.         if(handshake_receive() == -1){
  236.             cout << "Error occured. Restarting server." << endl;
  237.             return;
  238.         }
  239.         //call python program to grab web page
  240.         ShellExecute(GetDesktopWindow(), "open", "ProxyWebScrape.exe", url_request.c_str(), NULL, SW_SHOWNORMAL);
  241.  
  242.         fstream bigFile;
  243.         string name = "page.html";
  244.         bigFile.open(name.c_str(),ios::in | ios::binary);
  245.         bigFile.seekg(0, ios::end);
  246.         const int size = bigFile.tellg();
  247.         char full_file[size];
  248.         bigFile.seekg(0, ios::beg);
  249.         bigFile.read(full_file,size);
  250.  
  251.         string full_file_str = (string)full_file;
  252.  
  253.         int bytes_read = 0;
  254.         while(bytes_read < size){
  255.             set_char_string(full_file_str.substr(bytes_read, 1024));
  256.             handshake_send(TCP_IP, TCP_PORT);
  257.             bytes_read += 1024;
  258.         }
  259.     }
  260. }
  261.  
  262. int main(int argc, char* argv[])
  263. {
  264.     //Start up Winsock…
  265.     WSADATA wsadata;
  266.  
  267.     int error = WSAStartup(0x0202, &wsadata);
  268.  
  269.     //Did something happen?
  270.     if (error)
  271.         return false;
  272.  
  273.     //Did we get the right Winsock version?
  274.     if(wsadata.wVersion != 0x0202)
  275.     {
  276.         WSACleanup(); //Clean up Winsock
  277.         return false;
  278.     }
  279.  
  280.     while(true){
  281.         server();
  282.     }
  283.     return 0;
  284. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement