
TCProxy 一款简单的加密 TCP 代理工具Powered By c4e3bac3foxmail.com什么是 TCP 代理GitCode 仓库# Windows build commandg-static-static-libgcc-stdc11-lws2_32 TCProxy.cpp-oTCProxy.exe# orclang-static-static-libgcc-stdc11-lws2_32 TCProxy.cpp-oTCProxy.exe# Linux build commandg-static-static-libgcc-stdc11 TCProxy.cpp-oTCProxy.exe# orclang-static-static-libgcc-stdc11 TCProxy.cpp-oTCProxy.exe// Powered By c4e3bac3foxmail.comconstchar*Server_Addr127.0.0.1;constintServer_Port8080;constchar*Listen_Addr127.0.0.1;constintListen_Port8000;constchar*Secure_Key1234567890;constintSecure_Key_Len10;char*KeyBox0;/* # Linux build command g -static -static-libgcc -stdc11 TCProxy.cpp -o TCProxy.exe # or clang -static -static-libgcc -stdc11 TCProxy.cpp -o TCProxy.exe # Windows build command g -static -static-libgcc -stdc11 -l ws2_32 TCProxy.cpp -o TCProxy.exe # or clang -static -static-libgcc -stdc11 -l ws2_32 TCProxy.cpp -o TCProxy.exe */#ifdef_WIN32#includeWinsock2.h#includews2tcpip.h#includeWindows.h#includestdlib.h#includestdio.h#includethread#pragmacomment(lib,ws2_32.lib)intmain(intargc,char*argv[]);voidFuncA(SOCKET sock);voidFuncB(SOCKET*socka,SOCKET*sockb);voidFuncC();intmain(intargc,char*argv[]){FuncC();if(KeyBox0){return0;}WSADATA wsaData;if(WSAStartup(MAKEWORD(2,2),wsaData)!0){printf(WSAStartup failed\n);return1;}SOCKET listen_sockINVALID_SOCKET;SOCKET client_sockINVALID_SOCKET;structsockaddr_inlisten_addr,client_addr;socklen_t client_lensizeof(client_addr);listen_socksocket(AF_INET,SOCK_STREAM,IPPROTO_TCP);memset(listen_addr,0,sizeof(listen_addr));listen_addr.sin_familyAF_INET;listen_addr.sin_addr.s_addrinet_addr(Listen_Addr);listen_addr.sin_porthtons(Listen_Port);if(bind(listen_sock,(structsockaddr*)listen_addr,sizeof(listen_addr))SOCKET_ERROR){printf(bind failed\n);if(listen_sock!INVALID_SOCKET){closesocket(listen_sock);}if(client_sock!INVALID_SOCKET){closesocket(client_sock);}WSACleanup();}if(listen(listen_sock,SOMAXCONN)SOCKET_ERROR){printf(listen failed\n);if(listen_sock!INVALID_SOCKET){closesocket(listen_sock);}if(client_sock!INVALID_SOCKET){closesocket(client_sock);}WSACleanup();}while(true){client_sockaccept(listen_sock,(structsockaddr*)client_addr,client_len);if(client_sockINVALID_SOCKET){continue;}charclient_ip[INET_ADDRSTRLEN];inet_ntop(AF_INET,client_addr.sin_addr,client_ip,sizeof(client_ip));printf(New connection from %s:%d\n,client_ip,ntohs(client_addr.sin_port));std::threadThread(FuncA,client_sock);Thread.detach();}}voidFuncA(SOCKET sock){SOCKET ssocket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(sINVALID_SOCKET){return;}structsockaddr_inaddr;addr.sin_familyAF_INET;addr.sin_porthtons(Server_Port);inet_pton(AF_INET,Server_Addr,addr.sin_addr);if(connect(s,(structsockaddr*)addr,sizeof(addr))0){char*buffer(char*)malloc(1024*1024);unsignedlonglongintsec_key_len0;if(buffer!NULL){std::threadThread(FuncB,s,sock);Thread.detach();while(true){intrecv_lenrecv(sock,buffer,1024*1024,0);if(recv_len0){break;}for(inti0;irecv_len;i){buffer[i]buffer[i]^KeyBox[sec_key_len%256];sec_key_lensec_key_len1;}if(send(s,buffer,recv_len,0)0){break;}if(sINVALID_SOCKET){break;}if(sockINVALID_SOCKET){break;}}free(buffer);bufferNULL;}}if(s!INVALID_SOCKET){closesocket(s);sINVALID_SOCKET;}if(sock!INVALID_SOCKET){closesocket(sock);sockINVALID_SOCKET;}return;}voidFuncB(SOCKET*socka,SOCKET*sockb){char*buffer(char*)malloc(1024*1024);unsignedlonglongintsec_key_len0;if(buffer!NULL){while(true){intrecv_lenrecv(*socka,buffer,1024*1024,0);if(recv_len0){break;}for(inti0;irecv_len;i){buffer[i]buffer[i]^KeyBox[sec_key_len%256];sec_key_lensec_key_len1;}if(send(*sockb,buffer,recv_len,0)0){break;}if(*sockaINVALID_SOCKET){break;}if(*sockbINVALID_SOCKET){break;}}free(buffer);bufferNULL;}if(*socka!INVALID_SOCKET){closesocket(*socka);*sockaINVALID_SOCKET;}if(*sockb!INVALID_SOCKET){closesocket(*sockb);*sockbINVALID_SOCKET;}return;}voidFuncC(){KeyBox(char*)malloc(256);for(inti0;i256;i){KeyBox[i]i;}intj0;for(inti0;i256;i){j(jKeyBox[i]Secure_Key[i%Secure_Key_Len])%256;chartmpKeyBox[i];KeyBox[i]KeyBox[j];KeyBox[j]tmp;}return;}#endif#ifdef__linux__#includestdio.h#includestdlib.h#includestring.h#includeunistd.h#includesys/socket.h#includenetinet/in.h#includearpa/inet.h#includethreadintmain(intargc,char*argv[]);voidFuncA(intsock);voidFuncB(int*socka,int*sockb);voidFuncC();intmain(intargc,char*argv[]){FuncC();if(KeyBox0){return0;}intlisten_sock0;intclient_sock0;structsockaddr_inlisten_addr,client_addr;socklen_t client_lensizeof(client_addr);listen_socksocket(AF_INET,SOCK_STREAM,0);if(listen_sock-1){printf(Create socket failed.\n);return0;}memset(listen_addr,0,sizeof(listen_addr));listen_addr.sin_familyAF_INET;listen_addr.sin_addr.s_addrinet_addr(Listen_Addr);listen_addr.sin_porthtons(Listen_Port);if(bind(listen_sock,(structsockaddr*)listen_addr,sizeof(listen_addr))-1){close(listen_sock);printf(Bind Address Failed.\n);return0;}if(listen(listen_sock,SOMAXCONN)-1){printf(Listen failed.\n);close(listen_sock);return0;}while(true){client_sockaccept(listen_sock,(structsockaddr*)client_addr,client_len);if(client_sock!-1){printf(New connection from %s:%d\n,inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));std::threadThread(FuncA,client_sock);Thread.detach();}}return0;}voidFuncA(intsock){intssocket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(s-1){return;}structsockaddr_inaddr;addr.sin_familyAF_INET;addr.sin_porthtons(Server_Port);inet_pton(AF_INET,Server_Addr,addr.sin_addr);if(connect(s,(structsockaddr*)addr,sizeof(addr))0){char*buffer(char*)malloc(1024*1024);unsignedlonglongintsec_key_len0;if(buffer!NULL){std::threadThread(FuncB,s,sock);Thread.detach();while(true){intrecv_lenrecv(sock,buffer,1024*1024,0);if(recv_len0){break;}for(inti0;irecv_len;i){buffer[i]buffer[i]^KeyBox[sec_key_len%256];sec_key_lensec_key_len1;}if(send(s,buffer,recv_len,0)0){break;}if(s-1){break;}if(sock-1){break;}}free(buffer);bufferNULL;}}if(s!-1){close(s);s-1;}if(sock!-1){close(sock);sock-1;}return;}voidFuncB(int*socka,int*sockb){char*buffer(char*)malloc(1024*1024);unsignedlonglongintsec_key_len0;if(buffer!NULL){while(true){intrecv_lenrecv(*socka,buffer,1024*1024,0);if(recv_len0){break;}for(inti0;irecv_len;i){buffer[i]buffer[i]^KeyBox[sec_key_len%256];sec_key_lensec_key_len1;}if(send(*sockb,buffer,recv_len,0)0){break;}if(*socka-1){break;}if(*sockb-1){break;}}free(buffer);bufferNULL;}if(*socka!-1){close(*socka);*socka-1;}if(*sockb!-1){close(*sockb);*sockb-1;}return;}voidFuncC(){KeyBox(char*)malloc(256);for(inti0;i256;i){KeyBox[i]i;}intj0;for(inti0;i256;i){j(jKeyBox[i]Secure_Key[i%Secure_Key_Len])%256;chartmpKeyBox[i];KeyBox[i]KeyBox[j];KeyBox[j]tmp;}return;}#endif