在 C++ 中使用带有多级指针和偏移量的 WriteProcessMemory()?

Posted

技术标签:

【中文标题】在 C++ 中使用带有多级指针和偏移量的 WriteProcessMemory()?【英文标题】:Using WriteProcessMemory() in C++ with Multilevel Pointers and Offsets? 【发布时间】:2013-02-21 01:43:28 【问题描述】:

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

【问题讨论】:

请注意:ReadProcessMemory and WriteProcessMemory are not IPC mechanisms. 【参考方案1】:

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

基地址是您要写入的地址。你的多级指针所指向的地址,都在那个参数中。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

您不能在调用 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,具体取决于您要执行的操作。

【讨论】:

以上是关于在 C++ 中使用带有多级指针和偏移量的 WriteProcessMemory()?的主要内容,如果未能解决你的问题,请参考以下文章

在 SOX 中混合带有偏移量的音轨

指针偏移量的理解

带有索引/偏移量的Ruby gsub?

滚动到带有偏移量的 div ID

Scrollview 不会滚动过去的带有偏移量的视图

C++ (&valName)[index] 方式访问数组