指针的内存地址

时间:2016-12-28 11:36:54

标签: c# memory ram memory-address

昨天我开始搞乱c#和VAMemory.ddl。我的目标是制作一个程序,从一个游戏“英雄联盟”中读取玩家的HP。 我找到了HP的静态地址并阅读了它:

vam.ReadFloat((IntPtr)address);

它工作得很好,我可以从我的程序中看到我的游戏内HP,但由于它是一个静态地址,每次重新启动游戏时它都会改变,我每次都必须找到该地址。 所以我开始寻找指针。我跟着几个教程,大约一个小时后我可以在cheatengine中看到我的HP,重新启动游戏并且没有查看地址仍然看到它。

但我不明白我将如何实现它到我的程序,我找不到任何教程。 :/

以下是我从Cheatengine发现的:

CE

当前的HP - Legends.exe联盟 - 0x032871FC - 0x58,0x6C0,0x42C,0x90,0x448 - float

1 个答案:

答案 0 :(得分:0)

这是解决问题的可行方法。请注意,该软件需要是32位软件!

第一步是获取流程的基地址:

Process GameProcess = Process.GetProcessesByName("GameProcessName").FirstOrDefault();
IntPtr BaseAddress = GameProcess.MainModule.BaseAddress;

基于此地址,您可以逐步执行指针(示例偏移量0x58)

int ReadBytes;
IntPtr BasePlusOneAddress = IntPtr.Add(BaseAddress, 0x58);
IntPtr BasePlusOneValue = (IntPtr)BitConverter.ToInt32(MemoryHandler.ReadMemory(GameProcess, BasePlusOneAddress, 4, out ReadBytes), 0);

您可以再次使用该值作为指针。

这导致了一个简单的功能,如

void IntPtr GetOffsetPointer(Process P, IntPtr BasePointer, Int32 Offset)
{
    int ReadBytes;
    IntPtr OffsetAddress = IntPtr.Add(BasePointer, Offset);
    return (IntPtr)BitConverter.ToInt32(MemoryHandler.ReadMemory(P, OffsetAddress, 4, out ReadBytes), 0);
}

编辑: MemoryHandler只包装ReadProcessMemory function个窗口。这只是一个示例 - 因此您必须实现自己的功能。 Code Project提供了一个greate示例。