From 5a62092b2abf54c7a40f34eaa7cd0b4a8618bceb Mon Sep 17 00:00:00 2001 From: Netch Date: Tue, 20 Jul 2021 06:51:54 +0800 Subject: [PATCH] Update Redirector --- .../Controllers/Other/DNS/AioDNSController.cs | 1 - Netch/Controllers/Server/ClashController.cs | 4 - Netch/Models/Server/Clash/Clash.cs | 8 +- Redirector/API.cpp | 1 - Redirector/API.h | 5 - Redirector/DNS.cpp | 91 ++++++------ Redirector/DNS.h | 1 - Redirector/Data.cpp | 32 ++-- Redirector/Data.h | 9 -- Redirector/EventHandler.cpp | 140 +++++++++++++++++- Redirector/EventHandler.h | 2 +- Redirector/IPEventHandler.cpp | 8 +- Redirector/PROTOCOL.txt | 37 ++++- Redirector/Redirector.cpp | 26 ++-- Redirector/Redirector.vcxproj | 2 - Redirector/Redirector.vcxproj.filters | 6 - 16 files changed, 236 insertions(+), 137 deletions(-) delete mode 100644 Redirector/API.cpp delete mode 100644 Redirector/API.h diff --git a/Netch/Controllers/Other/DNS/AioDNSController.cs b/Netch/Controllers/Other/DNS/AioDNSController.cs index 661b734e..cc506b16 100644 --- a/Netch/Controllers/Other/DNS/AioDNSController.cs +++ b/Netch/Controllers/Other/DNS/AioDNSController.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; -using System.Runtime.InteropServices; namespace Netch.Controllers.Other.DNS { diff --git a/Netch/Controllers/Server/ClashController.cs b/Netch/Controllers/Server/ClashController.cs index d2d71fec..76043ee1 100644 --- a/Netch/Controllers/Server/ClashController.cs +++ b/Netch/Controllers/Server/ClashController.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Netch.Controllers.Server { diff --git a/Netch/Models/Server/Clash/Clash.cs b/Netch/Models/Server/Clash/Clash.cs index 2bc05562..e2fa2f83 100644 --- a/Netch/Models/Server/Clash/Clash.cs +++ b/Netch/Models/Server/Clash/Clash.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Netch.Models.Server.Clash +namespace Netch.Models.Server.Clash { public class Clash : Server { diff --git a/Redirector/API.cpp b/Redirector/API.cpp deleted file mode 100644 index b5131617..00000000 --- a/Redirector/API.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "API.h" diff --git a/Redirector/API.h b/Redirector/API.h deleted file mode 100644 index 5fbb7432..00000000 --- a/Redirector/API.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -#ifndef API_H -#define API_H - -#endif diff --git a/Redirector/DNS.cpp b/Redirector/DNS.cpp index 39f11edb..26bd00a0 100644 --- a/Redirector/DNS.cpp +++ b/Redirector/DNS.cpp @@ -1,6 +1,5 @@ #include "DNS.h" -#include "API.h" #include "Data.h" #include "Utils.h" @@ -8,12 +7,12 @@ #include #include +#include using namespace std; extern string dnsHost; extern USHORT dnsPort; -extern USHORT dnsLisn; typedef struct _DNSPKT { ENDPOINT_ID ID; @@ -24,11 +23,11 @@ typedef struct _DNSPKT { PNF_UDP_OPTIONS Option; } DNSPKT, * PDNSPKT; -BOOL dnsInit = FALSE; -HANDLE dnsLock = NULL; +BOOL dnsInited = FALSE; +HANDLE dnsLock = NULL; list dnsList; -SOCKET CreateSocket() +SOCKET dns_createSocket() { sockaddr_in addr; addr.sin_family = AF_INET; @@ -36,13 +35,13 @@ SOCKET CreateSocket() addr.sin_port = 0; auto client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (INVALID_SOCKET == client) + if (client == INVALID_SOCKET) { printf("[Redirector][DNS][CreateSocket] Unable to create socket: %d\n", WSAGetLastError()); return NULL; } - if (SOCKET_ERROR == bind(client, (PSOCKADDR)&addr, sizeof(sockaddr_in))) + if (bind(client, (PSOCKADDR)&addr, sizeof(sockaddr_in)) == SOCKET_ERROR) { printf("[Redirector][DNS][CreateSocket] Unable to bind socket: %d\n", WSAGetLastError()); return NULL; @@ -51,7 +50,7 @@ SOCKET CreateSocket() return client; } -void DnsFreePacket(PDNSPKT i) +void dns_freePacket(PDNSPKT i) { if (i) { @@ -76,42 +75,16 @@ void DnsFreePacket(PDNSPKT i) i = NULL; } -void dns_init() -{ - dnsInit = TRUE; - - if (!dnsLock) - { - dnsLock = CreateMutex(NULL, FALSE, NULL); - } - - dnsDelete(); -} - -void dns_free() -{ - dnsInit = FALSE; - Sleep(10); - - if (dnsLock) - { - dnsDelete(); - - CloseHandle(dnsLock); - dnsLock = NULL; - } -} - -void dnsWorker() +void dns_work() { sockaddr_in addr; memset(&addr, 0, sizeof(sockaddr_in)); addr.sin_addr.S_un.S_addr = inet_addr(dnsHost.c_str()); addr.sin_port = htons(dnsPort); - while (dnsInit) + while (dnsInited) { - auto client = CreateSocket(); + auto client = dns_createSocket(); if (NULL == client) { Sleep(100); @@ -123,7 +96,7 @@ void dnsWorker() { closesocket(client); ReleaseMutex(dnsLock); - + Sleep(1); continue; } @@ -135,7 +108,7 @@ void dnsWorker() if (data->BufferLength != (ULONG)sendto(client, (PCHAR)data->Buffer, data->BufferLength, NULL, (PSOCKADDR)&addr, sizeof(sockaddr_in))) { closesocket(client); - DnsFreePacket(data); + dns_freePacket(data); printf("[Redirector][DNS][dnsWorker] Unable to send packet: %d\n", WSAGetLastError()); continue; @@ -146,7 +119,7 @@ void dnsWorker() if (!length) { closesocket(client); - DnsFreePacket(data); + dns_freePacket(data); printf("[Redirector][DNS][dnsWorker] Unable to receive packet: %d\n", WSAGetLastError()); continue; @@ -154,13 +127,43 @@ void dnsWorker() nf_udpPostReceive(data->ID, data->Target, buffer, length, data->Option); closesocket(client); - DnsFreePacket(data); + dns_freePacket(data); + } +} + +void dns_init() +{ + if (!dnsLock) + { + dnsLock = CreateMutex(NULL, FALSE, NULL); + } + + dnsInited = TRUE; + dnsDelete(); + + for (DWORD i = 0; i < 4; i++) + { + thread(dns_work).detach(); + } +} + +void dns_free() +{ + dnsInited = FALSE; + Sleep(10); + + if (dnsLock) + { + dnsDelete(); + + CloseHandle(dnsLock); + dnsLock = NULL; } } void dnsCreate(ENDPOINT_ID id, PBYTE target, ULONG targetLength, PCHAR buffer, ULONG bufferLength, PNF_UDP_OPTIONS option) { - if (!dnsInit) + if (!dnsInited) { return; } @@ -171,8 +174,6 @@ void dnsCreate(ENDPOINT_ID id, PBYTE target, ULONG targetLength, PCHAR buffer, U puts("[Redirector][DNS][dnsCreate] Unable to allocate memory"); return; } - - memset(data, 0, sizeof(DNSPKT)); data->ID = id; data->Target = (PBYTE)malloc(targetLength); @@ -222,7 +223,7 @@ void dnsDelete() for (auto i : dnsList) { - DnsFreePacket(i); + dns_freePacket(i); } dnsList.clear(); diff --git a/Redirector/DNS.h b/Redirector/DNS.h index b5777b2b..003e4897 100644 --- a/Redirector/DNS.h +++ b/Redirector/DNS.h @@ -7,7 +7,6 @@ void dns_init(); void dns_free(); -void dnsWorker(); void dnsCreate(ENDPOINT_ID id, PBYTE target, ULONG targetLength, PCHAR buffer, ULONG bufferLength, PNF_UDP_OPTIONS options); void dnsDelete(); diff --git a/Redirector/Data.cpp b/Redirector/Data.cpp index 964d9ed3..f6c0edb2 100644 --- a/Redirector/Data.cpp +++ b/Redirector/Data.cpp @@ -1,30 +1,18 @@ #include "Data.h" -#include #include #include #include using namespace std; -BOOL Started = FALSE; -BOOL filterLoop = FALSE; -BOOL filterICMP = TRUE; -BOOL filterTCP = TRUE; -BOOL filterUDP = TRUE; -BOOL dnsHook = FALSE; -string dnsHost = ""; -USHORT dnsPort = 0; -USHORT apiLisn = 0; -USHORT tcpLisn = 0; -USHORT udpLisn = 0; -vector handleList; -vector bypassList; - -atomic_ulong UP{ 0 }; -atomic_ulong DL{ 0 }; - -HANDLE TCPLock = NULL; -HANDLE UDPLock = NULL; -map TCPContext; -map UDPContext; +BOOL Started = FALSE; +BOOL filterLoop = FALSE; +BOOL filterICMP = TRUE; +BOOL filterTCP = TRUE; +BOOL filterUDP = TRUE; +BOOL dnsHook = FALSE; +string dnsHost = ""; +USHORT dnsPort = 0; +USHORT tcpLisn = 0; +USHORT udpLisn = 0; diff --git a/Redirector/Data.h b/Redirector/Data.h index fa2b2bfc..e3e01e08 100644 --- a/Redirector/Data.h +++ b/Redirector/Data.h @@ -19,17 +19,8 @@ typedef enum _AIO_TYPE { AIO_DNSHOST, AIO_DNSPORT, - AIO_APIPORT, AIO_TCPPORT, AIO_UDPPORT } AIO_TYPE; -typedef struct _TCPINFO { - BYTE Target[NF_MAX_ADDRESS_LENGTH]; -} TCPINFO, * PTCPINFO; - -typedef struct _UDPINFO { - SOCKET Socket; -} UDPINFO, * PUDPINFO; - #endif diff --git a/Redirector/EventHandler.cpp b/Redirector/EventHandler.cpp index 1b93bcab..abc954f1 100644 --- a/Redirector/EventHandler.cpp +++ b/Redirector/EventHandler.cpp @@ -1,27 +1,148 @@ #include "EventHandler.h" +#include "DNS.h" #include "Data.h" #include +#include +#include +#include +#include + +using namespace std; + +extern BOOL dnsHook; +extern USHORT tcpLisn; +extern USHORT udpLisn; + +typedef struct _TCPINFO { + DWORD PID; + PBYTE Target; +} TCPINFO, * PTCPINFO; + +typedef struct _UDPINFO { + SOCKET Socket; +} UDPINFO, * PUDPINFO; + +vector handleList; +vector bypassList; + +HANDLE TCPLock = NULL; +HANDLE UDPLock = NULL; +map TCPContext; +map UDPContext; + +wstring getProcessName(DWORD id) +{ + if (id == 0) + { + return L"Idle"; + } + + if (id == 4) + { + return L"System"; + } + + wchar_t name[MAX_PATH]; + if (!nf_getProcessNameFromKernel(id, name, MAX_PATH)) + { + if (!nf_getProcessNameW(id, name, MAX_PATH)) + { + return L"Unknown"; + } + } + + wchar_t result[MAX_PATH]; + if (GetLongPathNameW(name, result, MAX_PATH)) + { + return result; + } + + return name; +} + BOOL checkBypassName(DWORD id) { + auto name = getProcessName(id); + + for (size_t i = 0; i < bypassList.size(); i++) + { + if (regex_search(name, wregex(bypassList[i]))) + { + return TRUE; + } + } + return FALSE; } BOOL checkHandleName(DWORD id) { + auto name = getProcessName(id); + + for (size_t i = 0; i < handleList.size(); i++) + { + if (regex_search(name, wregex(handleList[i]))) + { + return TRUE; + } + } + return FALSE; } -BOOL eh_init() +void eh_init() { - return TRUE; + if (!TCPLock) + { + TCPLock = CreateMutex(NULL, FALSE, NULL); + } + + if (!UDPLock) + { + UDPLock = CreateMutex(NULL, FALSE, NULL); + } + + dns_init(); } void eh_free() { - + WaitForSingleObject(TCPLock, INFINITE); + WaitForSingleObject(UDPLock, INFINITE); + + for (auto& [k, v] : TCPContext) + { + if (v->Target) + { + free(v->Target); + v->Target = NULL; + } + } + TCPContext.clear(); + + for (auto& [k, v] : UDPContext) + { + if (v->Socket) + { + closesocket(v->Socket); + v->Socket = NULL; + } + } + UDPContext.clear(); + + ReleaseMutex(TCPLock); + ReleaseMutex(UDPLock); + + CloseHandle(TCPLock); + CloseHandle(UDPLock); + + TCPLock = NULL; + UDPLock = NULL; + + dns_free(); } void threadStart() @@ -41,12 +162,14 @@ void tcpConnectRequest(ENDPOINT_ID id, PNF_TCP_CONN_INFO info) void tcpConnected(ENDPOINT_ID id, PNF_TCP_CONN_INFO info) { + UNREFERENCED_PARAMETER(info); + printf("[Redirector][EventHandler][tcpConnected][%llu]\n", id); } void tcpCanSend(ENDPOINT_ID id) { - + UNREFERENCED_PARAMETER(id); } void tcpSend(ENDPOINT_ID id, const char* buffer, int length) @@ -56,7 +179,7 @@ void tcpSend(ENDPOINT_ID id, const char* buffer, int length) void tcpCanReceive(ENDPOINT_ID id) { - + UNREFERENCED_PARAMETER(id); } void tcpReceive(ENDPOINT_ID id, const char* buffer, int length) @@ -76,12 +199,13 @@ void udpCreated(ENDPOINT_ID id, PNF_UDP_CONN_INFO info) void udpConnectRequest(ENDPOINT_ID id, PNF_UDP_CONN_REQUEST info) { - + UNREFERENCED_PARAMETER(id); + UNREFERENCED_PARAMETER(info); } void udpCanSend(ENDPOINT_ID id) { - + UNREFERENCED_PARAMETER(id); } void udpSend(ENDPOINT_ID id, const unsigned char* target, const char* buffer, int length, PNF_UDP_OPTIONS options) @@ -91,7 +215,7 @@ void udpSend(ENDPOINT_ID id, const unsigned char* target, const char* buffer, in void udpCanReceive(ENDPOINT_ID id) { - + UNREFERENCED_PARAMETER(id); } void udpReceive(ENDPOINT_ID id, const unsigned char* target, const char* buffer, int length, PNF_UDP_OPTIONS options) diff --git a/Redirector/EventHandler.h b/Redirector/EventHandler.h index 5cf7f771..7e04265a 100644 --- a/Redirector/EventHandler.h +++ b/Redirector/EventHandler.h @@ -5,7 +5,7 @@ #include -BOOL eh_init(); +void eh_init(); void eh_free(); void threadStart(); diff --git a/Redirector/IPEventHandler.cpp b/Redirector/IPEventHandler.cpp index 8e14b358..1fc1f7e4 100644 --- a/Redirector/IPEventHandler.cpp +++ b/Redirector/IPEventHandler.cpp @@ -4,6 +4,8 @@ #include +using namespace std; + void ipSend(const char* buffer, int length, PNF_IP_PACKET_OPTIONS options) { if (options->ip_family != AF_INET || @@ -47,11 +49,9 @@ void ipSend(const char* buffer, int length, PNF_IP_PACKET_OPTIONS options) data[options->ipHeaderSize + 2] = icmpsum & 0xff; data[options->ipHeaderSize + 3] = (icmpsum >> 8); - if (NF_STATUS_SUCCESS == nf_ipPostReceive((PCHAR)data, length, options)) - { - printf("[Redirector][ipSend] Fake ICMP response for %d.%d.%d.%d\n", data[12], data[13], data[14], data[15]); - } + printf("[Redirector][ipSend] Fake ICMP response for %d.%d.%d.%d\n", data[12], data[13], data[14], data[15]); + nf_ipPostReceive((PCHAR)data, length, options); free(data); } diff --git a/Redirector/PROTOCOL.txt b/Redirector/PROTOCOL.txt index 2aa87d4f..0d3ef084 100644 --- a/Redirector/PROTOCOL.txt +++ b/Redirector/PROTOCOL.txt @@ -1,22 +1,36 @@ All address use SOCKS5 format /* DNS */ -Only UDP DNS +Send +------+ | Data | +------+ | ???? | +------+ -/* API */ -Based UDP -+-----+----------+-------------+ -| PID | Protocol | Client Port | -+-----+----------+-------------+ -| 4 | 1 | 2 | -+-----+----------+-------------+ +Receive ++------+ +| Data | ++------+ +| ???? | ++------+ /* TCP */ +First Packet ++-----+--------+ +| PID | Target | ++-----+--------+ +| 4 | ?????? | ++-----+--------+ + +Send ++------+ +| Data | ++------+ +| ???? | ++------+ + +Receive +------+ | Data | +------+ @@ -24,6 +38,13 @@ Based UDP +------+ /* UDP */ +First Packet ++-----+ +| PID | ++-----+ +| 4 | ++-----+ + Send +--------+------+ | Target | Data | diff --git a/Redirector/Redirector.cpp b/Redirector/Redirector.cpp index ad3f92fd..9a5f7bd1 100644 --- a/Redirector/Redirector.cpp +++ b/Redirector/Redirector.cpp @@ -6,21 +6,23 @@ #include #include +#include #include using namespace std; -extern BOOL filterLoop; -extern BOOL filterICMP; -extern BOOL filterTCP; -extern BOOL filterUDP; -extern BOOL dnsHook; +extern BOOL filterLoop; +extern BOOL filterICMP; +extern BOOL filterTCP; +extern BOOL filterUDP; +extern BOOL dnsHook; extern string dnsHost; extern USHORT dnsPort; -extern USHORT apiLisn; extern USHORT tcpLisn; extern USHORT udpLisn; +extern vector handleList; +extern vector bypassList; NF_EventHandler EventHandler = { threadStart, @@ -55,9 +57,7 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv return TRUE; } -#ifdef __cplusplus extern "C" { -#endif __declspec(dllexport) BOOL __cdecl aio_dial(INT name, LPWSTR value) { UNREFERENCED_PARAMETER(name); @@ -79,8 +79,6 @@ extern "C" { break; case AIO_DNSPORT: break; - case AIO_APIPORT: - break; case AIO_TCPPORT: break; case AIO_UDPPORT: @@ -106,10 +104,12 @@ extern "C" { __declspec(dllexport) void __cdecl aio_free() { - UNREFERENCED_PARAMETER(WSACleanup()); + nf_deleteRules(); + nf_free(); + eh_free(); + + UNREFERENCED_PARAMETER(WSACleanup()); return; } -#ifdef __cplusplus } -#endif diff --git a/Redirector/Redirector.vcxproj b/Redirector/Redirector.vcxproj index c46ad408..bc28510c 100644 --- a/Redirector/Redirector.vcxproj +++ b/Redirector/Redirector.vcxproj @@ -99,7 +99,6 @@ - @@ -108,7 +107,6 @@ - diff --git a/Redirector/Redirector.vcxproj.filters b/Redirector/Redirector.vcxproj.filters index 832dbe21..826799bd 100644 --- a/Redirector/Redirector.vcxproj.filters +++ b/Redirector/Redirector.vcxproj.filters @@ -29,9 +29,6 @@ Source - - Source - @@ -49,9 +46,6 @@ Header - - Header -