Improve: AuthKernel use the machine id as client identify id
This commit is contained in:
@@ -599,7 +599,7 @@ DWORD WINAPI StartClient(LPVOID lParam)
|
|||||||
SAFE_DELETE(Manager);
|
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) :
|
Manager = isAuthKernel ? new AuthKernelManager(&settings, ClientObject, app.g_hInstance, kb, bExit) :
|
||||||
new CKernelManager(&settings, ClientObject, app.g_hInstance, kb, bExit);
|
new CKernelManager(&settings, ClientObject, app.g_hInstance, kb, bExit);
|
||||||
Manager->SetClientApp(&app);
|
Manager->SetClientApp(&app);
|
||||||
|
|||||||
@@ -247,7 +247,7 @@ uint64_t CalcalateID(const std::vector<std::string>& clientInfo)
|
|||||||
// HKLM\Software\Microsoft\Cryptography\MachineGuid 是 Windows 安装时生成的随机 GUID,
|
// HKLM\Software\Microsoft\Cryptography\MachineGuid 是 Windows 安装时生成的随机 GUID,
|
||||||
// 重装系统才会变;局域网每台机器都不同(即便同镜像,sysprep 也会重置)。
|
// 重装系统才会变;局域网每台机器都不同(即便同镜像,sysprep 也会重置)。
|
||||||
// 这是比 pubIP/PCName/CPU 都更稳定且更具区分度的硬件标识。
|
// 这是比 pubIP/PCName/CPU 都更稳定且更具区分度的硬件标识。
|
||||||
static std::string GetMachineGuidWindows()
|
std::string GetMachineGuidWindows()
|
||||||
{
|
{
|
||||||
HKEY hKey = NULL;
|
HKEY hKey = NULL;
|
||||||
// KEY_WOW64_64KEY: 32 位进程也访问 64 位注册表视图,避免 WOW6432Node 重定向。
|
// KEY_WOW64_64KEY: 32 位进程也访问 64 位注册表视图,避免 WOW6432Node 重定向。
|
||||||
@@ -283,9 +283,9 @@ static std::string NormalizeExePathLower(const char* path)
|
|||||||
// - 同机同程序:永远同 ID(不依赖 IP/PCName/OS/CPU)。
|
// - 同机同程序:永远同 ID(不依赖 IP/PCName/OS/CPU)。
|
||||||
// - 局域网多机相同镜像:MachineGuid 必不同 → ID 必不同。
|
// - 局域网多机相同镜像:MachineGuid 必不同 → ID 必不同。
|
||||||
// - 一台机两份程序在不同目录 → 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);
|
return XXH64(s.c_str(), s.length(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -313,7 +313,7 @@ BOOL IsAuthKernel(std::string &str) {
|
|||||||
return isAuthKernel;
|
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;
|
std::string str = expiredDate;
|
||||||
iniFile cfg(CLIENT_PATH);
|
iniFile cfg(CLIENT_PATH);
|
||||||
@@ -394,19 +394,27 @@ LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, CONNECT_ADDRESS& conn, const std::string
|
|||||||
LoginInfor.AddReserved(IsRunningAsAdmin());
|
LoginInfor.AddReserved(IsRunningAsAdmin());
|
||||||
char cpuInfo[32];
|
char cpuInfo[32];
|
||||||
sprintf(cpuInfo, "%dMHz", dwCPUMHz);
|
sprintf(cpuInfo, "%dMHz", dwCPUMHz);
|
||||||
|
std::string clientID = cfg.GetStr("settings", "client_id");
|
||||||
|
if (clientID.empty()) {
|
||||||
// V2 ID 算法:MachineGuid + 归一化路径
|
// V2 ID 算法:MachineGuid + 归一化路径
|
||||||
// - 同机同程序路径永远同 ID(不依赖 IP/PCName/OS/CPU 漂移)
|
// - 同机同程序路径永远同 ID(不依赖 IP/PCName/OS/CPU 漂移)
|
||||||
// - 局域网多机即便同镜像(sysprep 会让 MachineGuid 各不同)也不撞库
|
// - 局域网多机即便同镜像(sysprep 会让 MachineGuid 各不同)也不撞库
|
||||||
// MachineGuid 读取失败的极端情况退化到老算法,保兼容。
|
// MachineGuid 读取失败的极端情况退化到老算法,保兼容。
|
||||||
std::string machineGuid = GetMachineGuidWindows();
|
std::string machineGuid = GetMachineGuidWindows();
|
||||||
if (!machineGuid.empty()) {
|
if (!machineGuid.empty()) {
|
||||||
conn.clientID = CalcalateIDv2(machineGuid, NormalizeExePathLower(buf));
|
conn.clientID = CalcalateIDv2(machineGuid, NormalizeExePathLower(buf), isAuth);
|
||||||
} else {
|
} else {
|
||||||
Mprintf("WARN: MachineGuid 读取失败,回退到老 ID 算法\n");
|
Mprintf("WARN: MachineGuid 读取失败,回退到老 ID 算法\n");
|
||||||
conn.clientID = CalcalateID({ pubIP, szPCName, LoginInfor.OsVerInfoEx, cpuInfo, buf });
|
conn.clientID = CalcalateID({ pubIP, szPCName, LoginInfor.OsVerInfoEx, cpuInfo, buf });
|
||||||
}
|
}
|
||||||
auto clientID = std::to_string(conn.clientID);
|
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());
|
Mprintf("此客户端的唯一标识为: %s\n", clientID.c_str());
|
||||||
|
}
|
||||||
char reservedInfo[64];
|
char reservedInfo[64];
|
||||||
int m_iScreenX = GetSystemMetrics(SM_CXVIRTUALSCREEN);
|
int m_iScreenX = GetSystemMetrics(SM_CXVIRTUALSCREEN);
|
||||||
int m_iScreenY = GetSystemMetrics(SM_CYVIRTUALSCREEN);
|
int m_iScreenY = GetSystemMetrics(SM_CYVIRTUALSCREEN);
|
||||||
|
|||||||
@@ -5,7 +5,9 @@
|
|||||||
|
|
||||||
#pragma comment(lib,"Vfw32.lib")
|
#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);
|
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();
|
DWORD CPUClockMHz();
|
||||||
BOOL WebCamIsExist();
|
BOOL WebCamIsExist();
|
||||||
|
|||||||
Reference in New Issue
Block a user