[Redirector] Update DNSHandler

This commit is contained in:
Connection Refused
2021-10-04 18:24:38 +08:00
parent ebc031eb72
commit 375fd13119
7 changed files with 68 additions and 54 deletions

View File

@@ -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)

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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()