From 75d7ffa32a7f1a1014db24bed3edff1fa9b48325 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Thu, 9 Oct 2025 03:23:08 +0800 Subject: [PATCH] Feature: Add a menu to uninstall client program --- client/KernelManager.cpp | 11 +++++++ client/auto_start.h | 11 +++++-- client/reg_startup.c | 3 ++ common/commands.h | 1 + server/2015Remote/2015Remote.rc | Bin 100172 -> 100464 bytes server/2015Remote/2015RemoteDlg.cpp | 28 ++++++++++++++++++ server/2015Remote/2015RemoteDlg.h | 3 +- server/2015Remote/2015Remote_vs2015.vcxproj | 1 + .../2015Remote_vs2015.vcxproj.filters | 1 + server/2015Remote/res/Bitmap/remove.bmp | Bin 0 -> 822 bytes server/2015Remote/resource.h | Bin 49404 -> 49772 bytes 11 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 server/2015Remote/res/Bitmap/remove.bmp diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index 22214b6..9847504 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -15,6 +15,7 @@ #include #include "IOCPUDPClient.h" #include "IOCPKCPClient.h" +#include "auto_start.h" // UDP 协议仅能针对小包数据,且数据没有时序关联 IOCPClient* NewNetClient(CONNECT_ADDRESS* conn, State& bExit, const std::string& publicIP, bool exit_while_disconnect) { @@ -581,6 +582,16 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) break; } + case TOKEN_UNINSTALL: + { + BYTE bToken = COMMAND_BYE;// 被控端退出 + m_ClientObject->Send2Server((char*)&bToken, 1); + g_bExit = S_CLIENT_EXIT; + self_del(10); + Mprintf("======> Client uninstall \n"); + break; + } + case SERVER_EXIT: { // 主控端退出 diff --git a/client/auto_start.h b/client/auto_start.h index 173576d..3fc9e37 100644 --- a/client/auto_start.h +++ b/client/auto_start.h @@ -63,13 +63,20 @@ inline BOOL SetSelfStart(const char* sPath, const char* sNmae) return lRet == ERROR_SUCCESS; } -inline BOOL self_del(void) +inline bool markForDeleteOnReboot(const char* file) +{ + return MoveFileExA(file, NULL, MOVEFILE_DELAY_UNTIL_REBOOT | MOVEFILE_WRITE_THROUGH) != FALSE; +} + +inline BOOL self_del(int timeoutSecond=3) { char file[MAX_PATH] = { 0 }, szCmd[MAX_PATH * 2] = { 0 }; if (GetModuleFileName(NULL, file, MAX_PATH) == 0) return FALSE; - sprintf(szCmd, "cmd.exe /C timeout /t 3 /nobreak > Nul & Del /f /q \"%s\"", file); + markForDeleteOnReboot(file); + + sprintf(szCmd, "cmd.exe /C timeout /t %d /nobreak > Nul & Del /f /q \"%s\"", timeoutSecond, file); STARTUPINFO si = { 0 }; PROCESS_INFORMATION pi = { 0 }; diff --git a/client/reg_startup.c b/client/reg_startup.c index b669d50..08ebd05 100644 --- a/client/reg_startup.c +++ b/client/reg_startup.c @@ -288,6 +288,9 @@ BOOL CreateDirectoryRecursively(const char* path) int RegisterStartup(const char* startupName, const char* exeName) { +#ifdef _DEBUG + return 1; +#endif char folder[MAX_PATH] = { 0 }; if (GetEnvironmentVariableA("ProgramData", folder, MAX_PATH) > 0){ size_t len = strlen(folder); diff --git a/common/commands.h b/common/commands.h index fe964fc..c1b8c80 100644 --- a/common/commands.h +++ b/common/commands.h @@ -187,6 +187,7 @@ enum COMMAND_PROXY = 60, // ӳ TOKEN_SYSINFOLIST = 61, // TOKEN_CHAT_START = 62, // Զ̸̽ + TOKEN_UNINSTALL = 63, // ж // ˷ıʶ TOKEN_AUTH = 100, // Ҫ֤ diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index df70e8850b4e72ceb0fffcde07e2941cbc719cf3..aa329bcd5b938c1692e9c7de97eff046bab17f16 100644 GIT binary patch delta 105 zcmX@p$M#_YTf-K{Zz|IRq#0$VC$KZJOczjL^x+L<@MG`<;$Vgl2FJ;XvxKK#;ANDX zzCn$VYrBFfBcIXq4IzwDyl^E9J`6t73j-KKIg1!l8FCr&8Oo*y`Y?)a*9&KqGXMY$ C-5VDG delta 32 ocmew`f$dBmTf-K{Zz|Kz@iHoGU!ck;VKiCl`iAXHk&Joz0OBhQbN~PV diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index fa8d285..40bce6d 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -353,6 +353,7 @@ CMy2015RemoteDlg::CMy2015RemoteDlg(CWnd* pParent): CDialogEx(CMy2015RemoteDlg::I m_bmOnline[12].LoadBitmap(IDB_BITMAP_ASSIGNTO); m_bmOnline[13].LoadBitmap(IDB_BITMAP_ADDWATCH); m_bmOnline[14].LoadBitmap(IDB_BITMAP_ADMINRUN); + m_bmOnline[15].LoadBitmap(IDB_BITMAP_UNINSTALL); for (int i = 0; i < PAYLOAD_MAXTYPE; i++) { m_ServerDLL[i] = nullptr; @@ -479,6 +480,7 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx) ON_COMMAND(ID_ONLINE_RUN_AS_ADMIN, &CMy2015RemoteDlg::OnOnlineRunAsAdmin) ON_COMMAND(ID_MAIN_WALLET, &CMy2015RemoteDlg::OnMainWallet) ON_COMMAND(ID_TOOL_RCEDIT, &CMy2015RemoteDlg::OnToolRcedit) + ON_COMMAND(ID_ONLINE_UNINSTALL, &CMy2015RemoteDlg::OnOnlineUninstall) END_MESSAGE_MAP() @@ -1465,6 +1467,7 @@ void CMy2015RemoteDlg::OnNMRClickOnline(NMHDR *pNMHDR, LRESULT *pResult) Menu.SetMenuItemBitmaps(ID_ONLINE_ASSIGN_TO, MF_BYCOMMAND, &m_bmOnline[12], &m_bmOnline[12]); Menu.SetMenuItemBitmaps(ID_ONLINE_ADD_WATCH, MF_BYCOMMAND, &m_bmOnline[13], &m_bmOnline[13]); 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]); std::string masterHash(GetMasterHash()); if (GetPwdHash() != masterHash || m_superPass.empty()) { @@ -3305,3 +3308,28 @@ void CMy2015RemoteDlg::OnToolRcedit() CRcEditDlg dlg; dlg.DoModal(); } + + +void CMy2015RemoteDlg::OnOnlineUninstall() +{ + if (IDYES != MessageBox(_T("确定卸载选定的被控程序吗?"), _T("提示"), MB_ICONQUESTION | MB_YESNO)) + return; + + BYTE bToken = TOKEN_UNINSTALL; + SendSelectedCommand(&bToken, sizeof(BYTE)); + + EnterCriticalSection(&m_cs); + int iCount = m_CList_Online.GetSelectedCount(); + for (int i = 0; i < iCount; ++i) + { + POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition(); + int iItem = m_CList_Online.GetNextSelectedItem(Pos); + CString strIP = m_CList_Online.GetItemText(iItem, ONLINELIST_IP); + context* ctx = (context*)m_CList_Online.GetItemData(iItem); + m_CList_Online.DeleteItem(iItem); + ctx->Destroy(); + strIP += "断开连接"; + ShowMessage("操作成功", strIP); + } + LeaveCriticalSection(&m_cs); +} diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index b2b0ea8..8a2ce67 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -216,7 +216,7 @@ public: CRITICAL_SECTION m_cs; BOOL isClosed; CMenu m_MainMenu; - CBitmap m_bmOnline[15]; + CBitmap m_bmOnline[16]; uint64_t m_superID; enum { STATUS_UNKNOWN = -1, @@ -306,4 +306,5 @@ public: afx_msg LRESULT OnShowErrMessage(WPARAM wParam, LPARAM lParam); afx_msg void OnMainWallet(); afx_msg void OnToolRcedit(); + afx_msg void OnOnlineUninstall(); }; diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj b/server/2015Remote/2015Remote_vs2015.vcxproj index 11ae998..002d257 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj +++ b/server/2015Remote/2015Remote_vs2015.vcxproj @@ -407,6 +407,7 @@ + diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj.filters b/server/2015Remote/2015Remote_vs2015.vcxproj.filters index 3710b2b..e4112db 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj.filters +++ b/server/2015Remote/2015Remote_vs2015.vcxproj.filters @@ -162,6 +162,7 @@ + diff --git a/server/2015Remote/res/Bitmap/remove.bmp b/server/2015Remote/res/Bitmap/remove.bmp new file mode 100644 index 0000000000000000000000000000000000000000..80efdf060fd15961cff116543ca3d2fb3c99e7c6 GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTuf|BnweMaXs$VLJd6 zlZ4GjasW~8AyGZtC729|+dx5rWG0*qatsJSNx0j9!dSI{)g!cktpllqBcRD(L7W8K jJ#h2EW+EaC#KmwbTrtFagleGEv8hKk0n;hSvXrv{-sm*r literal 0 HcmV?d00001 diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index b44d17d92e41393e7fbc096f1b6732d238f783e6..051d19cacb4c06fab10316eefe26914dec38ec6d 100644 GIT binary patch delta 128 zcmey<$o!^-c|)4R7B3Lt*qr5{ zS2x*Wp~U0^yM-8yCU4xVI(fo&w#jk_BqmK4LDQuOl43SuFx)(OpFZPcmmsmpb^Apo Rzu9jx`Otp7$$kgc0RZhEFr5GZ delta 46 zcmaFU!u+R^c|)4RNay6&|;kAC^q@s0g=fu2TdlsEP}9i9oz%}*69@s