【问题标题】:C++ How to take value from EXE + Pointer + Offset + Offset?C ++如何从EXE + Pointer + Offset + Offset中获取价值?
【发布时间】:2021-12-18 08:20:25
【问题描述】:

我正在学习使用 C++ 修改游戏值,但现在我卡住了。

我知道如何编辑例如播放器速度的 FLOAT 值:

uintptr_t _EntitiesBase = (uintptr_t)GetModuleHandle(L"EntitiesMP.dll");
uintptr_t EntityBase = _EntitiesBase + 0x3153D0;
DWORD Run = 0xDE4;
*(FLOAT*)(*(DWORD*)EntityBase + Run) = Value;

但我不知道如何编辑偏移量很大的值(Engine.dll + 0xD52AB0 + 0x48 + 0x228),因为最终它返回错误的值,而不是我想更改

例如,在 Cheat Engine 中,相同的内容如下所示:

我添加了 Engine.dll + 0xD52AB0 作为指针,然后添加偏移量 0x48 和偏移量 0x220,它给了我地址 2DC7E488,其中包含我需要更改的 FLOAT 值

你有什么想法吗?

【问题讨论】:

  • 我怀疑您要编辑的值的内存位置在程序运行之间是否一致。在过去,这是因为游戏使用 C/C++ 全局来存储游戏或玩家状态,这将在运行时具有可预测且一致的内存位置,但现代游戏和引擎具有更好的内部工程(双关语不是故意的)和所以不会那样。如果它是 Java/JVM 或 .NET 游戏,那么偏移量将在程序运行时发生变化,因为 GC 会在内存中移动对象(以减少堆碎片)。
  • 根据您显示的屏幕截图,看起来 baseAddr + 0xD52AB0 指的是一个包含偏移量 0x48 的指针的结构。因此,您需要从该地址 (baseAddr + 0xD52AB0 + 0x48) 中提取一个 指针值,然后将其取消引用以获取下一个地址。然后它指向内存中其他位置的另一个结构,并且您要修改的数据位于该指针的偏移量 0x220 处。
  • 简而言之:*(float*)(*(uintptr_t*)(_EntitiesBase + 0xD52AB0 + 0x48) + 0x220) = Value;
  • 我试过了,不行,不行=(

标签: c++ pointers cheat-engine


【解决方案1】:

您可以使用ReadProcessMemory 读取进程内存,使用WriteProcessMemory 写入进程内存。为此,您只需对每个偏移量使用ReadProcessMemory,然后使用WriteProcessMemory 写入指针值:-

uintptr_t entitybase;
uintptr_t value1;
float newValue = 100000;
ReadProcessMemory(ProcessHandle, (uintptr_t)EngineDllHandle + 0xD52AB0, &entitybase, sizeof(entitybase), 0);
ReadProcessMemory(ProcessHandle, entitybase + 0x48, &value1, sizeof(value1), 0);
WriteProcessMemory(ProcessHandle, value1 + 0x220, &newValue, sizeof(entitybase), 0);

【讨论】:

    猜你喜欢
    • 2013-04-12
    • 1970-01-01
    • 2012-09-03
    • 2017-06-02
    • 2017-04-23
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多