From 375fd13119cdad6f92ddf53a77edce641fdf0c28 Mon Sep 17 00:00:00 2001 From: Connection Refused Date: Mon, 4 Oct 2021 18:24:38 +0800 Subject: [PATCH] [Redirector] Update DNSHandler --- Redirector/DNSHandler.cpp | 52 ++++++++++++++++++----------------- Redirector/DNSHandler.h | 2 ++ Redirector/EventHandler.cpp | 13 +++++++-- Redirector/EventHandler.h | 2 +- Redirector/IPEventHandler.cpp | 6 ++-- Redirector/Redirector.cpp | 4 +-- Redirector/SocksHelper.cpp | 43 +++++++++++++++-------------- 7 files changed, 68 insertions(+), 54 deletions(-) diff --git a/Redirector/DNSHandler.cpp b/Redirector/DNSHandler.cpp index 6d6a865e..57a412ae 100644 --- a/Redirector/DNSHandler.cpp +++ b/Redirector/DNSHandler.cpp @@ -1,14 +1,13 @@ #include "DNSHandler.h" -// Noob code -// Waiting rewrite - extern string dnsHost; extern USHORT dnsPort; +SOCKADDR_IN6 dnsAddr; + void ProcessPacket(ENDPOINT_ID id, SOCKADDR_IN6 target, const char* packet, int length, PNF_UDP_OPTIONS options) { - auto buffer = new char[1024](); + char buffer[1024]; auto tcpSocket = SocksHelper::Utils::Connect(); if (tcpSocket != INVALID_SOCKET) @@ -22,26 +21,7 @@ void ProcessPacket(ENDPOINT_ID id, SOCKADDR_IN6 target, const char* packet, int { if (udpConn.CreateUDP()) { - SOCKADDR_IN6 addr; - if (inet_pton(AF_INET, dnsHost.c_str(), &addr.sin6_addr) == 1) - { - addr.sin6_family = AF_INET; - } - else if (inet_pton(AF_INET6, dnsHost.c_str(), &((PSOCKADDR_IN)&addr)->sin_addr) == 1) - { - addr.sin6_family = AF_INET6; - } - - if (addr.sin6_family == AF_INET) - { - ((PSOCKADDR_IN)&addr)->sin_port = htons(dnsPort); - } - else - { - addr.sin6_port = htons(dnsPort); - } - - if (udpConn.Send(&addr, packet, length) == length) + if (udpConn.Send(&dnsAddr, packet, length) == length) { int size = udpConn.Read(NULL, buffer, sizeof(buffer)); if (size != 0 && size != SOCKET_ERROR) @@ -55,10 +35,32 @@ void ProcessPacket(ENDPOINT_ID id, SOCKADDR_IN6 target, const char* packet, int } delete options; - delete[] buffer; delete[] packet; } +bool DNSHandler::Init() +{ + memset(&dnsAddr, 0, sizeof(SOCKADDR_IN6)); + + auto ipv4 = (PSOCKADDR_IN)&dnsAddr; + if (inet_pton(AF_INET, dnsHost.c_str(), &ipv4->sin_addr) == 1) + { + ipv4->sin_family = AF_INET; + ipv4->sin_port = htons(dnsPort); + return true; + } + + if (inet_pton(AF_INET6, dnsHost.c_str(), &dnsAddr.sin6_addr) == 1) + { + dnsAddr.sin6_family = AF_INET6; + dnsAddr.sin6_port = htons(dnsPort); + return true; + } + + puts("[Redirector][DNSHandler::Init] Call WSAStringToAddress failed"); + return false; +} + bool DNSHandler::IsDNS(PSOCKADDR_IN6 target) { if (target->sin6_family == AF_INET) diff --git a/Redirector/DNSHandler.h b/Redirector/DNSHandler.h index e008dc1e..213cdec1 100644 --- a/Redirector/DNSHandler.h +++ b/Redirector/DNSHandler.h @@ -6,6 +6,8 @@ namespace DNSHandler { + bool Init(); + bool IsDNS(PSOCKADDR_IN6 target); void CreateHandler(ENDPOINT_ID id, PSOCKADDR_IN6 target, const char* packet, int length, PNF_UDP_OPTIONS options); diff --git a/Redirector/EventHandler.cpp b/Redirector/EventHandler.cpp index a096052a..eeeec2a9 100644 --- a/Redirector/EventHandler.cpp +++ b/Redirector/EventHandler.cpp @@ -94,6 +94,11 @@ bool checkHandleName(DWORD id) bool eh_init() { + if (!DNSHandler::Init()) + { + return false; + } + return TCPHandler::Init(); } @@ -246,6 +251,8 @@ void udpSend(ENDPOINT_ID id, const unsigned char* target, const char* buffer, in { if (filterDNS && DNSHandler::IsDNS((PSOCKADDR_IN6)target)) { + wcout << "[Redirector][EventHandler][udpSend] DNS to " << ConvertIP((PSOCKADDR)target) << endl; + DNSHandler::CreateHandler(id, (PSOCKADDR_IN6)target, buffer, length, options); return; } @@ -346,7 +353,7 @@ void udpClosed(ENDPOINT_ID id, PNF_UDP_CONN_INFO info) } } -void udpBeginReceive(ENDPOINT_ID id, SocksHelper::PUDP conn, PNF_UDP_OPTIONS data) +void udpBeginReceive(ENDPOINT_ID id, SocksHelper::PUDP conn, PNF_UDP_OPTIONS options) { char buffer[1458]; @@ -360,8 +367,8 @@ void udpBeginReceive(ENDPOINT_ID id, SocksHelper::PUDP conn, PNF_UDP_OPTIONS dat break; } - nf_udpPostReceive(id, (unsigned char*)&target, buffer, length, data); + nf_udpPostReceive(id, (unsigned char*)&target, buffer, length, options); } - delete data; + delete options; } diff --git a/Redirector/EventHandler.h b/Redirector/EventHandler.h index f4bb637d..dfc70e98 100644 --- a/Redirector/EventHandler.h +++ b/Redirector/EventHandler.h @@ -24,6 +24,6 @@ void udpCanReceive(ENDPOINT_ID id); void udpReceive(ENDPOINT_ID id, const unsigned char* target, const char* buffer, int length, PNF_UDP_OPTIONS options); void udpClosed(ENDPOINT_ID id, PNF_UDP_CONN_INFO info); -void udpBeginReceive(ENDPOINT_ID id, SocksHelper::PUDP conn, PNF_UDP_OPTIONS data); +void udpBeginReceive(ENDPOINT_ID id, SocksHelper::PUDP conn, PNF_UDP_OPTIONS options); #endif diff --git a/Redirector/IPEventHandler.cpp b/Redirector/IPEventHandler.cpp index c4b51b3e..ea29a150 100644 --- a/Redirector/IPEventHandler.cpp +++ b/Redirector/IPEventHandler.cpp @@ -49,7 +49,7 @@ void ipSend(const char* buffer, int length, PNF_IP_PACKET_OPTIONS options) length < 28 || buffer[options->ipHeaderSize] != 0x08) { - UNREFERENCED_PARAMETER(nf_ipPostSend(buffer, length, options)); + nf_ipPostSend(buffer, length, options); return; } @@ -81,11 +81,11 @@ void ipSend(const char* buffer, int length, PNF_IP_PACKET_OPTIONS options) this_thread::sleep_for(chrono::microseconds(icmping)); printf("[Redirector][IPEventHandler][ipSend] Fake ICMP response for %d.%d.%d.%d\n", data[12], data[13], data[14], data[15]); - nf_ipPostReceive((PCHAR)data, length, options); + nf_ipPostReceive((char*)data, length, options); delete[] data; } void ipReceive(const char* buffer, int length, PNF_IP_PACKET_OPTIONS options) { - UNREFERENCED_PARAMETER(nf_ipPostReceive(buffer, length, options)); + nf_ipPostReceive(buffer, length, options); } diff --git a/Redirector/Redirector.cpp b/Redirector/Redirector.cpp index 7ea60c1d..fbdc406a 100644 --- a/Redirector/Redirector.cpp +++ b/Redirector/Redirector.cpp @@ -57,7 +57,7 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) } extern "C" { - __declspec(dllexport) BOOL __cdecl aio_dial(INT name, LPWSTR value) + __declspec(dllexport) BOOL __cdecl aio_dial(int name, LPWSTR value) { switch (name) { @@ -261,7 +261,7 @@ extern "C" { nf_addRule(&rule, FALSE); } - if (filterUDP) + if (filterUDP || filterDNS) { memset(&rule, 0, sizeof(NF_RULE)); rule.ip_family = AF_INET; diff --git a/Redirector/SocksHelper.cpp b/Redirector/SocksHelper.cpp index a9a581e9..73895e0b 100644 --- a/Redirector/SocksHelper.cpp +++ b/Redirector/SocksHelper.cpp @@ -387,7 +387,7 @@ int SocksHelper::UDP::Send(PSOCKADDR_IN6 target, const char* buffer, int 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) + if (sendto(this->udpSocket, data, dataLength, 0, (PSOCKADDR)&this->address, (this->address.sin6_family == AF_INET ? sizeof(SOCKADDR_IN) : sizeof(SOCKADDR_IN6))) != dataLength) { delete[] data; @@ -396,7 +396,7 @@ int SocksHelper::UDP::Send(PSOCKADDR_IN6 target, const char* buffer, int length) } delete[] data; - return dataLength; + return length; } int SocksHelper::UDP::Read(PSOCKADDR_IN6 target, char* buffer, int length) @@ -412,31 +412,34 @@ int SocksHelper::UDP::Read(PSOCKADDR_IN6 target, char* buffer, int length) return bufferLength; } - if (target != NULL) + SOCKADDR_IN6 addr; + + if (buffer[3] == 0x01) { - memset(target, 0, sizeof(SOCKADDR_IN6)); - if (buffer[3] == 0x01) - { - auto ipv4 = (PSOCKADDR_IN)target; - ipv4->sin_family = AF_INET; + auto ipv4 = (PSOCKADDR_IN)&addr; + ipv4->sin_family = AF_INET; - memcpy(&ipv4->sin_addr, buffer + 4, 4); - memcpy(&ipv4->sin_port, buffer + 8, 2); + memcpy(&ipv4->sin_addr, buffer + 4, 4); + memcpy(&ipv4->sin_port, buffer + 8, 2); - memcpy(buffer, buffer + 10, (ULONG64)bufferLength - 10); - } - else - { - target->sin6_family = AF_INET6; + memcpy(buffer, buffer + 10, (ULONG64)bufferLength - 10); + } + else + { + addr.sin6_family = AF_INET6; - memcpy(&target->sin6_addr, buffer + 4, 16); - memcpy(&target->sin6_port, buffer + 20, 2); + memcpy(&addr.sin6_addr, buffer + 4, 16); + memcpy(&addr.sin6_port, buffer + 20, 2); - memcpy(buffer, buffer + 22, (ULONG64)bufferLength - 22); - } + memcpy(buffer, buffer + 22, (ULONG64)bufferLength - 22); } - return bufferLength - (target->sin6_family == AF_INET ? 10 : 22); + if (target != NULL) + { + memcpy(target, &addr, sizeof(SOCKADDR_IN6)); + } + + return bufferLength - (addr.sin6_family == AF_INET ? 10 : 22); } void SocksHelper::UDP::Run()