我可以使用ReadProcessMemory来读取Windows中进程的程序内存吗?

时间:2015-03-05 16:25:20

标签: c++ windows multithreading process

我在程序的进程中运行了这个线程。线程应该读取这个过程'如果发生任何禁止代码注入,则程序存储器检测。现在我如何访问进程的程序存储器?

可以使用吗?
ReadProcessMemory();

函数,如果我使用ALL_ACCESS标志获取进程句柄,则读取程序存储器?  还有一种方法可以搜索这个程序存储器,以便我可以将这种内存扫描限制为几种特定的感兴趣方法,或者检测特定方法的基址和长度吗?

1 个答案:

答案 0 :(得分:1)

是的,如果您获得具有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);
}

您可以从此处找到许多不同的图案扫描功能来完成作业。