Установка MemorySharp смещения на адрес не работает

Итак, я использую 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());
}

РЕДАКТИРОВАТЬ ОТВЕТ НАЙДЕН
Я должен прочитать окончательный указатель как тип, который я хочу. так что только с 2 указателем я читаю указатель 1-й, а затем на последнем прочитать его как значение, как так

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

1 ответ

Решение

Во-первых, с помощью индексатора MemorySharp Объект уже перебазирует указатель на базовый адрес основного модуля процесса. Таким образом, вам не нужно использовать свою функцию GetBaseAddress и вы можете объявить свой указатель / смещения следующим образом:

var healthPtr = new IntPtr(0x0036B1C8);
int[] offsets = { 0x39c, 0x16c };

Теперь прочитайте значение указателя

healthPtr = m[healthPtr].Read<IntPtr>(); // The pointer is automatically rebased

Просмотрите цепочку указателей, используя смещения

foreach (var offset in offsets)
{
    healthPtr = m[healthPtr + offset, false].Read<IntPtr>(); // false is here to avoid rebasing
}

Обратите внимание, что второй параметр установлен в false, В нем говорится, что адрес не должен быть передан в основной модуль процесса.

Кроме того, важно использовать смещения после первого чтения, иначе какова цель объявить смещение вместо непосредственного добавления значения к адресу.:)

Я думаю, что строка, устанавливающая вар healthLocation не требуется и будет читать неизвестный адрес памяти. Вы уверены, что хотите это сделать?

Эта ошибка:

"Произошло необработанное исключение типа" System.ArgumentOutOfRangeException "в MemorySharp.dll Дополнительная информация: относительный адрес не может быть больше размера основного модуля."

выбрасывается, потому что MemorySharp уже сбрасывает указатель, если вы не установите второй параметр в false (как объяснено выше).

Дайте мне знать, если это хорошо для вас.

Другие вопросы по тегам