mirror of
https://github.com/netchx/netch.git
synced 2026-03-18 18:13:21 +08:00
[Redirector] Update DNSHandler
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user