Update Redirector

This commit is contained in:
Netch
2021-07-20 06:51:54 +08:00
parent 727fe27b06
commit 5a62092b2a
16 changed files with 236 additions and 137 deletions

View File

@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
namespace Netch.Controllers.Other.DNS
{

View File

@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Netch.Controllers.Server
{

View File

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

View File

@@ -1 +0,0 @@
#include "API.h"

View File

@@ -1,5 +0,0 @@
#pragma once
#ifndef API_H
#define API_H
#endif

View File

@@ -1,6 +1,5 @@
#include "DNS.h"
#include "API.h"
#include "Data.h"
#include "Utils.h"
@@ -8,12 +7,12 @@
#include <list>
#include <string>
#include <thread>
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<PDNSPKT> 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();

View File

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

View File

@@ -1,30 +1,18 @@
#include "Data.h"
#include <map>
#include <mutex>
#include <string>
#include <vector>
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<wstring> handleList;
vector<wstring> bypassList;
atomic_ulong UP{ 0 };
atomic_ulong DL{ 0 };
HANDLE TCPLock = NULL;
HANDLE UDPLock = NULL;
map<ENDPOINT_ID, PTCPINFO> TCPContext;
map<ENDPOINT_ID, PUDPINFO> 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;

View File

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

View File

@@ -1,27 +1,148 @@
#include "EventHandler.h"
#include "DNS.h"
#include "Data.h"
#include <stdio.h>
#include <map>
#include <regex>
#include <string>
#include <vector>
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<wstring> handleList;
vector<wstring> bypassList;
HANDLE TCPLock = NULL;
HANDLE UDPLock = NULL;
map<ENDPOINT_ID, PTCPINFO> TCPContext;
map<ENDPOINT_ID, PUDPINFO> 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)

View File

@@ -5,7 +5,7 @@
#include <nfapi.h>
BOOL eh_init();
void eh_init();
void eh_free();
void threadStart();

View File

@@ -4,6 +4,8 @@
#include <stdio.h>
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);
}

View File

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

View File

@@ -6,21 +6,23 @@
#include <Windows.h>
#include <string>
#include <vector>
#include <nfapi.h>
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<wstring> handleList;
extern vector<wstring> 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

View File

@@ -99,7 +99,6 @@
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="API.cpp" />
<ClCompile Include="Data.cpp" />
<ClCompile Include="DNS.cpp" />
<ClCompile Include="EventHandler.cpp" />
@@ -108,7 +107,6 @@
<ClCompile Include="Utils.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="API.h" />
<ClInclude Include="Data.h" />
<ClInclude Include="DNS.h" />
<ClInclude Include="EventHandler.h" />

View File

@@ -29,9 +29,6 @@
<ClCompile Include="DNS.cpp">
<Filter>Source</Filter>
</ClCompile>
<ClCompile Include="API.cpp">
<Filter>Source</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="EventHandler.h">
@@ -49,9 +46,6 @@
<ClInclude Include="DNS.h">
<Filter>Header</Filter>
</ClInclude>
<ClInclude Include="API.h">
<Filter>Header</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Text Include="PROTOCOL.txt" />