mirror of
https://github.com/netchx/netch.git
synced 2026-05-11 23:45:06 +08:00
Update Redirector
This commit is contained in:
@@ -2,7 +2,6 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
namespace Netch.Controllers.Other.DNS
|
namespace Netch.Controllers.Other.DNS
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,8 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Netch.Controllers.Server
|
namespace Netch.Controllers.Server
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,10 +1,4 @@
|
|||||||
using System;
|
namespace Netch.Models.Server.Clash
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Netch.Models.Server.Clash
|
|
||||||
{
|
{
|
||||||
public class Clash : Server
|
public class Clash : Server
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
#include "API.h"
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#ifndef API_H
|
|
||||||
#define API_H
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
#include "DNS.h"
|
#include "DNS.h"
|
||||||
|
|
||||||
#include "API.h"
|
|
||||||
#include "Data.h"
|
#include "Data.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
|
|
||||||
@@ -8,12 +7,12 @@
|
|||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
extern string dnsHost;
|
extern string dnsHost;
|
||||||
extern USHORT dnsPort;
|
extern USHORT dnsPort;
|
||||||
extern USHORT dnsLisn;
|
|
||||||
|
|
||||||
typedef struct _DNSPKT {
|
typedef struct _DNSPKT {
|
||||||
ENDPOINT_ID ID;
|
ENDPOINT_ID ID;
|
||||||
@@ -24,11 +23,11 @@ typedef struct _DNSPKT {
|
|||||||
PNF_UDP_OPTIONS Option;
|
PNF_UDP_OPTIONS Option;
|
||||||
} DNSPKT, * PDNSPKT;
|
} DNSPKT, * PDNSPKT;
|
||||||
|
|
||||||
BOOL dnsInit = FALSE;
|
BOOL dnsInited = FALSE;
|
||||||
HANDLE dnsLock = NULL;
|
HANDLE dnsLock = NULL;
|
||||||
list<PDNSPKT> dnsList;
|
list<PDNSPKT> dnsList;
|
||||||
|
|
||||||
SOCKET CreateSocket()
|
SOCKET dns_createSocket()
|
||||||
{
|
{
|
||||||
sockaddr_in addr;
|
sockaddr_in addr;
|
||||||
addr.sin_family = AF_INET;
|
addr.sin_family = AF_INET;
|
||||||
@@ -36,13 +35,13 @@ SOCKET CreateSocket()
|
|||||||
addr.sin_port = 0;
|
addr.sin_port = 0;
|
||||||
|
|
||||||
auto client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
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());
|
printf("[Redirector][DNS][CreateSocket] Unable to create socket: %d\n", WSAGetLastError());
|
||||||
return NULL;
|
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());
|
printf("[Redirector][DNS][CreateSocket] Unable to bind socket: %d\n", WSAGetLastError());
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -51,7 +50,7 @@ SOCKET CreateSocket()
|
|||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DnsFreePacket(PDNSPKT i)
|
void dns_freePacket(PDNSPKT i)
|
||||||
{
|
{
|
||||||
if (i)
|
if (i)
|
||||||
{
|
{
|
||||||
@@ -76,42 +75,16 @@ void DnsFreePacket(PDNSPKT i)
|
|||||||
i = NULL;
|
i = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dns_init()
|
void dns_work()
|
||||||
{
|
|
||||||
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()
|
|
||||||
{
|
{
|
||||||
sockaddr_in addr;
|
sockaddr_in addr;
|
||||||
memset(&addr, 0, sizeof(sockaddr_in));
|
memset(&addr, 0, sizeof(sockaddr_in));
|
||||||
addr.sin_addr.S_un.S_addr = inet_addr(dnsHost.c_str());
|
addr.sin_addr.S_un.S_addr = inet_addr(dnsHost.c_str());
|
||||||
addr.sin_port = htons(dnsPort);
|
addr.sin_port = htons(dnsPort);
|
||||||
|
|
||||||
while (dnsInit)
|
while (dnsInited)
|
||||||
{
|
{
|
||||||
auto client = CreateSocket();
|
auto client = dns_createSocket();
|
||||||
if (NULL == client)
|
if (NULL == client)
|
||||||
{
|
{
|
||||||
Sleep(100);
|
Sleep(100);
|
||||||
@@ -123,7 +96,7 @@ void dnsWorker()
|
|||||||
{
|
{
|
||||||
closesocket(client);
|
closesocket(client);
|
||||||
ReleaseMutex(dnsLock);
|
ReleaseMutex(dnsLock);
|
||||||
|
|
||||||
Sleep(1);
|
Sleep(1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -135,7 +108,7 @@ void dnsWorker()
|
|||||||
if (data->BufferLength != (ULONG)sendto(client, (PCHAR)data->Buffer, data->BufferLength, NULL, (PSOCKADDR)&addr, sizeof(sockaddr_in)))
|
if (data->BufferLength != (ULONG)sendto(client, (PCHAR)data->Buffer, data->BufferLength, NULL, (PSOCKADDR)&addr, sizeof(sockaddr_in)))
|
||||||
{
|
{
|
||||||
closesocket(client);
|
closesocket(client);
|
||||||
DnsFreePacket(data);
|
dns_freePacket(data);
|
||||||
|
|
||||||
printf("[Redirector][DNS][dnsWorker] Unable to send packet: %d\n", WSAGetLastError());
|
printf("[Redirector][DNS][dnsWorker] Unable to send packet: %d\n", WSAGetLastError());
|
||||||
continue;
|
continue;
|
||||||
@@ -146,7 +119,7 @@ void dnsWorker()
|
|||||||
if (!length)
|
if (!length)
|
||||||
{
|
{
|
||||||
closesocket(client);
|
closesocket(client);
|
||||||
DnsFreePacket(data);
|
dns_freePacket(data);
|
||||||
|
|
||||||
printf("[Redirector][DNS][dnsWorker] Unable to receive packet: %d\n", WSAGetLastError());
|
printf("[Redirector][DNS][dnsWorker] Unable to receive packet: %d\n", WSAGetLastError());
|
||||||
continue;
|
continue;
|
||||||
@@ -154,13 +127,43 @@ void dnsWorker()
|
|||||||
|
|
||||||
nf_udpPostReceive(data->ID, data->Target, buffer, length, data->Option);
|
nf_udpPostReceive(data->ID, data->Target, buffer, length, data->Option);
|
||||||
closesocket(client);
|
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)
|
void dnsCreate(ENDPOINT_ID id, PBYTE target, ULONG targetLength, PCHAR buffer, ULONG bufferLength, PNF_UDP_OPTIONS option)
|
||||||
{
|
{
|
||||||
if (!dnsInit)
|
if (!dnsInited)
|
||||||
{
|
{
|
||||||
return;
|
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");
|
puts("[Redirector][DNS][dnsCreate] Unable to allocate memory");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(data, 0, sizeof(DNSPKT));
|
|
||||||
data->ID = id;
|
data->ID = id;
|
||||||
|
|
||||||
data->Target = (PBYTE)malloc(targetLength);
|
data->Target = (PBYTE)malloc(targetLength);
|
||||||
@@ -222,7 +223,7 @@ void dnsDelete()
|
|||||||
|
|
||||||
for (auto i : dnsList)
|
for (auto i : dnsList)
|
||||||
{
|
{
|
||||||
DnsFreePacket(i);
|
dns_freePacket(i);
|
||||||
}
|
}
|
||||||
dnsList.clear();
|
dnsList.clear();
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
void dns_init();
|
void dns_init();
|
||||||
void dns_free();
|
void dns_free();
|
||||||
void dnsWorker();
|
|
||||||
void dnsCreate(ENDPOINT_ID id, PBYTE target, ULONG targetLength, PCHAR buffer, ULONG bufferLength, PNF_UDP_OPTIONS options);
|
void dnsCreate(ENDPOINT_ID id, PBYTE target, ULONG targetLength, PCHAR buffer, ULONG bufferLength, PNF_UDP_OPTIONS options);
|
||||||
void dnsDelete();
|
void dnsDelete();
|
||||||
|
|
||||||
|
|||||||
@@ -1,30 +1,18 @@
|
|||||||
#include "Data.h"
|
#include "Data.h"
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
BOOL Started = FALSE;
|
BOOL Started = FALSE;
|
||||||
BOOL filterLoop = FALSE;
|
BOOL filterLoop = FALSE;
|
||||||
BOOL filterICMP = TRUE;
|
BOOL filterICMP = TRUE;
|
||||||
BOOL filterTCP = TRUE;
|
BOOL filterTCP = TRUE;
|
||||||
BOOL filterUDP = TRUE;
|
BOOL filterUDP = TRUE;
|
||||||
BOOL dnsHook = FALSE;
|
BOOL dnsHook = FALSE;
|
||||||
string dnsHost = "";
|
string dnsHost = "";
|
||||||
USHORT dnsPort = 0;
|
USHORT dnsPort = 0;
|
||||||
USHORT apiLisn = 0;
|
USHORT tcpLisn = 0;
|
||||||
USHORT tcpLisn = 0;
|
USHORT udpLisn = 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;
|
|
||||||
|
|||||||
@@ -19,17 +19,8 @@ typedef enum _AIO_TYPE {
|
|||||||
AIO_DNSHOST,
|
AIO_DNSHOST,
|
||||||
AIO_DNSPORT,
|
AIO_DNSPORT,
|
||||||
|
|
||||||
AIO_APIPORT,
|
|
||||||
AIO_TCPPORT,
|
AIO_TCPPORT,
|
||||||
AIO_UDPPORT
|
AIO_UDPPORT
|
||||||
} AIO_TYPE;
|
} AIO_TYPE;
|
||||||
|
|
||||||
typedef struct _TCPINFO {
|
|
||||||
BYTE Target[NF_MAX_ADDRESS_LENGTH];
|
|
||||||
} TCPINFO, * PTCPINFO;
|
|
||||||
|
|
||||||
typedef struct _UDPINFO {
|
|
||||||
SOCKET Socket;
|
|
||||||
} UDPINFO, * PUDPINFO;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,27 +1,148 @@
|
|||||||
#include "EventHandler.h"
|
#include "EventHandler.h"
|
||||||
|
|
||||||
|
#include "DNS.h"
|
||||||
#include "Data.h"
|
#include "Data.h"
|
||||||
|
|
||||||
#include <stdio.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)
|
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;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL checkHandleName(DWORD id)
|
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;
|
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()
|
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()
|
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)
|
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)
|
void tcpCanSend(ENDPOINT_ID id)
|
||||||
{
|
{
|
||||||
|
UNREFERENCED_PARAMETER(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tcpSend(ENDPOINT_ID id, const char* buffer, int length)
|
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)
|
void tcpCanReceive(ENDPOINT_ID id)
|
||||||
{
|
{
|
||||||
|
UNREFERENCED_PARAMETER(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tcpReceive(ENDPOINT_ID id, const char* buffer, int length)
|
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)
|
void udpConnectRequest(ENDPOINT_ID id, PNF_UDP_CONN_REQUEST info)
|
||||||
{
|
{
|
||||||
|
UNREFERENCED_PARAMETER(id);
|
||||||
|
UNREFERENCED_PARAMETER(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
void udpCanSend(ENDPOINT_ID id)
|
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)
|
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)
|
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)
|
void udpReceive(ENDPOINT_ID id, const unsigned char* target, const char* buffer, int length, PNF_UDP_OPTIONS options)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
#include <nfapi.h>
|
#include <nfapi.h>
|
||||||
|
|
||||||
BOOL eh_init();
|
void eh_init();
|
||||||
void eh_free();
|
void eh_free();
|
||||||
|
|
||||||
void threadStart();
|
void threadStart();
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
void ipSend(const char* buffer, int length, PNF_IP_PACKET_OPTIONS options)
|
void ipSend(const char* buffer, int length, PNF_IP_PACKET_OPTIONS options)
|
||||||
{
|
{
|
||||||
if (options->ip_family != AF_INET ||
|
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 + 2] = icmpsum & 0xff;
|
||||||
data[options->ipHeaderSize + 3] = (icmpsum >> 8);
|
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);
|
free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +1,36 @@
|
|||||||
All address use SOCKS5 format
|
All address use SOCKS5 format
|
||||||
|
|
||||||
/* DNS */
|
/* DNS */
|
||||||
Only UDP DNS
|
Send
|
||||||
+------+
|
+------+
|
||||||
| Data |
|
| Data |
|
||||||
+------+
|
+------+
|
||||||
| ???? |
|
| ???? |
|
||||||
+------+
|
+------+
|
||||||
|
|
||||||
/* API */
|
Receive
|
||||||
Based UDP
|
+------+
|
||||||
+-----+----------+-------------+
|
| Data |
|
||||||
| PID | Protocol | Client Port |
|
+------+
|
||||||
+-----+----------+-------------+
|
| ???? |
|
||||||
| 4 | 1 | 2 |
|
+------+
|
||||||
+-----+----------+-------------+
|
|
||||||
|
|
||||||
/* TCP */
|
/* TCP */
|
||||||
|
First Packet
|
||||||
|
+-----+--------+
|
||||||
|
| PID | Target |
|
||||||
|
+-----+--------+
|
||||||
|
| 4 | ?????? |
|
||||||
|
+-----+--------+
|
||||||
|
|
||||||
|
Send
|
||||||
|
+------+
|
||||||
|
| Data |
|
||||||
|
+------+
|
||||||
|
| ???? |
|
||||||
|
+------+
|
||||||
|
|
||||||
|
Receive
|
||||||
+------+
|
+------+
|
||||||
| Data |
|
| Data |
|
||||||
+------+
|
+------+
|
||||||
@@ -24,6 +38,13 @@ Based UDP
|
|||||||
+------+
|
+------+
|
||||||
|
|
||||||
/* UDP */
|
/* UDP */
|
||||||
|
First Packet
|
||||||
|
+-----+
|
||||||
|
| PID |
|
||||||
|
+-----+
|
||||||
|
| 4 |
|
||||||
|
+-----+
|
||||||
|
|
||||||
Send
|
Send
|
||||||
+--------+------+
|
+--------+------+
|
||||||
| Target | Data |
|
| Target | Data |
|
||||||
|
|||||||
@@ -6,21 +6,23 @@
|
|||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include <nfapi.h>
|
#include <nfapi.h>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
extern BOOL filterLoop;
|
extern BOOL filterLoop;
|
||||||
extern BOOL filterICMP;
|
extern BOOL filterICMP;
|
||||||
extern BOOL filterTCP;
|
extern BOOL filterTCP;
|
||||||
extern BOOL filterUDP;
|
extern BOOL filterUDP;
|
||||||
extern BOOL dnsHook;
|
extern BOOL dnsHook;
|
||||||
extern string dnsHost;
|
extern string dnsHost;
|
||||||
extern USHORT dnsPort;
|
extern USHORT dnsPort;
|
||||||
extern USHORT apiLisn;
|
|
||||||
extern USHORT tcpLisn;
|
extern USHORT tcpLisn;
|
||||||
extern USHORT udpLisn;
|
extern USHORT udpLisn;
|
||||||
|
extern vector<wstring> handleList;
|
||||||
|
extern vector<wstring> bypassList;
|
||||||
|
|
||||||
NF_EventHandler EventHandler = {
|
NF_EventHandler EventHandler = {
|
||||||
threadStart,
|
threadStart,
|
||||||
@@ -55,9 +57,7 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
|
||||||
__declspec(dllexport) BOOL __cdecl aio_dial(INT name, LPWSTR value)
|
__declspec(dllexport) BOOL __cdecl aio_dial(INT name, LPWSTR value)
|
||||||
{
|
{
|
||||||
UNREFERENCED_PARAMETER(name);
|
UNREFERENCED_PARAMETER(name);
|
||||||
@@ -79,8 +79,6 @@ extern "C" {
|
|||||||
break;
|
break;
|
||||||
case AIO_DNSPORT:
|
case AIO_DNSPORT:
|
||||||
break;
|
break;
|
||||||
case AIO_APIPORT:
|
|
||||||
break;
|
|
||||||
case AIO_TCPPORT:
|
case AIO_TCPPORT:
|
||||||
break;
|
break;
|
||||||
case AIO_UDPPORT:
|
case AIO_UDPPORT:
|
||||||
@@ -106,10 +104,12 @@ extern "C" {
|
|||||||
|
|
||||||
__declspec(dllexport) void __cdecl aio_free()
|
__declspec(dllexport) void __cdecl aio_free()
|
||||||
{
|
{
|
||||||
UNREFERENCED_PARAMETER(WSACleanup());
|
nf_deleteRules();
|
||||||
|
nf_free();
|
||||||
|
|
||||||
|
eh_free();
|
||||||
|
|
||||||
|
UNREFERENCED_PARAMETER(WSACleanup());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -99,7 +99,6 @@
|
|||||||
</PostBuildEvent>
|
</PostBuildEvent>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="API.cpp" />
|
|
||||||
<ClCompile Include="Data.cpp" />
|
<ClCompile Include="Data.cpp" />
|
||||||
<ClCompile Include="DNS.cpp" />
|
<ClCompile Include="DNS.cpp" />
|
||||||
<ClCompile Include="EventHandler.cpp" />
|
<ClCompile Include="EventHandler.cpp" />
|
||||||
@@ -108,7 +107,6 @@
|
|||||||
<ClCompile Include="Utils.cpp" />
|
<ClCompile Include="Utils.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="API.h" />
|
|
||||||
<ClInclude Include="Data.h" />
|
<ClInclude Include="Data.h" />
|
||||||
<ClInclude Include="DNS.h" />
|
<ClInclude Include="DNS.h" />
|
||||||
<ClInclude Include="EventHandler.h" />
|
<ClInclude Include="EventHandler.h" />
|
||||||
|
|||||||
@@ -29,9 +29,6 @@
|
|||||||
<ClCompile Include="DNS.cpp">
|
<ClCompile Include="DNS.cpp">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="API.cpp">
|
|
||||||
<Filter>Source</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="EventHandler.h">
|
<ClInclude Include="EventHandler.h">
|
||||||
@@ -49,9 +46,6 @@
|
|||||||
<ClInclude Include="DNS.h">
|
<ClInclude Include="DNS.h">
|
||||||
<Filter>Header</Filter>
|
<Filter>Header</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="API.h">
|
|
||||||
<Filter>Header</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Text Include="PROTOCOL.txt" />
|
<Text Include="PROTOCOL.txt" />
|
||||||
|
|||||||
Reference in New Issue
Block a user