【问题标题】:Memory address from pointer来自指针的内存地址
【发布时间】:2016-12-28 11:36:53
【问题描述】:

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

vam.ReadFloat((IntPtr)address);

它运行得很好,我可以从我的程序中看到我的游戏内 HP,但由于它是一个静态地址,并且每次我重新启动游戏时它都会改变,所以我每次都必须找到该地址。 所以我开始寻找指针。我遵循了几个教程,大约一个小时后,我可以在作弊引擎中看到我的 HP,重新启动游戏并且不更改地址仍然可以看到它。

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

这是我从 Cheatengine 中发现的:

当前生命值 - 英雄联盟.exe - 0x032871FC - 0x58、0x6C0、0x42C、0x90、0x448 - 浮动

【问题讨论】:

  • 你需要非常小心你在各种游戏中对记忆所做的事情,因为它们中的许多游戏都有反作弊系统,当你篡改他们的记忆时就会发现。
  • “我不会编程”和“我需要教程”不是问题;这是一个问答网站。您有具体的问题吗?
  • 是的,我的问题是如果我有指针,我如何从内存中读取浮点数

标签: c# memory ram memory-address


【解决方案1】:

这是解决您的问题的一种可能方法。注意软件必须是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 提供了一个很好的示例。

【讨论】:

  • 你从哪里得到“MemoryHandler”?错误:当前上下文中不存在名称“MemoryHandler”
  • 嗯,当做:IntPtr BasePlusOneAddress = IntPtr.Add(BaseAddress, 0x58); vam.ReadFloat((IntPtr)BasePlusOneAddress);我得到 2,959361E+21
  • vam 是什么类型,该位置应该是什么值?
  • 我用你的函数获取了“BasePlusOneAddress”,它是 13303896,将其转换为十六进制 CB0058 并在作弊引擎中使用,但仍然得到了奇怪的数字 Cheatengine
猜你喜欢
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 2014-10-03
相关资源
最近更新 更多