1

私は現在、チート エンジンを使用して見つかったベース ポインターに C# でメモリ読み取りを実装しようとしています。正しいポインターとオフセットを見つけたことは 100% 確信しています。なぜなら、それらは再起動の間でも Cheat-Engine で問題なく機能するからです。

現在、C# で実装していますが、シングル レベル ポイントに問題はありませんでしたが、何らかの理由で最後のマルチレベル ポインターを機能させることができません。

追加する必要がある最後の値まではすべてうまくいき、「ランダム」なものを返します。これらは私が見つけたポインターであり、チートエンジンで動作することがわかります.

ここに画像の説明を入力

これは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 });

ここで「ランダム」部分が来ます。0x458 をポインター 1E138F80 に追加する必要がある最後のものを除いて、すべてのポインターが正しく追加されます。これは 1E1393D8 を返すはずですが、「41C00000」を返すことになります。 ここに画像の説明を入力

最後のポインターが 4 バイトではなくなったことが原因なのか、それとも何らかの形で変換が行われて混乱しているのかはわかりません。ここで何か助けていただければ幸いです。

4

1 に答える 1

1

あなたの問題は、最後のオフセットを追加した後、このアドレスがアドレスを取得しようとしている変数を指しているかのように、再度逆参照していることです。実際、この時点では、アドレスは変数へのポインターではなく、変数のアドレスです。最後のオフセットが追加されたら、代わりにその変数を停止して出力する必要があります。

私は次のように変更することを確信しています:

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;
}
于 2019-05-25T21:18:12.640 に答える