【问题标题】:ReadProcessMemory only works with breakpointReadProcessMemory 仅适用于断点
【发布时间】:2023-04-11 07:45:01
【问题描述】:

我开始创建一个进程,如果失败则记录,然后是一个 while 循环以等待找到窗口。

PROCESS_INFORMATION p;
STARTUPINFO s;
ZeroMemory(&s, sizeof(s));
s.cb = sizeof(s);
ZeroMemory(&p, sizeof(p));
if (!CreateProcessA("D:\\SteamLibrary\\steamapps\\common\\Fallout 4\\Wolf4SDL.exe", "", NULL, NULL, FALSE, 0, NULL, NULL, &s, &p))
{
    _MESSAGE("CreateProcess failed (%d).", GetLastError());
}
//wait for the process to start
while (FindWindowA(NULL, "Wolfenstein 3D") == NULL);

然后为两个进程设置 vars - x64,即 64 位地址。 “addr”是一个指针。 addrOff 是静态偏移量。

HANDLE procHandle = p.hProcess;
unsigned long long addr;
unsigned long long addrOff = 0x00000001401a7718;
SIZE_T NumberOfBytesToRead = sizeof(addr); 
SIZE_T NumberOfBytesActuallyRead;

现在是读取,以及一些基本的调试消息

ReadProcessMemory(procHandle, (LPCVOID)(addrOff), &addr, NumberOfBytesToRead, &NumberOfBytesActuallyRead);
_MESSAGE("addr: %p",addr);
_MESSAGE("numBytesRead: %d", NumberOfBytesActuallyRead);

这就是问题所在 - 如果我在其中放置断点,addr 将具有正在读取的静态偏移量的适当值。如果我不这样做,addr 的值将是 0x0000000000000000。在这两种情况下,NumberOfBytesActuallyRead 将具有适当的值 8。其中,即使不查看我的日志,该过程也存在并说明了 - 但查看我的日志可以确认这一点。

不用说,这使得调试这个问题几乎是不可能的。现在,我想到了一个奇怪的地方——我注意到人们将偏移量添加到基地址的示例中,而我只是使用偏移量。因此,由于我的addrOff 值可能包含基地址,因此我在两种情况下都检查了基地址——它们都是相同的。并且为了完整起见,基地址代码。

unsigned long long dwBase = -1;

EnumProcessModules(procHandle, hModules, 0, &cModules);
hModules = new HMODULE[cModules / sizeof(HMODULE)];

if (EnumProcessModules(procHandle, hModules, cModules / sizeof(HMODULE), &cModules)) {
    for (size_t i = 0; i < cModules / sizeof(HMODULE); i++) {
        if (GetModuleBaseName(procHandle, hModules[i], szBuf, sizeof(szBuf))) {
            if (std::string("Wolf4SDL.exe").compare(szBuf) == 0) {
                dwBase = (unsigned long long)hModules[i];
                break;
            }
        }
    }
}

【问题讨论】:

  • 可能是因为使用断点时造成的额外时间延迟?如果 ReadProcessMemory 运行但地址还没有存储在内存中怎么办?
  • @user253751 我真的应该考虑到这一点 - 我假设如果窗口在那里,那么其他一切都是静态的。但是,果然,将 addr 初始化为 0,并将 ReadProcessMemory 包含在一个 while 循环中,虽然它仍然等于 0,但似乎已经成功了。如果您将其作为答案,我会将其标记为解决方案。

标签: c++ readprocessmemory


【解决方案1】:

这很简单。

你读的变量读的时候还是0。

当您使用断点时,您查看代码并按继续的时间延迟是其他进程设置变量的时间。

【讨论】:

    猜你喜欢
    • 2014-09-16
    • 2017-07-17
    • 1970-01-01
    • 2014-10-03
    • 2013-12-09
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多