diff --git a/Redirector/Based.cpp b/Redirector/Based.cpp index fd5c433f..2c362316 100644 --- a/Redirector/Based.cpp +++ b/Redirector/Based.cpp @@ -6,8 +6,8 @@ BOOL filterTCP = TRUE; BOOL filterUDP = TRUE; USHORT tcpPort = 0; USHORT udpPort = 0; -vector handleList; vector bypassList; +vector handleList; mutex tcpLock; mutex udpLock; diff --git a/Redirector/Based.h b/Redirector/Based.h index ab81e4e4..6866b843 100644 --- a/Redirector/Based.h +++ b/Redirector/Based.h @@ -1,6 +1,7 @@ #pragma once #ifndef BASED_H #define BASED_H +#define _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING #include #include @@ -11,6 +12,7 @@ #include #include #include +#include #include #include diff --git a/Redirector/EventHandler.cpp b/Redirector/EventHandler.cpp index 8252442e..e689eb7b 100644 --- a/Redirector/EventHandler.cpp +++ b/Redirector/EventHandler.cpp @@ -5,8 +5,8 @@ extern BOOL filterTCP; extern BOOL filterUDP; extern USHORT udpPort; -extern vector handleList; extern vector bypassList; +extern vector handleList; extern mutex tcpLock; extern mutex udpLock; diff --git a/Redirector/Redirector.cpp b/Redirector/Redirector.cpp index a164aa22..ff4e7a82 100644 --- a/Redirector/Redirector.cpp +++ b/Redirector/Redirector.cpp @@ -1,6 +1,7 @@ #include "Based.h" #include "EventHandler.h" #include "IPEventHandler.h" +#include "Utils.h" extern BOOL filterLoopback; extern BOOL filterICMP; @@ -8,8 +9,8 @@ extern BOOL filterTCP; extern BOOL filterUDP; extern USHORT tcpPort; extern USHORT udpPort; -extern vector handleList; extern vector bypassList; +extern vector handleList; NF_EventHandler EventHandler = { threadStart, @@ -47,28 +48,51 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) extern "C" { __declspec(dllexport) BOOL __cdecl aio_dial(INT name, LPWSTR value) { - UNREFERENCED_PARAMETER(name); - UNREFERENCED_PARAMETER(value); - switch (name) { case AIO_FILTERLOOPBACK: + filterLoopback = (wstring(value).find(L"false") == string::npos); break; case AIO_FILTERICMP: + filterICMP = (wstring(value).find(L"false") == string::npos); break; case AIO_FILTERTCP: + filterTCP = (wstring(value).find(L"false") == string::npos); break; case AIO_FILTERUDP: + filterUDP = (wstring(value).find(L"false") == string::npos); break; case AIO_CLRNAME: + bypassList.clear(); + handleList.clear(); break; case AIO_BYPNAME: + try + { + std::wregex checker(value); + } + catch (regex_error) { + return FALSE; + } + + bypassList.emplace_back(value); break; case AIO_ADDNAME: + try + { + std::wregex checker(value); + } + catch (regex_error) { + return FALSE; + } + + handleList.emplace_back(value); break; case AIO_TCPPORT: + tcpPort = (USHORT)atoi(ws2s(value).c_str()); break; case AIO_UDPPORT: + udpPort = (USHORT)atoi(ws2s(value).c_str()); break; default: return FALSE; @@ -79,24 +103,98 @@ extern "C" { __declspec(dllexport) BOOL __cdecl aio_init() { + WSADATA data; + if (WSAStartup(MAKEWORD(2, 2), &data) != NO_ERROR) { - WSADATA data; - UNREFERENCED_PARAMETER(WSAStartup(MAKEWORD(2, 2), &data)); + puts("[Redirector][aio_init] WSAStartup != NO_ERROR"); + return FALSE; } nf_adjustProcessPriviledges(); + if (!eh_init()) + { + puts("[Redirector][aio_init] !eh_init"); + return FALSE; + } - return FALSE; + if (nf_init("netfilter2", &EventHandler) != NF_STATUS_SUCCESS) + { + puts("[Redirector][aio_init] nf_init != NF_STATUS_SUCCESS"); + return FALSE; + } + + NF_RULE rule; + if (!filterLoopback) + { + memset(&rule, 0, sizeof(NF_RULE)); + rule.ip_family = AF_INET; + inet_pton(AF_INET, "127.0.0.1", rule.remoteIpAddress); + inet_pton(AF_INET, "255.0.0.0", rule.remoteIpAddressMask); + rule.filteringFlag = NF_ALLOW; + nf_addRule(&rule, FALSE); + + memset(&rule, 0, sizeof(NF_RULE)); + rule.ip_family = AF_INET6; + rule.remoteIpAddress[15] = 1; + memset(rule.remoteIpAddressMask, 0xff, sizeof(rule.remoteIpAddressMask)); + rule.filteringFlag = NF_ALLOW; + nf_addRule(&rule, FALSE); + } + + if (filterICMP) + { + nf_setIPEventHandler(&IPEventHandler); + + memset(&rule, 0, sizeof(NF_RULE)); + rule.ip_family = AF_INET; + rule.protocol = IPPROTO_ICMP; + rule.direction = NF_D_OUT; + rule.filteringFlag = NF_FILTER_AS_IP_PACKETS; + nf_addRule(&rule, FALSE); + } + + if (filterTCP) + { + memset(&rule, 0, sizeof(NF_RULE)); + rule.ip_family = AF_INET; + rule.protocol = IPPROTO_TCP; + rule.direction = NF_D_OUT; + rule.filteringFlag = NF_INDICATE_CONNECT_REQUESTS; + nf_addRule(&rule, FALSE); + + memset(&rule, 0, sizeof(NF_RULE)); + rule.ip_family = AF_INET6; + rule.protocol = IPPROTO_TCP; + rule.direction = NF_D_OUT; + rule.filteringFlag = NF_INDICATE_CONNECT_REQUESTS; + nf_addRule(&rule, FALSE); + } + + if (filterUDP) + { + memset(&rule, 0, sizeof(NF_RULE)); + rule.ip_family = AF_INET; + rule.protocol = IPPROTO_UDP; + rule.filteringFlag = NF_FILTER; + nf_addRule(&rule, FALSE); + + memset(&rule, 0, sizeof(NF_RULE)); + rule.ip_family = AF_INET6; + rule.protocol = IPPROTO_UDP; + rule.filteringFlag = NF_FILTER; + nf_addRule(&rule, FALSE); + } + + return TRUE; } __declspec(dllexport) void __cdecl aio_free() { nf_deleteRules(); nf_free(); - eh_free(); - UNREFERENCED_PARAMETER(WSACleanup()); + WSACleanup(); return; } } diff --git a/Redirector/Redirector.vcxproj b/Redirector/Redirector.vcxproj index 20584795..2c103d4b 100644 --- a/Redirector/Redirector.vcxproj +++ b/Redirector/Redirector.vcxproj @@ -101,12 +101,14 @@ + + diff --git a/Redirector/Redirector.vcxproj.filters b/Redirector/Redirector.vcxproj.filters index 17d9dcda..9dcc3842 100644 --- a/Redirector/Redirector.vcxproj.filters +++ b/Redirector/Redirector.vcxproj.filters @@ -26,6 +26,9 @@ Source + + Source + @@ -40,6 +43,9 @@ Header + + Header + diff --git a/Redirector/Utils.cpp b/Redirector/Utils.cpp new file mode 100644 index 00000000..bdef8077 --- /dev/null +++ b/Redirector/Utils.cpp @@ -0,0 +1,11 @@ +#include "Utils.h" + +string ws2s(const wstring str) +{ + return wstring_convert, wchar_t>().to_bytes(str); +} + +wstring s2ws(const string str) +{ + return wstring_convert, wchar_t>().from_bytes(str); +} diff --git a/Redirector/Utils.h b/Redirector/Utils.h new file mode 100644 index 00000000..71da270b --- /dev/null +++ b/Redirector/Utils.h @@ -0,0 +1,8 @@ +#pragma once +#ifndef UTILS_H +#define UTILS_H +#include "Based.h" + +string ws2s(const wstring str); +wstring s2ws(const string str); +#endif