内存尖锐设置偏移到地址不起作用

本文关键字:地址 不起作用 设置 内存 | 更新日期: 2023-09-27 18:31:38

好的,所以我正在使用MemorySharp库来读/写游戏的内存。我的问题是当我尝试将偏移量添加到基本指针地址时,Visual Studio 在运行时抛出错误。这是基本代码

using (var m = new MemorySharp(ApplicationFinder.FromProcessName("Cube").First()))
{
    IntPtr healthPtr = GetBaseAddress("Cube") + 0x0036B1C8;
    int[] offsets = {0x39c, 0x16c};
foreach(var offset in offsets)
{
    healthPtr = m[healthPtr + offset].Read<IntPtr>(); //I'm getting the error on this line
}
var healthLocation = m[m[healthPtr].Read<IntPtr>()];
float health = healthLocation.Read<float>();
MessageBox.Show(health.ToString());
}

这是我的GetBaseAddress方法

internal static IntPtr GetBaseAddress(string ProcessName)
{
    try
    {
        Process[] L2Process = Process.GetProcessesByName(ProcessName);
        return L2Process[0].MainModule.BaseAddress;
    }
    catch { return IntPtr.Zero; }
}

但是当我运行这个视觉工作室时,给我抛出这个错误

"类型为'System.ArgumentOutOfRangeException'的未处理异常发生在 MemorySharp.dll 附加信息:相对地址不能大于 主模块尺寸。

它指向这行代码healthPtr = m[healthPtr + offset].Read<IntPtr>();不太确定我在这里做错了什么。

编辑
这是我更新的代码,仍然不起作用

using (var m = new MemorySharp(ApplicationFinder.FromProcessName("Cube").First()))
{
    var healthPtr = new IntPtr(0x0036B1C8);
    int[] offsets = { 0x39c, 0x16c };
    healthPtr = m[healthPtr].Read<IntPtr>();
    foreach (var offset in offsets)
    {
        healthPtr = m[healthPtr + offset, false].Read<IntPtr>(); // false is here to avoid rebasing
    }
    float Health = m[healthPtr, false].Read<float>(); // false is here to avoid rebasing
    MessageBox.Show(Health.ToString());
}

编辑找到的
答案我必须将最后一个指针读取为我想要的类型。所以只有 2 个指针,我读取第一个指针,然后在最后一个指针上将其读取为值,如下所示

using (var m = new MemorySharp(ApplicationFinder.FromProcessName("Cube").First()))
{
    var healthPtr = new IntPtr(0x0036B1C8);
    int[] offsets = { 0x39C, 0x16C };
    healthPtr = m[healthPtr].Read<IntPtr>();
    healthPtr = m[healthPtr + offsets[0], false].Read<IntPtr>(); // false is here to avoid rebasing
    float Health = m[healthPtr + offsets[1],false].Read<float>();
    MessageBox.Show(Health.ToString());
}

内存尖锐设置偏移到地址不起作用

首先

,使用 MemorySharp 对象的索引器已经将指针重定了指向进程主模块的基址。因此,您不需要在函数GetBaseAddress使用函数,您可以像这样声明指针/偏移量:

var healthPtr = new IntPtr(0x0036B1C8);
int[] offsets = { 0x39c, 0x16c };

现在读取指针的值

healthPtr = m[healthPtr].Read<IntPtr>(); // The pointer is automatically rebased

使用偏移量浏览指针链

foreach (var offset in offsets)
{
    healthPtr = m[healthPtr + offset, false].Read<IntPtr>(); // false is here to avoid rebasing
}

请注意,第二个参数设置为 false 。它指出,地址不得重新定位到进程的主模块。

此外,在

第一次读取后使用偏移量也很重要,否则声明偏移量而不是直接将值添加到地址的目的是什么。 :)

我认为不需要设置 var healthLocation的行,并且会读取未知的内存地址。你确定要这样做吗?

此错误:

"类型为'System.ArgumentOutOfRangeException'的未处理异常 发生在 MemorySharp 中.dll 附加信息:相对 地址不能大于主模块大小。

抛出,因为如果您未将第二个参数设置为 false,则 MemorySharp 已经使指针变基(如上所述)。

让我知道它是否适合你。