c++ - 读取进程的进程内存不会返回所有内容

标签 c++ windows winapi memory readprocessmemory

我正在尝试扫描第 3 方应用程序的内存。我已经查到地址了;现在位于 0x0643FB78。问题是,我永远无法到达那里,因为 LPMODULEENTRY32->modBaseAddr0x00400000LPMODULEENTRY32->modBaseSize 只是 0x006FF000,因此我可以扫描该模块的最大地址是 0x00AFF000

这是否意味着我寻找的地址确实存在于另一个进程/模块/线程/某物中?我非常有信心我的流程确实包含地址。那我应该如何访问内存呢?谢谢。

最佳答案

至少在我看来,如果您涉及到 LPMODULEENTRY,那么您的起点可能是错误的。我将使用 VirtualQueryEx 遍历目标进程中的内存块。这将为您提供有关该进程中每个 block 的 MEMORY_BASIC_INFORMATION。然后,您可以使用 ReadProcessMemory 并扫描 block 以找到您要查找的内容。

这是我写的一些旧代码,它们大致做同样的事情,但寻找的是字符串而不是指针:

#include <iostream>
#include <vector>
#include <string>
#include <windows.h>
#include <algorithm>
#include <iterator>

template <class InIter1, class InIter2, class OutIter>
void find_all(unsigned char *base, InIter1 buf_start, InIter1 buf_end, InIter2 pat_start, InIter2 pat_end, OutIter res) {
    for (InIter1 pos = buf_start;
        buf_end!=(pos=std::search(pos, buf_end, pat_start, pat_end));
        ++pos)
    {
        *res++ = base+(pos-buf_start);
    }
}

template <class outIter>
void find_locs(HANDLE process, std::string const &pattern, outIter output) {

    unsigned char *p = NULL;
    MEMORY_BASIC_INFORMATION info;

    for ( p = NULL;
        VirtualQueryEx(process, p, &info, sizeof(info)) == sizeof(info);
        p += info.RegionSize ) 
    {
        std::vector<char> buffer;

        if (info.State == MEM_COMMIT && 
            (info.Type == MEM_MAPPED || info.Type == MEM_PRIVATE)) 
        {
            SIZE_T bytes_read;
            buffer.resize(info.RegionSize);
            ReadProcessMemory(process, p, &buffer[0], info.RegionSize, &bytes_read);
            buffer.resize(bytes_read);
            find_all(p, buffer.begin(), buffer.end(), pattern.begin(), pattern.end(), output);
        }
    }
}

int main(int argc, char **argv) {
    if (argc != 3) {
        fprintf(stderr, "Usage: %s <process ID> <pattern>", argv[0]);
        return 1;
    }

    int pid;
    sscanf(argv[1], "%i", &pid);

    std::string pattern(argv[2]);

    HANDLE process = OpenProcess( 
        PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, 
        false,
        pid);

    find_locs(process, pattern, 
        std::ostream_iterator<void *>(std::cout, "\n"));

    return 0;
}

关于c++ - 读取进程的进程内存不会返回所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10372872/

相关文章:

c++ - 在运行时从 RPN 构造函数可调用对象

c++ - 如何将 vector<string> 转换为 null 终止的 char **?

c++ - 为什么我的字符串数组没有在 C++ 中正确排序?

java - 当我从 Task Scheduler 的 bat 文件中运行 java 程序时,包不存在错误...但是当双击 bat 文件时它会运行

c++ - 带有 AWS EC2 的 ZeroMQ 服务器/客户端

c++ - N4140 中 [basic.link]/8 中要点的目的是什么?他们似乎没有带来任何新的东西

windows - WIC 'Copy Pixels' 调用后预乘像素

c++ - 如何使用 Win32 API 创建多个窗口

c - ListView 控件中的项和子项

c++ - 多核CPU上32bit读的原子性