从应用程序中读取不允许它的内存

时间:2017-04-18 20:39:01

标签: c++ windows memory dump openprocess

我目前正在尝试阅读阻止拨打OpenProcessReadProcessMemory的游戏的全部内存(我相信这是通过Windows驱动程序/服务完成的,尽管我不是确定如何)。

我使用以下代码尝试打开进程并将其内存读取到文件中:

HANDLE process = OpenProcess(PROCESS_VM_READ, 0, pid);
if (!process) {
    cout << "Failed to open process.";
    return 1;
}
cout << "Successfully opened processs." << endl << "Dumping memory to mem.dmp..." << endl;

ofstream fout;
fout.open("mem.dmp");

char *base = (char *)0;
char *readCount = (char *)0;
do {
    char buffer[PAGE_SIZE];

    if (ReadProcessMemory(process, base, buffer, PAGE_SIZE, NULL) != 0)
    {
        fout << buffer;
    }

    base += PAGE_SIZE;
    readCount++;
} while (base != 0);
if (readCount == 0) {
    cout << "Warning: No memory was read from the process." << endl;
}
fout.flush();
fout.close();

然而,在运行时,这甚至无法打开过程。

通过驱动程序阻止进程打开内存读取的唯一方法是将整个物理内存转储到文件中。我不知道如何做到这一点,除了必须设置窗口以将所有物理内存转储到蓝屏上,然后强制我的计算机关闭蓝屏。这显然非常不方便,因为我想要经常分析应用程序的内存。

有没有办法在Windows上不使用此方法转储所有物理内存?我几乎不了解驱动程序或它是如何工作的,所以几乎不可能找到绕过它的另一种方法。

1 个答案:

答案 0 :(得分:0)

您正在尝试访问&#34; 0th&#34;记忆位置,这是不可能的(所以不允许你这样做):

static

您应该正确设置您想要阅读的地址,并且该地址必须是可读地址。检查ReadProcessMemory doc here

  

lpBaseAddress [in] :指向指定基址的指针   从中阅读的过程。在任何数据传输发生之前,   系统验证基地址和内存中的所有数据   指定的大小可供读取访问,如果不可访问   可访问的功能失败。

同时查看本文中的示例 here