C# 多级指针最后一次计算错误

C# Multilevel pointers wrong last calc

我目前正尝试在使用 Cheat Engine 找到的基指针上在 C# 中实现内存读取。我 100% 确定我找到了正确的指针和偏移量,因为它们在 Cheat-Engine 中工作得很好,即使在重新启动之间也是如此。

我现在正在用 C# 实现它,单级点没有任何问题,但由于某种原因我无法让我的最后一个多级指针工作。

一切顺利,直到它必须添加最后一个值,然后它 return 对我来说是 "random" 的东西,这些是我找到的指针,我可以看到它在作弊中起作用引擎。

这是我在 C# 中的实现:

public static int ReadFromPointer(int address, int[] offsets)
{
    Console.WriteLine("----------");
    Console.WriteLine("Address: " + address);
    int ptr = ReadPointer(address);
    Console.WriteLine($"Pointer returned as int: {ptr}, hex: {ptr:X}");
    foreach (var offset in offsets)
    {
        Console.WriteLine($"Adding offset: {offset:X} to Pointer: {ptr:X}");
        ptr = ReadPointer(ptr + offset);
        Console.WriteLine($"Pointer returned as int: {ptr}, hex: {ptr:X}");
    }
    Console.WriteLine("----------");
    return ptr;
}

private static int ReadPointer(int adress)
{
    int ptrNext;
    int bytesRead = 0;
    byte[] _Value = new byte[4];
    ReadProcessMemory((IntPtr)ProcessHandle, (IntPtr)adress, _Value, IntPtr.Size, ref bytesRead);
    ptrNext = BitConverter.ToInt32(_Value, 0);
    return ptrNext;
}

我使用以下方式称呼它:

var valueToFind = ProcessHelper.ReadFromPointer((int)baseAddress + 0x00C45A5C, new []{ 0xEC, 0x1C, 0x178, 0x74, 0x458 });

现在是 "random" 部分,除了最后一个指针必须添加 0x458 到指针 1E138F80 外,每个指针都正确添加,这应该 return 1E1393D8,但最终 returning "41C00000"

我不确定这是因为我的最后一个指针不再是 4 个字节,还是某种转换发生了混淆。 如有任何帮助,我们将不胜感激!

你的问题是,在你添加最后一个偏移量之后你又是 de-referencing 它好像这个地址指向你试图获取地址的变量。实际上,此时地址是你变量的地址,而不是指向它的指针。添加最后一个偏移量后,您应该停止并打印该变量。

我很确定改变:

foreach (var offset in offsets)

for (var i = 0; i < offsets.Length; ++i)

正在改变

ptr = ReadPointer(ptr + offset);

ptr = ReadPointer(ptr + offset[i]);

会修复它。

在此 for 循环结束后打印,它应该打印正确的地址。

如果不行,我已经为你准备了替代函数:

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;
}