【问题标题】:Read memory from application which does not allow it从不允许的应用程序中读取内存
【发布时间】:2023-03-14 19:25:01
【问题描述】:

我目前正在尝试读取阻止调用 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 上不使用此方法转储所有物理内存?我对驱动程序或它的工作原理几乎一无所知,因此几乎不可能找到另一种绕过它的方法。

【问题讨论】:

  • 转储物理内存不会这样做,因为虚拟内存。
  • 为什么你认为应该有绕过这个块的方法?它的全部意义不在于阻止您尝试做的事情吗?
  • 首先要尝试在调用 OpenProcess 之前启用调试权限,这将绕过进程 DACL。如果做不到这一点,你最好的选择可能是kernel-mode debugger
  • @Barmar 感谢您的回复-不能从页面文件访问所有虚拟内存吗?有一些工具可以做到这一点。是的,该块的全部目的是防止我正在做的事情,但我想做一些分析,但我现在不能。
  • 最好的解决方案是了解更多关于 Windows 的信息。此外,还有专门针对此类事物的网站;关于游戏以及如何分析它们。还要寻找逆向工程技术。还要寻找主板诊断板;将其中一个放入您的系统中,然后您就可以在任何地方获取内存,并且没有任何软件可以击败它。你应该去游戏网站之类的。

标签: c++ windows memory dump openprocess


【解决方案1】:

您正在尝试访问“第 0 个”内存位置,这是不可能的(所以不允许您这样做):

char *base = (char *) 0;

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

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

还要查看这篇文章中的示例 here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多