c++ - 读取系统内存的权限不足
问题描述
我正在使用代码扫描程序内存,我使用代码扫描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;
}
解决方案
重要的系统进程受到保护,您应该做的第一件事是使用 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;
}
如果这不起作用,您可以尝试从具有更高权限的进程中劫持/复制句柄/令牌。您可以通过查看此源代码了解如何从用户模式枚举进程句柄并劫持它们
由于受保护的进程,您也可能无法完全访问所有进程。
受保护的进程资源:
- https://www.crowdstrike.com/blog/evolution-protected-processes-part-1-pass-hash-mitigations-windows-81/
- https://www.crowdstrike.com/blog/evolution-protected-processes-part-2-exploitjailbreak-mitigations-unkillable-processes-and/
- https://www.crowdstrike.com/blog/protected-processes-part-3-windows-pki-internals-signing-levels-scenarios-signers-root-keys/
- https://github.com/Mattiwatti/PPLKiller
- https://docs.microsoft.com/en-us/windows/win32/procthread/process-security-and-access-rights+
- https://googleprojectzero.blogspot.com/2018/10/injecting-code-into-windows-protected.html
- https://googleprojectzero.blogspot.com/2018/11/injecting-code-into-windows-protected.html
推荐阅读
- reactjs - 在 ReactJS 中使用 Firebase 对数据进行排序
- python - 按两个标准对列进行排序
- python - 根据班级更改车身颜色
- sql - SQL Server:如何将字符串“ddMMM”替换或转换为日期“MMMdd”?
- python - Python - 将编码字符串的转义字符转换为 %
- jsf - 如何使用 Java EE Security @CustomFormAuthenticationMechanismDefinition 重定向到原始请求 URL
- java - 如何延迟 CallNextHookEx 或 PostMessage 的返回以模拟延迟的鼠标事件?
- java - 限制子项大小(VBox)[宽度]
- kotlin - 如何使用 Mockk 在测试类中模拟依赖项而不将其作为参数传递?
- xamarin - 如何在 xamarin 表单中显示带有可滚动而不是更多(3 个点)的选项卡式图标