From 2edf384f49c9ce8783510326ddbdcede75cc0a1e Mon Sep 17 00:00:00 2001 From: Connection Refused Date: Wed, 29 Sep 2021 18:52:37 +0800 Subject: [PATCH] [Redirector] Fix TCP and UDP --- Redirector/EventHandler.cpp | 8 +++--- Redirector/SocksHelper.cpp | 57 ++++++++++++++++++------------------- Redirector/SocksHelper.h | 8 +++--- Redirector/TCPHandler.cpp | 4 +-- 4 files changed, 38 insertions(+), 39 deletions(-) diff --git a/Redirector/EventHandler.cpp b/Redirector/EventHandler.cpp index 44100d56..83d37c0b 100644 --- a/Redirector/EventHandler.cpp +++ b/Redirector/EventHandler.cpp @@ -299,13 +299,13 @@ void udpSend(ENDPOINT_ID id, const unsigned char* target, const char* buffer, in return; } - auto data = new NF_UDP_OPTIONS(); - memcpy(data, options, sizeof(NF_UDP_OPTIONS)); + auto data = (PNF_UDP_OPTIONS)new char[sizeof(NF_UDP_OPTIONS) + options->optionsLength]; + memcpy(data, options, sizeof(NF_UDP_OPTIONS) + options->optionsLength - 1); thread(udpBeginReceive, id, conn, data).detach(); } - if (conn->Send((PSOCKADDR)target, buffer, length) == SOCKET_ERROR) + if (conn->Send((PSOCKADDR_IN6)target, buffer, length) == SOCKET_ERROR) { closesocket(conn->tcpSocket); closesocket(conn->udpSocket); @@ -351,7 +351,7 @@ void udpBeginReceive(ENDPOINT_ID id, SocksHelper::PUDP conn, PNF_UDP_OPTIONS dat { SOCKADDR_IN6 target; - int length = conn->Read((PSOCKADDR)&target, buffer, 1458); + int length = conn->Read(&target, buffer, 1458); if (length == 0 || length == SOCKET_ERROR) { break; diff --git a/Redirector/SocksHelper.cpp b/Redirector/SocksHelper.cpp index 14cd140b..ac6acd36 100644 --- a/Redirector/SocksHelper.cpp +++ b/Redirector/SocksHelper.cpp @@ -117,7 +117,7 @@ bool SocksHelper::Utils::Handshake(SOCKET client) return true; } -bool SocksHelper::Utils::ReadAddr(SOCKET client, char type, PSOCKADDR addr) +bool SocksHelper::Utils::ReadAddr(SOCKET client, char type, PSOCKADDR_IN6 addr) { if (type == 0x01) { @@ -138,7 +138,7 @@ bool SocksHelper::Utils::ReadAddr(SOCKET client, char type, PSOCKADDR addr) } else if (type == 0x04) { - auto address = (PSOCKADDR_IN6)addr; + auto address = addr; address->sin6_family = AF_INET6; if (recv(client, (char*)&address->sin6_addr, 16, 0) != 16) @@ -181,10 +181,10 @@ SocksHelper::TCP::~TCP() } } -bool SocksHelper::TCP::Connect(PSOCKADDR target) +bool SocksHelper::TCP::Connect(PSOCKADDR_IN6 target) { /* Connect Request */ - if (target->sa_family == AF_INET) + if (target->sin6_family == AF_INET) { char buffer[10]; buffer[0] = 0x05; @@ -210,7 +210,7 @@ bool SocksHelper::TCP::Connect(PSOCKADDR target) buffer[2] = 0x00; buffer[3] = 0x04; - auto addr = (PSOCKADDR_IN6)target; + auto addr = target; memcpy(buffer + 4, &addr->sin6_addr, 16); memcpy(buffer + 20, &addr->sin6_port, 2); @@ -235,7 +235,7 @@ bool SocksHelper::TCP::Connect(PSOCKADDR target) } SOCKADDR_IN6 addr; - return Utils::ReadAddr(this->tcpSocket, buffer[3], (PSOCKADDR)&addr); + return Utils::ReadAddr(this->tcpSocket, buffer[3], &addr); } int SocksHelper::TCP::Send(const char* buffer, int length) @@ -324,7 +324,7 @@ bool SocksHelper::UDP::Associate() return false; } - return Utils::ReadAddr(this->tcpSocket, buffer[3], (PSOCKADDR)&this->address); + return Utils::ReadAddr(this->tcpSocket, buffer[3], &this->address); } bool SocksHelper::UDP::CreateUDP() @@ -371,7 +371,7 @@ bool SocksHelper::UDP::CreateUDP() return true; } -int SocksHelper::UDP::Send(PSOCKADDR target, const char* buffer, int length) +int SocksHelper::UDP::Send(PSOCKADDR_IN6 target, const char* buffer, int length) { if (this->udpSocket == INVALID_SOCKET) { @@ -379,18 +379,18 @@ int SocksHelper::UDP::Send(PSOCKADDR target, const char* buffer, int length) } auto data = new char[3 + 1 + 16 + 2 + (ULONG64)length](); - data[3] = (target->sa_family == AF_INET6) ? 0x04 : 0x01; + data[3] = (target->sin6_family == AF_INET) ? 0x01 : 0x04; - if (target->sa_family == AF_INET) + if (target->sin6_family == AF_INET) { auto ipv4 = (PSOCKADDR_IN)target; memcpy(data + 4, &ipv4->sin_addr, 4); memcpy(data + 8, &ipv4->sin_port, 2); } - else if (target->sa_family == AF_INET6) + else if (target->sin6_family == AF_INET6) { - auto ipv6 = (PSOCKADDR_IN6)target; + auto ipv6 = target; memcpy(data + 4, &ipv6->sin6_addr, 16); memcpy(data + 20, &ipv6->sin6_port, 2); @@ -403,8 +403,8 @@ int SocksHelper::UDP::Send(PSOCKADDR target, const char* buffer, int length) return length; } - memcpy(data + 3 + 1 + (target->sa_family == AF_INET6 ? 16 : 4) + 2, buffer, length); - auto dataLength = 3 + 1 + (target->sa_family == AF_INET6 ? 16 : 4) + 2 + length; + memcpy(data + 3 + 1 + (target->sin6_family == AF_INET ? 4 : 16) + 2, buffer, length); + auto dataLength = 3 + 1 + (target->sin6_family == AF_INET ? 4 : 16) + 2 + length; if (sendto(this->udpSocket, data, dataLength, 0, (PSOCKADDR)&this->address, (this->address.sin6_family == AF_INET6 ? sizeof(SOCKADDR_IN6) : sizeof(SOCKADDR_IN))) != dataLength) { @@ -418,32 +418,21 @@ int SocksHelper::UDP::Send(PSOCKADDR target, const char* buffer, int length) return dataLength; } -int SocksHelper::UDP::Read(PSOCKADDR target, char* buffer, int length) +int SocksHelper::UDP::Read(PSOCKADDR_IN6 target, char* buffer, int length) { if (!this->udpSocket) { return SOCKET_ERROR; } - int targetLength = 0; - int bufferLength = recvfrom(this->udpSocket, buffer, length, 0, target, &targetLength); + int bufferLength = recvfrom(this->udpSocket, buffer, length, 0, NULL, NULL); if (bufferLength == 0 || bufferLength == SOCKET_ERROR) { return bufferLength; } memset(target, 0, sizeof(SOCKADDR_IN6)); - if (buffer[3] == 0x04) - { - auto ipv6 = (PSOCKADDR_IN6)target; - ipv6->sin6_family = AF_INET6; - - memcpy(&ipv6->sin6_addr, buffer + 4, 16); - memcpy(&ipv6->sin6_port, buffer + 20, 2); - - memcpy(buffer, buffer + 22, (ULONG64)bufferLength - 22); - } - else + if (buffer[3] == 0x01) { auto ipv4 = (PSOCKADDR_IN)target; ipv4->sin_family = AF_INET; @@ -453,8 +442,18 @@ int SocksHelper::UDP::Read(PSOCKADDR target, char* buffer, int length) memcpy(buffer, buffer + 10, (ULONG64)bufferLength - 10); } + else + { + auto ipv6 = target; + ipv6->sin6_family = AF_INET6; - return bufferLength - (target->sa_family == AF_INET6 ? 22 : 10); + memcpy(&ipv6->sin6_addr, buffer + 4, 16); + memcpy(&ipv6->sin6_port, buffer + 20, 2); + + memcpy(buffer, buffer + 22, (ULONG64)bufferLength - 22); + } + + return bufferLength - (target->sin6_family == AF_INET ? 10 : 22); } void SocksHelper::UDP::run() diff --git a/Redirector/SocksHelper.h b/Redirector/SocksHelper.h index a5b39c36..b53992a0 100644 --- a/Redirector/SocksHelper.h +++ b/Redirector/SocksHelper.h @@ -9,7 +9,7 @@ namespace SocksHelper { SOCKET Connect(); bool Handshake(SOCKET client); - bool ReadAddr(SOCKET client, char type, PSOCKADDR addr); + bool ReadAddr(SOCKET client, char type, PSOCKADDR_IN6 addr); } typedef class TCP @@ -19,7 +19,7 @@ namespace SocksHelper TCP(SOCKET tcpSocket); ~TCP(); - bool Connect(PSOCKADDR target); + bool Connect(PSOCKADDR_IN6 target); int Send(const char* buffer, int length); int Read(char* buffer, int length); @@ -37,8 +37,8 @@ namespace SocksHelper bool Associate(); bool CreateUDP(); - int Send(PSOCKADDR target, const char* buffer, int length); - int Read(PSOCKADDR target, char* buffer, int length); + int Send(PSOCKADDR_IN6 target, const char* buffer, int length); + int Read(PSOCKADDR_IN6 target, char* buffer, int length); SOCKET tcpSocket = INVALID_SOCKET; SOCKET udpSocket = INVALID_SOCKET; diff --git a/Redirector/TCPHandler.cpp b/Redirector/TCPHandler.cpp index 20692d68..fd00169d 100644 --- a/Redirector/TCPHandler.cpp +++ b/Redirector/TCPHandler.cpp @@ -144,7 +144,7 @@ void TCPHandler::Handle(SOCKET client) } auto remote = SocksHelper::Utils::Connect(); - if (remote != INVALID_SOCKET) + if (remote == INVALID_SOCKET) { closesocket(client); return; @@ -170,7 +170,7 @@ void TCPHandler::Handle(SOCKET client) tcpLock.unlock(); auto conn = new SocksHelper::TCP(remote); - if (!conn->Connect((PSOCKADDR)&target)) + if (!conn->Connect(&target)) { delete conn;