2

ベースアドレスといくつかのオフセットを使用して、メモリからデータを読み取っています。

public static int ReadInt(long address)
{
    byte[] buffer = new byte[sizeof(int)];
    ReadProcessMemory(pHandle, (UIntPtr)address, buffer, (UIntPtr)4,
                      IntPtr.Zero);
    return BitConverter.ToInt32(buffer, 0);
}

次のようにオフセットを追加します。

var one = MemoryHandler.ReadInt((long)MemoryHandler.base_adress + 
                                (long)0x0945BB0C);
var two = MemoryHandler.ReadInt(one + (long)0x28);
var three = MemoryHandler.ReadInt(two + (long)0x214);
var four = MemoryHandler.ReadInt(three + (long)0x38);
var five = MemoryHandler.ReadInt(four + (long)0x7EC);
var six = MemoryHandler.ReadInt(five + (long)0x230);

どこsixに必要な値が含まれています。

まったく同じことを行うオーバーロードを作成しようとしました。私の問題は、それが私に同じ価値を与えていないことです。理由を知りたい:

public static int ReadInt(long address, int[] offsets)
{
    long prev = 0;
    for (int i = 0; i < offsets.Length; i++)
    {
        address = prev > 0 ? ReadInt(prev + (long)offsets[i]) : ReadInt(address);
        prev = address + offsets[i];
    }

    return (int)address;       
}

var offsets = new int[] { 0x28, 0x214, 0x38, 0x7EC, 0x230 };
var result = MemoryHandler.ReadInt((long)MemoryHandler.base_adress + 
                                 (long)0x0945BB0C, offsets);

明確にするために、上記resultと同じ値が必要ですsix

4

1 に答える 1

2

これは32ビットでのみ機能することに注意してください

public static int ReadInt(long address, int[] offsets)
{
    address = ReadInt(address);

    for (int i = 0; i < offsets.Length; i++)
    {
        address = ReadInt(address + (long)offsets[i]);
    }

    return (int)address;       
}

offsets.Length + 1 ReadIntオフセットなしとオフセットありのいずれかを行う必要がありますoffsets.Length。それぞれが次のアドレスを返します。最後のものは値を返します。

これが 32 ビットでのみ機能することを考慮すると (32 ビットを読み取り、それらを ptr として使用しているため)、使用longは役に立ちません。intで十分です。

于 2013-08-07T20:21:09.867 に答える