1 // ProxySvr.cpp : This file contains the 'main' function. Program execution begins and ends there. 2 // 3 #define _WINSOCK_DEPRECATED_NO_WARNINGS 1 4 #include <string> 5 #include <iostream> 6 #include <winsock2.h> 7 #include <process.h> 8 9 #pragma comment(lib, "ws2_32.lib") 10 11 unsigned __stdcall http_thread_proc(void* param); 12 std::string get_host(std::string http_req); 13 14 std::string get_host(std::string http_req) 15 { 16 std::string host_data; 17 if (http_req.size() <= 0) 18 { 19 return host_data; 20 } 21 const char* delim = " "; 22 char *p; 23 char *ptr; 24 25 p = strtok_s((char*)http_req.c_str(), delim, &ptr); 26 if (!p) { 27 return host_data; 28 } 29 30 //if (p[0] == 'G') { 31 // host_data.append(&p[4], strlen(p) - 13); 32 //} 33 //else if (p[0] == 'P') { 34 // host_data.append(&p[5], strlen(p) - 14); 35 //} 36 37 p = strtok_s(NULL, delim, &ptr); 38 while (p) { 39 switch (p[0]) 40 { 41 case 'H': 42 host_data.append(&p[6], strlen(p) - 6); 43 break; 44 default: 45 break; 46 } 47 p = strtok_s(NULL, delim, &ptr); 48 } 49 return host_data; 50 } 51 52 int main() 53 { 54 WSADATA wsa; 55 WSAStartup(MAKEWORD(2, 2), &wsa); 56 SOCKET listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 57 sockaddr_in server_addr; 58 server_addr.sin_family = AF_INET; 59 server_addr.sin_addr.S_un.S_addr = INADDR_ANY; 60 server_addr.sin_port = htons(10240); 61 bind(listen_socket, (sockaddr*)&server_addr, sizeof(sockaddr_in)); 62 listen(listen_socket, SOMAXCONN); 63 64 while (true) { 65 sockaddr_in client_addr; 66 int len = sizeof(sockaddr_in); 67 SOCKET client_socket = accept(listen_socket, (sockaddr*)&client_addr, &len); 68 69 _beginthreadex(0, 0, http_thread_proc, (void*)client_socket, 0, 0); 70 71 } 72 73 74 WSACleanup(); 75 return 0; 76 } 77 78 unsigned __stdcall http_thread_proc(void* param) 79 { 80 char buf[4096] = { 0 }; 81 SOCKET client_socket = (SOCKET)param; 82 83 int len = ::recv(client_socket, buf, 4096, 0); 84 std::string data = buf; 85 if (data.find("activity.windows.com:443") == std::string::npos) { 86 printf("client connect socket=%d ", client_socket); 87 printf("%s ", buf); 88 std::string host = get_host(data); 89 printf(" %s ", host.c_str()); 90 91 hostent* host_ent = gethostbyname(host.c_str()); 92 if (host_ent) { 93 sockaddr_in server_addr; 94 server_addr.sin_family = AF_INET; 95 server_addr.sin_port = htons(80); 96 IN_ADDR addr = *(IN_ADDR*)*host_ent->h_addr_list; 97 server_addr.sin_addr.S_un.S_addr = inet_addr(inet_ntoa(addr)); 98 SOCKET server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 99 if (server_socket != INVALID_SOCKET) { 100 if ( SOCKET_ERROR != connect(server_socket, (sockaddr*)&server_addr, sizeof(sockaddr_in))) { 101 printf("代理主机:%s 连接成功 ", host.c_str()); 102 ::send(server_socket, buf, data.size(), 0); 103 ZeroMemory(buf, 4096, 0); 104 ::recv(server_socket, buf, 4096, 0); 105 printf("flow recv: %s ", buf); 106 ::send(client_socket, buf, 4096, 0); 107 closesocket(server_socket); 108 } 109 } 110 } 111 } 112 113 closesocket(client_socket); 114 return 0; 115 } 116 117