【发布时间】: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