2

わかりましたので、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; }
}

しかし、このVisual Studioを実行すると、このエラーがスローされます

「タイプ '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());
}

EDIT ANSWER FOUND
必要な型として最後のポインターを読み取る必要があります。したがって、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());
}
4

1 に答える 1