查看: 51|回复: 1

[转载图文] C 隐藏 桌面、任务栏、资源管理器

[复制链接]
发表于 2020-7-29 22:53:39 | 显示全部楼层 |阅读模式
                                              通过窗口来实现隐藏        桌面、任务栏、资源管理器
用户通过任务管理器启动或重启资源管理器依旧无法打开资源管理器,也不能看到桌面和任务栏
但是窗口会一闪而过,如果想无感隐藏,建议通过 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[0].Luid))
        {
            tkp.PrivilegeCount = 1;
            tkp.Privileges[0].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;
}
                                                                                                           
温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
论坛交流群:672619046

0

主题

194

帖子

0

精华

解密专家

Rank: 16

学币
519
荣耀
0
rank
0
违规
0

神出鬼没

    发表于 7 天前 | 显示全部楼层
    感谢分享,我会认真学习的!
    学逆向论坛-免费的逆向学习论坛
    微信公众号
    快速回复 返回顶部 返回列表