首页 > 解决方案 > 读取系统内存的权限不足

问题描述

我正在使用代码扫描程序内存,我使用代码扫描notepad.exe,程序可以毫无问题地扫描,但是当我想扫描某些系统进程(例如:dwm.exe,注册表)时,我权限不够,程序无法扫描,怎么办?我已经尝试以管理员身份运行。

char* scanMemory(DWORD dwmPID)
{

    HANDLE process = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, FALSE, dwmPID);
    if (process)
    {
        SYSTEM_INFO si;
        GetSystemInfo(&si);
        MEMORY_BASIC_INFORMATION info;
        std::vector<char> chunk;
        char* p = 0;

        while (p < si.lpMaximumApplicationAddress)
        {
            if (VirtualQueryEx(process, p, &info, sizeof(info)) == sizeof(info))
            {
                p = (char*)info.BaseAddress;
                chunk.resize(info.RegionSize);
                SIZE_T bytesRead;
                if (ReadProcessMemory(process, p, &chunk[0], info.RegionSize, &bytesRead))
                {
                    for (size_t i = 0; i < (bytesRead - 4); ++i)
                    {

                        if (memcmp(".exe", &chunk[i], 4) == 0)
                        {
                            cout << "Found";
                            system("PAUSE");
                        }

                    }
                }
                p += info.RegionSize;
            }
        }
    }
    return 0;
}

标签: c++winapimemory

解决方案


重要的系统进程受到保护,您应该做的第一件事是使用 SeDebugPrivelage 提升权限:

bool SetDebugPrivilege()
{
    HANDLE hToken{ nullptr };
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
        return false;

    TOKEN_PRIVILEGES TokenPrivileges{};
    TokenPrivileges.PrivilegeCount = 1;
    TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    if (!LookupPrivilegeValueA(nullptr, "SeDebugPrivilege", &TokenPrivileges.Privileges[0].Luid))
    {
        CloseHandle(hToken);
        return false;
    }

    if (AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), nullptr, nullptr) != ERROR_SUCCESS)
    {
        CloseHandle(hToken);
        return false;
    }

    CloseHandle(hToken);
    return true;
}

如果这不起作用,您可以尝试从具有更高权限的进程中劫持/复制句柄/令牌。您可以通过查看此源代码了解如何从用户模式枚举进程句柄并劫持它们

由于受保护的进程,您也可能无法完全访问所有进程。

受保护的进程资源:


推荐阅读