change wireguard vpn protocol implementation on Windows from wg.exe to wireguard windows embeddable-dll-service
This commit is contained in:
parent
d553d7f772
commit
6042317552
13 changed files with 243 additions and 3 deletions
|
@ -51,7 +51,7 @@ void WireguardProtocol::stop()
|
|||
m_wireguardStopProcess->setProgram(wireguardExecPath());
|
||||
|
||||
|
||||
QStringList arguments({"/uninstalltunnelservice", serviceName(), });
|
||||
QStringList arguments({"--remove", configPath()});
|
||||
m_wireguardStopProcess->setArguments(arguments);
|
||||
|
||||
qDebug() << arguments.join(" ");
|
||||
|
@ -123,7 +123,7 @@ void WireguardProtocol::updateRouteGateway(QString line)
|
|||
QString WireguardProtocol::wireguardExecPath() const
|
||||
{
|
||||
#ifdef Q_OS_WIN
|
||||
return Utils::executable("wireguard/wireguard", true);
|
||||
return Utils::executable("wireguard/wireguard-service", true);
|
||||
#elif defined Q_OS_LINUX
|
||||
return Utils::usrExecutable("wg");
|
||||
#else
|
||||
|
@ -172,7 +172,7 @@ ErrorCode WireguardProtocol::start()
|
|||
m_wireguardStartProcess->setProgram(wireguardExecPath());
|
||||
|
||||
|
||||
QStringList arguments({"/installtunnelservice", configPath(), });
|
||||
QStringList arguments({"--add", configPath()});
|
||||
m_wireguardStartProcess->setArguments(arguments);
|
||||
|
||||
qDebug() << arguments.join(" ");
|
||||
|
|
|
@ -82,6 +82,7 @@ signtool sign /v /sm /s My /n "Privacy Technologies OU" /fd sha256 /tr http://ti
|
|||
|
||||
echo "Copying deploy data..."
|
||||
xcopy %DEPLOY_DATA_DIR% %OUT_APP_DIR% /s /e /y /i /f
|
||||
copy "%WORK_DIR:"=%\service\wireguard-service\release\wireguard-service.exe" %OUT_APP_DIR%\wireguard\
|
||||
|
||||
del %OUT_APP_DIR%\botand.dll
|
||||
|
||||
|
|
BIN
deploy/data/windows/x32/wireguard/tunnel.dll
Normal file
BIN
deploy/data/windows/x32/wireguard/tunnel.dll
Normal file
Binary file not shown.
BIN
deploy/data/windows/x32/wireguard/wireguard.dll
Normal file
BIN
deploy/data/windows/x32/wireguard/wireguard.dll
Normal file
Binary file not shown.
BIN
deploy/data/windows/x64/wireguard/tunnel.dll
Normal file
BIN
deploy/data/windows/x64/wireguard/tunnel.dll
Normal file
Binary file not shown.
Binary file not shown.
BIN
deploy/data/windows/x64/wireguard/wireguard.dll
Normal file
BIN
deploy/data/windows/x64/wireguard/wireguard.dll
Normal file
Binary file not shown.
Binary file not shown.
|
@ -4,4 +4,7 @@
|
|||
include(common.pri)
|
||||
qtservice-uselib:SUBDIRS=buildlib
|
||||
SUBDIRS+=server
|
||||
win32 {
|
||||
SUBDIRS+=wireguard-service
|
||||
}
|
||||
}
|
||||
|
|
31
service/wireguard-service/main.cpp
Normal file
31
service/wireguard-service/main.cpp
Normal file
|
@ -0,0 +1,31 @@
|
|||
#include "wireguardtunnelservice.h"
|
||||
#include <strsafe.h>
|
||||
#include <Windows.h>
|
||||
|
||||
int wmain(int argc, wchar_t** argv)
|
||||
{
|
||||
if (argc != 3) {
|
||||
debug_log(L"Wrong argument provided");
|
||||
return 1;
|
||||
}
|
||||
TCHAR option[20];
|
||||
TCHAR configFile[5000];
|
||||
|
||||
StringCchCopy(option, 20, argv[1]);
|
||||
StringCchCopy(configFile, 5000, argv[2]);
|
||||
|
||||
WireguardTunnelService tunnel(configFile);
|
||||
|
||||
if (lstrcmpi(option, TEXT("--run")) == 0) {
|
||||
debug_log(L"start tunnel");
|
||||
tunnel.startTunnel();
|
||||
} else if (lstrcmpi(option, TEXT("--add")) == 0) {
|
||||
tunnel.addService();
|
||||
} else if (lstrcmpi(option, TEXT("--remove")) == 0) {
|
||||
tunnel.removeService();
|
||||
} else {
|
||||
debug_log(L"Wrong argument provided");
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
23
service/wireguard-service/wireguard-service.pro
Normal file
23
service/wireguard-service/wireguard-service.pro
Normal file
|
@ -0,0 +1,23 @@
|
|||
TARGET = wireguard-service
|
||||
TEMPLATE = app
|
||||
CONFIG += console
|
||||
CONFIG -= app_bundle
|
||||
CONFIG -= qt
|
||||
LIBS += \
|
||||
-luser32 \
|
||||
-lrasapi32 \
|
||||
-lshlwapi \
|
||||
-liphlpapi \
|
||||
-lws2_32 \
|
||||
-liphlpapi \
|
||||
-lgdi32 \
|
||||
-lAdvapi32 \
|
||||
-lKernel32
|
||||
|
||||
HEADERS = \
|
||||
wireguardtunnelservice.h
|
||||
|
||||
SOURCES = \
|
||||
main.cpp \
|
||||
wireguardtunnelservice.cpp
|
||||
|
160
service/wireguard-service/wireguardtunnelservice.cpp
Normal file
160
service/wireguard-service/wireguardtunnelservice.cpp
Normal file
|
@ -0,0 +1,160 @@
|
|||
#include "wireguardtunnelservice.h"
|
||||
#include <Windows.h>
|
||||
#include <thread>
|
||||
#include <chrono>
|
||||
#include <strsafe.h>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
void debug_log(const std::wstring& msg)
|
||||
{
|
||||
std::wcerr << msg << std::endl;
|
||||
}
|
||||
|
||||
WireguardTunnelService::WireguardTunnelService(const std::wstring& configFile):
|
||||
m_configFile{configFile}
|
||||
{
|
||||
}
|
||||
|
||||
void WireguardTunnelService::addService()
|
||||
{
|
||||
SC_HANDLE scm;
|
||||
SC_HANDLE service;
|
||||
scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
||||
if (NULL == scm) {
|
||||
debug_log(L"OpenSCManager failed");
|
||||
return;
|
||||
}
|
||||
WCHAR szFileName[MAX_PATH];
|
||||
|
||||
GetModuleFileNameW(NULL, szFileName, MAX_PATH);
|
||||
std::wstring runCommand = szFileName;
|
||||
runCommand += TEXT(" --run ");
|
||||
runCommand += m_configFile;
|
||||
|
||||
debug_log(runCommand);
|
||||
// check if service is already running
|
||||
service = OpenServiceW(
|
||||
scm,
|
||||
SVCNAME,
|
||||
SERVICE_ALL_ACCESS
|
||||
);
|
||||
if (NULL != service) {
|
||||
//service is already running, remove it before add new service
|
||||
debug_log(L"service is already running, remove it before add new service");
|
||||
CloseServiceHandle(service);
|
||||
removeService();
|
||||
}
|
||||
service = CreateServiceW(
|
||||
scm,
|
||||
SVCNAME,
|
||||
SVCNAME,
|
||||
SERVICE_ALL_ACCESS,
|
||||
SERVICE_WIN32_OWN_PROCESS,
|
||||
SERVICE_DEMAND_START,
|
||||
SERVICE_ERROR_NORMAL,
|
||||
runCommand.c_str(),
|
||||
NULL,
|
||||
NULL,
|
||||
TEXT("Nsi\0TcpIp"),
|
||||
NULL,
|
||||
NULL);
|
||||
if (NULL == service) {
|
||||
debug_log(L"CreateServiceW failed");
|
||||
CloseServiceHandle(scm);
|
||||
return;
|
||||
}
|
||||
SERVICE_SID_INFO info;
|
||||
info.dwServiceSidType = SERVICE_SID_TYPE_UNRESTRICTED;
|
||||
if (ChangeServiceConfig2W(service,
|
||||
SERVICE_CONFIG_SERVICE_SID_INFO,
|
||||
&info) == 0) {
|
||||
debug_log(L"ChangeServiceConfig2 failed");
|
||||
CloseServiceHandle(service);
|
||||
CloseServiceHandle(scm);
|
||||
return;
|
||||
}
|
||||
if (StartServiceW(service, 0, NULL) == 0) {
|
||||
debug_log(L"StartServiceW failed");
|
||||
CloseServiceHandle(service);
|
||||
CloseServiceHandle(scm);
|
||||
return;
|
||||
}
|
||||
if (DeleteService(service) == 0) {
|
||||
debug_log(L"DeleteService failed");
|
||||
CloseServiceHandle(service);
|
||||
CloseServiceHandle(scm);
|
||||
return;
|
||||
}
|
||||
CloseServiceHandle(service);
|
||||
CloseServiceHandle(scm);
|
||||
}
|
||||
|
||||
void WireguardTunnelService::removeService()
|
||||
{
|
||||
SC_HANDLE scm;
|
||||
SC_HANDLE service;
|
||||
scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
||||
if (NULL == scm) {
|
||||
debug_log(L"OpenSCManager failed");
|
||||
return;
|
||||
}
|
||||
service = OpenServiceW(
|
||||
scm,
|
||||
SVCNAME,
|
||||
SERVICE_ALL_ACCESS
|
||||
);
|
||||
if (NULL == service) {
|
||||
debug_log(L"OpenServiceW failed");
|
||||
CloseServiceHandle(scm);
|
||||
return;
|
||||
}
|
||||
SERVICE_STATUS stt;
|
||||
if (ControlService(service, SERVICE_CONTROL_STOP, &stt) == 0) {
|
||||
debug_log(L"ControlService failed");
|
||||
DeleteService(service);
|
||||
CloseServiceHandle(service);
|
||||
CloseServiceHandle(scm);
|
||||
return;
|
||||
}
|
||||
for (int i = 0;
|
||||
i < 180 && QueryServiceStatus(scm, &stt) && stt.dwCurrentState != SERVICE_STOPPED;
|
||||
++i) {
|
||||
std::this_thread::sleep_for(std::chrono::seconds{1});
|
||||
}
|
||||
DeleteService(service);
|
||||
CloseServiceHandle(service);
|
||||
CloseServiceHandle(scm);
|
||||
}
|
||||
|
||||
|
||||
int WireguardTunnelService::startTunnel()
|
||||
{
|
||||
debug_log(TEXT(__FUNCTION__));
|
||||
|
||||
HMODULE tunnelLib = LoadLibrary(TEXT("tunnel.dll"));
|
||||
if (!tunnelLib) {
|
||||
debug_log(L"Failed to load tunnel.dll");
|
||||
return 1;
|
||||
}
|
||||
|
||||
typedef bool WireGuardTunnelService(const LPCWSTR settings);
|
||||
|
||||
WireGuardTunnelService* tunnelProc = (WireGuardTunnelService*)GetProcAddress(
|
||||
tunnelLib, "WireGuardTunnelService");
|
||||
if (!tunnelProc) {
|
||||
debug_log(L"Failed to get WireGuardTunnelService function");
|
||||
return 1;
|
||||
}
|
||||
|
||||
debug_log(m_configFile.c_str());
|
||||
|
||||
if (!tunnelProc(m_configFile.c_str())) {
|
||||
debug_log(L"Failed to activate the tunnel service");
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
22
service/wireguard-service/wireguardtunnelservice.h
Normal file
22
service/wireguard-service/wireguardtunnelservice.h
Normal file
|
@ -0,0 +1,22 @@
|
|||
#ifndef WIREGUARDTUNNELSERVICE_H
|
||||
#define WIREGUARDTUNNELSERVICE_H
|
||||
|
||||
#include <Windows.h>
|
||||
#include <string>
|
||||
|
||||
#define SVCNAME TEXT("AmneziaVPNWireGuardService")
|
||||
|
||||
class WireguardTunnelService
|
||||
{
|
||||
public:
|
||||
WireguardTunnelService(const std::wstring& configFile);
|
||||
void addService();
|
||||
void removeService();
|
||||
int startTunnel();
|
||||
private:
|
||||
std::wstring m_configFile;
|
||||
};
|
||||
|
||||
void debug_log(const std::wstring& msg);
|
||||
|
||||
#endif // WIREGUARDTUNNELSERVICE_H
|
Loading…
Add table
Add a link
Reference in a new issue