[Redirector] Add DNSHandler

This commit is contained in:
Connection Refused
2021-10-04 17:01:29 +08:00
parent 5777429347
commit 8ffa2cdf82
10 changed files with 161 additions and 36 deletions

View File

@@ -1,15 +1,15 @@
#include "Based.h"
BOOL filterLoopback = FALSE;
BOOL filterIntranet = FALSE;
BOOL filterICMP = TRUE;
BOOL filterTCP = TRUE;
BOOL filterUDP = TRUE;
BOOL filterDNS = TRUE;
bool filterLoopback = false;
bool filterIntranet = false;
bool filterICMP = true;
bool filterTCP = true;
bool filterUDP = true;
bool filterDNS = true;
DWORD icmping = 0;
wstring dnsHost = L"1.1.1.1";
string dnsHost = "1.1.1.1";
USHORT dnsPort = 443;
wstring tgtHost = L"127.0.0.1";

83
Redirector/DNSHandler.cpp Normal file
View File

@@ -0,0 +1,83 @@
#include "DNSHandler.h"
// Noob code
// Waiting rewrite
extern string dnsHost;
extern USHORT dnsPort;
void ProcessPacket(ENDPOINT_ID id, SOCKADDR_IN6 target, const char* packet, int length, PNF_UDP_OPTIONS options)
{
auto buffer = new char[1024]();
auto tcpSocket = SocksHelper::Utils::Connect();
if (tcpSocket != INVALID_SOCKET)
{
if (SocksHelper::Utils::Handshake(tcpSocket))
{
SocksHelper::UDP udpConn;
udpConn.tcpSocket = tcpSocket;
if (udpConn.Associate())
{
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)
{
int size = udpConn.Read(NULL, buffer, sizeof(buffer));
if (size != 0 && size != SOCKET_ERROR)
{
nf_udpPostReceive(id, (unsigned char*)&target, buffer, size, options);
}
}
}
}
}
}
delete options;
delete[] buffer;
delete[] packet;
}
bool DNSHandler::IsDNS(PSOCKADDR_IN6 target)
{
if (target->sin6_family == AF_INET)
{
return ((PSOCKADDR_IN)target)->sin_port == htons(53);
}
return target->sin6_port == htons(53);
}
void DNSHandler::CreateHandler(ENDPOINT_ID id, PSOCKADDR_IN6 target, const char* packet, int length, PNF_UDP_OPTIONS options)
{
SOCKADDR_IN6 remote;
auto buffer = new char[length]();
auto option = (PNF_UDP_OPTIONS)new char[sizeof(NF_UDP_OPTIONS) + options->optionsLength];
memcpy(&remote, target, sizeof(SOCKADDR_IN6));
memcpy(buffer, packet, length);
memcpy(option, options, sizeof(NF_UDP_OPTIONS) + options->optionsLength - 1);
thread(ProcessPacket, id, remote, buffer, length, option).detach();
}

14
Redirector/DNSHandler.h Normal file
View File

@@ -0,0 +1,14 @@
#pragma once
#ifndef DNSHANDLER_H
#define DNSHANDLER_H
#include "Based.h"
#include "SocksHelper.h"
namespace DNSHandler
{
bool IsDNS(PSOCKADDR_IN6 target);
void CreateHandler(ENDPOINT_ID id, PSOCKADDR_IN6 target, const char* packet, int length, PNF_UDP_OPTIONS options);
}
#endif

View File

@@ -1,9 +1,12 @@
#include "EventHandler.h"
#include "DNSHandler.h"
#include "TCPHandler.h"
extern BOOL filterTCP;
extern BOOL filterUDP;
extern bool filterTCP;
extern bool filterUDP;
extern bool filterDNS;
extern vector<wstring> bypassList;
extern vector<wstring> handleList;
@@ -208,24 +211,18 @@ void udpCreated(ENDPOINT_ID id, PNF_UDP_CONN_INFO info)
{
if (!filterUDP)
{
nf_udpDisableFiltering(id);
wcout << "[Redirector][EventHandler][udpCreated][" << id << "][" << info->processId << "][!filterUDP] " << GetProcessName(info->processId) << endl;
return;
}
if (checkBypassName(info->processId))
{
nf_udpDisableFiltering(id);
wcout << "[Redirector][EventHandler][udpCreated][" << id << "][" << info->processId << "][checkBypassName] " << GetProcessName(info->processId) << endl;
return;
}
if (!checkHandleName(info->processId))
{
nf_udpDisableFiltering(id);
wcout << "[Redirector][EventHandler][udpCreated][" << id << "][" << info->processId << "][!checkHandleName] " << GetProcessName(info->processId) << endl;
return;
}
@@ -247,6 +244,12 @@ void udpCanSend(ENDPOINT_ID id)
void udpSend(ENDPOINT_ID id, const unsigned char* target, const char* buffer, int length, PNF_UDP_OPTIONS options)
{
if (filterDNS && DNSHandler::IsDNS((PSOCKADDR_IN6)target))
{
DNSHandler::CreateHandler(id, (PSOCKADDR_IN6)target, buffer, length, options);
return;
}
udpContextLock.lock();
if (udpContext.find(id) == udpContext.end())
{

View File

@@ -2,7 +2,6 @@
#ifndef EVENTHANDLER_H
#define EVENTHANDLER_H
#include "Based.h"
#include "SocksHelper.h"
bool eh_init();

View File

@@ -3,16 +3,23 @@
#include "IPEventHandler.h"
#include "Utils.h"
extern BOOL filterLoopback;
extern BOOL filterIntranet;
extern BOOL filterICMP;
extern BOOL filterTCP;
extern BOOL filterUDP;
extern bool filterLoopback;
extern bool filterIntranet;
extern bool filterICMP;
extern bool filterTCP;
extern bool filterUDP;
extern bool filterDNS;
extern DWORD icmping;
extern string dnsHost;
extern USHORT dnsPort;
extern wstring tgtHost;
extern wstring tgtPort;
extern string tgtUsername;
extern string tgtPassword;
extern vector<wstring> bypassList;
extern vector<wstring> handleList;
@@ -69,9 +76,18 @@ extern "C" {
case AIO_FILTERUDP:
filterUDP = (wstring(value).find(L"false") == string::npos);
break;
case AIO_FILTERDNS:
filterDNS = (wstring(value).find(L"false") == string::npos);
break;
case AIO_ICMPING:
icmping = atoi(ws2s(value).c_str());
break;
case AIO_DNSHOST:
dnsHost = ws2s(value);
break;
case AIO_DNSPORT:
dnsPort = (USHORT)atoi(ws2s(value).c_str());
break;
case AIO_TGTHOST:
tgtHost = wstring(value);
break;

View File

@@ -97,6 +97,7 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="Based.cpp" />
<ClCompile Include="DNSHandler.cpp" />
<ClCompile Include="EventHandler.cpp" />
<ClCompile Include="IPEventHandler.cpp" />
<ClCompile Include="Redirector.cpp" />
@@ -105,6 +106,7 @@
<ClCompile Include="Utils.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="DNSHandler.h" />
<ClInclude Include="EventHandler.h" />
<ClInclude Include="IPEventHandler.h" />
<ClInclude Include="Based.h" />

View File

@@ -32,6 +32,9 @@
<ClCompile Include="TCPHandler.cpp">
<Filter>Source</Filter>
</ClCompile>
<ClCompile Include="DNSHandler.cpp">
<Filter>Source</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="EventHandler.h">
@@ -52,5 +55,8 @@
<ClInclude Include="TCPHandler.h">
<Filter>Header</Filter>
</ClInclude>
<ClInclude Include="DNSHandler.h">
<Filter>Header</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@@ -412,25 +412,28 @@ int SocksHelper::UDP::Read(PSOCKADDR_IN6 target, char* buffer, int length)
return bufferLength;
}
memset(target, 0, sizeof(SOCKADDR_IN6));
if (buffer[3] == 0x01)
if (target != NULL)
{
auto ipv4 = (PSOCKADDR_IN)target;
ipv4->sin_family = AF_INET;
memset(target, 0, sizeof(SOCKADDR_IN6));
if (buffer[3] == 0x01)
{
auto ipv4 = (PSOCKADDR_IN)target;
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
{
target->sin6_family = AF_INET6;
memcpy(&target->sin6_addr, buffer + 4, 16);
memcpy(&target->sin6_port, buffer + 20, 2);
memcpy(&target->sin6_addr, buffer + 4, 16);
memcpy(&target->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);

View File

@@ -2,7 +2,6 @@
#ifndef TCPHANDLER_H
#define TCPHANDLER_H
#include "Based.h"
#include "SocksHelper.h"
namespace TCPHandler