首页 > 解决方案 > C#从具有多个偏移量的指针读取值

问题描述

我正在尝试使用 VAMemory 库读取浮点数,并且我有基本偏移量和要从 CE 添加到指针的偏移量,我知道它们正确引用了该值(在 CE 中相应地更改了值)

以下是 CE 显示的偏移量:(根据之前关于此主题的问题,它们应该从下到上应用,因为它们出现在 CE 中)

1

我已经尝试了在每次迭代时“取消引用”指针的多种实现,因为必须一个接一个地添加偏移量,我不确定我是否正确获取了基地址,是否应该遍历模块而是将其与我在其他问题中看到的名称匹配。我现在正在尝试使用类似问题中显示的实现,但是我得到的返回值始终是0

private static float GetPointerValue(IntPtr baseAddress, int[] offsetArr)
{

VAMemory vam = new VAMemory("amtrucks");

//Adding original offset to base address
IntPtr pointer = IntPtr.Add((IntPtr)vam.ReadInt32(baseAddress + 0x014BC410), offsetArr[0]);
for (int i = 1; i < offsetArr.Length; i++)
{
   pointer = IntPtr.Add((IntPtr)vam.ReadInt32(pointer), offsetArr[i]);
}
return vam.ReadFloat(pointer);
}
public void SetCam(float height)
{
Process GameProcess = Process.GetProcessesByName("amtrucks").FirstOrDefault();
IntPtr BaseAddress = GameProcess.MainModule.BaseAddress;


//Offsets in reverse order
var offsetArr = new int[] { 0x18, 0x40, 0x0, 0x3C8, 0x48};

Console.WriteLine("value:" + GetPointerValue(BaseAddress, offsetArr));
}

它不会抛出任何异常或错误消息,但值始终为 0(实际值在 43 左右)

标签: c#memory

解决方案


public static IntPtr FindDMAAddy(IntPtr hProc, IntPtr ptr, int[] offsets)
{
    var buffer = new byte[IntPtr.Size];
    foreach (int i in offsets)
    {
        ReadProcessMemory(hProc, ptr, buffer, buffer.Length, out var read);

        ptr = (IntPtr.Size == 4)
        ? IntPtr.Add(new IntPtr(BitConverter.ToInt32(buffer, 0)), i)
        : ptr = IntPtr.Add(new IntPtr(BitConverter.ToInt64(buffer, 0)), i);
    }
    return ptr;
}

public static IntPtr GetModuleBaseAddress(Process proc, string modName)
{
    IntPtr addr = IntPtr.Zero;

    foreach (ProcessModule m in proc.Modules)
    {
        if (m.ModuleName == modName)
        {
            addr = m.BaseAddress;
            break;
        }
    }
    return addr;
}

Process proc = Process.GetProcessesByName("whatever")[0];

var modBase = GetModuleBaseAddress(proc, "whatever.exe");

var freecamheight = FindDMAAddy(hProc, (IntPtr)(modBase + 0x14bc410), new int[] { 0x18, 0x40, 0, 0x3c8, 0x48});

然后使用 VAMemory 读取地址“freecamheight”处的浮点数


推荐阅读