c++ - 我可以使用 ReadProcessMemory 在 Windows 中读取进程的程序内存吗?

标签 c++ windows multithreading process

我有这个线程在我的程序进程中运行。该线程应该读取此进程的程序内存以检测是否发生了任何禁止的代码注入(inject)。现在我如何访问进程的程序内存?我可以使用

ReadProcessMemory();

函数,如果我得到带有 ALL_ACCESS 标志的进程句柄来读取程序内存?
还有一种方法可以搜索此程序内存,以便我可以将此内存扫描限制为少数特定的感兴趣方法或检测特定方法的基地址和长度?

最佳答案

是的,如果您获得具有 READ 权限的进程句柄(包含在 PROCESS_ALL_ACCESS 中),您可以使用 ReadProcessMemory() 来读取目标进程的内存。

您要做的就是所谓的模式扫描。首先,您将使用 VirtualQueryEx() 来查找具有 MEM_COMMIT 作为状态并且没有 PAGE_NOACCESS 或 PAGE_GUARD 作为保护类型的内存区域。

您可以使用模式扫描功能遍历这些内存区域,以查找您想要列入黑名单的特定签名。

这是循环内存的基本思想

int main()
{
    DWORD procid = GetProcId("whatever.exe");

    MEMORY_BASIC_INFORMATION meminfo;
    unsigned char* addr = 0;

    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid);

    MEMORY_BASIC_INFORMATION mbi;

    while (VirtualQueryEx(hProc, addr, &mbi, sizeof(mbi)))
    {
        if (mbi.State == MEM_COMMIT && mbi.Protect != PAGE_NOACCESS)
        {
            std::cout << "base : 0x" << std::hex << mbi.BaseAddress << " end : 0x" << std::hex << (uintptr_t)mbi.BaseAddress + mbi.RegionSize << "\n";
        }
        addr += mbi.RegionSize;
    }

    CloseHandle(hProc);
}

您可以从这里找到许多不同的图案扫描功能来完成这项工作。

关于c++ - 我可以使用 ReadProcessMemory 在 Windows 中读取进程的程序内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28882723/

相关文章:

c++ - 将变量传递给函数

c++ - 使用 std::unique_ptr<T>& 而不是 std::unique_ptr<T> 有什么优势吗?

c++ - 如何在没有安装 Qt 本身的情况下运行 Qt 程序?

java - Java中如何获取被用户环境变量覆盖的系统环境变量?

mysql - Windows 8.1 XAMPP MySQL 服务检测到路径错误

c++ - Stroustrup 的 PPP 书中的多边形问题

c++ - 任何指标都可以衡量图像的渐晕效果?

c# - 为什么异常中断应用程序池?

java - 线程意外工作

ios - 在 UITableView Segues 之前运行后台线程