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

时间:2013-02-21 01:43:29

标签: c++ c winapi pointers

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

3 个答案:

答案 0 :(得分:0)

地址是地址。如果你使用多级指针(一个指向指针的指针),它并不重要。

基地址是您要写入的地址。你的多级指针指向的是什么,进入那个参数。

答案 1 :(得分:0)

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

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

答案 2 :(得分: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进行后续调用。