roger 发表于 2020-7-29 22:53:39

C 隐藏 桌面、任务栏、资源管理器

                                            通过窗口来实现隐藏      桌面、任务栏、资源管理器
用户通过任务管理器启动或重启资源管理器依旧无法打开资源管理器,也不能看到桌面和任务栏
但是窗口会一闪而过,如果想无感隐藏,建议通过 hook explorer.exe 来实现
  直接可编译代码,自取
#include <tchar.h>
#include <windows.h>
#include <TlHelp32.h>
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )   /* 设置入口地址 */

#define FLAG_FILE L"C:\\FlagFile.txt"               /* 定义标志文件路径 */

HANDLE GetProcessHandle(LPCWSTR lpName);            /* 获取进程句柄 根据进程名 */
void RaiseToDebug();                              /* 提权 */
BOOL FileIsExist(PCWSTR Path);                      /* 判断文件是否存在 */

int main() {
   
    /*MessageBoxA(0, 0, 0, 0);*/

    RaiseToDebug();
    DWORD dwRet = 0;
    HANDLE hExplorer;

proc_startup:
    /* 监控进程启动 */
    while (TRUE) {
      hExplorer = GetProcessHandle(L"explorer.exe");
      if (INVALID_HANDLE_VALUE != hExplorer) {
            break;
      }
      Sleep(20);
    }

check_flag:
    /* 检测标志文件是否存在 */
    if (FALSE == FileIsExist(FLAG_FILE)) {
      ShowWindow(FindWindow(_T("Shell_TrayWnd"), NULL), SW_HIDE); /* 隐藏任务栏 */
      ShowWindow(FindWindow(_T("ProgMan"), NULL), SW_HIDE);       /* 隐藏桌面 */
      ShowWindow(FindWindow(_T("CabinetWClass"), NULL), SW_HIDE); /* 隐藏资源管理器 */
    }
    else {
      ShowWindow(FindWindow(_T("Shell_TrayWnd"), NULL), SW_SHOW); /* 显示任务栏 */
      ShowWindow(FindWindow(_T("ProgMan"), NULL), SW_SHOW);       /* 显示桌面 */
      ShowWindow(FindWindow(_T("CabinetWClass"), NULL), SW_SHOW); /* 显示资源管理器 */
    }

    DWORD dwExitCode;
    dwExitCode = WaitForSingleObject(hExplorer, 50);

    if (WAIT_TIMEOUT == dwExitCode) {
      goto check_flag;
    }
    if (WAIT_OBJECT_0 == dwExitCode) {
      goto proc_startup;
    }   
    if (WAIT_FAILED == dwExitCode) {
      return GetLastError();
    }
    return 0;
}

//提权
void RaiseToDebug()
{
    HANDLE hToken;
    HANDLE hProcess = GetCurrentProcess();// 获取当前进程句柄

    // 打开当前进程的Token,就是一个权限令牌,第二个参数可以用TOKEN_ALL_ACCESS
    if (OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    {
      TOKEN_PRIVILEGES tkp;
      if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges.Luid))
      {
            tkp.PrivilegeCount = 1;
            tkp.Privileges.Attributes = SE_PRIVILEGE_ENABLED;

            //通知系统修改进程权限
            BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0);
      }
      CloseHandle(hToken);
    }
}

/* 判断文件是否存在 */
BOOL FileIsExist(PCWSTR Path) {
    WIN32_FIND_DATA wfd;
    BOOL bRet = FALSE;
    HANDLE hFind = FindFirstFile(Path, &wfd);
    if (hFind != INVALID_HANDLE_VALUE) {
      bRet = TRUE;
      FindClose(hFind);
    }   
    return bRet;
}

/* 获取进程句柄 根据进程名 */
HANDLE GetProcessHandle(LPCWSTR lpName)
{
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (INVALID_HANDLE_VALUE == hSnapshot) {
      return INVALID_HANDLE_VALUE;
    }

    PROCESSENTRY32 pe = { sizeof(pe) };
    BOOL fOk;
    for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe))
    {
      if (_tcscmp(lpName, CharLower(pe.szExeFile)) == 0) {
            CloseHandle(hSnapshot);
            return OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
      }
    }
    return INVALID_HANDLE_VALUE;
}
                                                                                                            

monkeyman 发表于 2020-8-1 12:25:45

感谢分享,我会认真学习的!
页: [1]
查看完整版本: C 隐藏 桌面、任务栏、资源管理器