0

其中一个参数WriteProcessMemory()显然要求指向基地址的指针。但是如果它是一个多级指针呢?例如,假设我必须找到一个指针 3 次才能最终获得静态地址,第一个偏移量是 0,第二个是 57,第三个是 268。现在如果我想写入那个确切的位置,我该怎么做将偏移量包括在WriteProcessMemory()函数,我必须包括所有三个偏移量还是只包括最后一个导致我进入静态地址的偏移量?为了澄清事情,我基本上是在 PC 上的第一人称射击游戏中练习操纵记忆。我的目标并不是真正地进行黑客攻击或其他任何事情。我只是想练习将内存写入进程。(例如,我会尝试将新值写入“健康”地址或“弹药”地址。)我主要想知道如何计算多级指针中的偏移量。

4

3 回答 3

0

地址就是地址。使用多级指针(指向指针的指针)并不重要。

基地址是您要写入的地址。您的多级指针所指向的地址都包含在该参数中。

于 2013-02-21T01:50:15.967 回答
0

WriteProcessMemory 将绝对数据放入内存。如果您想将多级结构写入内存,例如在元素中有指针,那么您需要根据远程lpBaseAddress和正在写入的数据量写入指针值,并且您需要写入的数据是被放置在记忆中。

如果您正在写入的结构中有指针,那么除非您将它们重写为您正在写入的目标数据的一部分,否则它们将不起作用。

于 2013-02-21T01:53:21.537 回答
0

您不能在对 WriteProcessMemory() 的调用中“包含”偏移量来遍历指针链。多级指针或指针链是指向指向指针的指针。在大多数情况下,必须在每个指针被取消引用后添加相对偏移量。

WriteProcessMemory 只写入一个地址,它的目的是单一的。

但是您必须取消引用每个指针并添加偏移量。为此,您必须使用 ReadProcessMemory。您可以使用此函数遍历指针链,它将取消引用每个指针并正确添加偏移量:

uintptr_t FindDMAAddy(HANDLE hProc, uintptr_t ptr, std::vector<unsigned int> offsets)
{
    for (unsigned int i = 0; i < offsets.size(); ++i)
    {
        ReadProcessMemory(hProc, (BYTE*)ptr, &ptr, sizeof(ptr), 0);
        ptr += offsets[i];
    }
    return ptr;
}

调用该函数的示例如下所示:

uintptr_t ammoAddr = FindDMAAddy(hProcess, dynamicPtrBaseAddr, { 0x374, 0x14, 0x0 });

此函数的结果将是您要读取或写入的变量的地址。剩下要做的就是随后调用 ReadProcessMemory 或 WriteProcessMemory,具体取决于您要执行的操作。

于 2019-05-26T05:44:14.463 回答