Чтение памяти с базовым адресом DLL

Я пытаюсь прочитать float в процессе (игра).

Глядя в Cheat Engine, я могу найти нужный мне адрес, однако он находится на wow64cpu.dll + 4720со смещением 34.

Поэтому я попытался найти базовый адрес wow64cpu.dll в процессе, но это то, где я запутался.

Я не понимаю, как теперь использовать этот адрес, поскольку все мои попытки кажутся далекыми.

        Process[] processes = Process.GetProcessesByName("Napoleon");
        Process process = processes[0];

        ProcessModuleCollection modules = process.Modules;
        ProcessModule dllBaseAdress = null;
        foreach (ProcessModule i in modules)
        {
            if (i.ModuleName == "wow64cpu.dll")
            {
                dllBaseAdress = i;
                break;
            }
        }

        IntPtr dllPtr = dllBaseAdress.BaseAddress;
        int pointer = dllPtr.ToInt32() + 0x4720;
        int offset = 34;

        IntPtr hProc = OpenProcess(ProcessAccessFlags.All, false, process.Id);

        int bytesRead;
        byte[] buffer = new byte[4];

        ReadProcessMemory(hProc, new IntPtr(pointer + offset), buffer, 4, out bytesRead);

        float lightColourScale = BitConverter.ToSingle(buffer, 0);

У меня вопрос, где я ошибаюсь с использованием базового адреса DLL, или, возможно, в другом месте, я не уверен, как использовать его, чтобы найти мой адрес?

Я также скомпилировал программу в x64, иначе она не найдет wow64cpu.dll.

Спасибо

1 ответ

Ваше смещение должно быть добавлено к указателю, считанному на месте wow64cpu.dll + 4720, поэтому, если ваши адреса верны, местоположение вашего поплавка находится по адресу [wow64cpu.dll + 4720] + 30,

Ваш код будет

// Set the addresses to read
var pointer = dllPtr.ToInt32() + 0x4720;
var offset = 34;
// Initialize the buffers
var buffer = new byte[4];

// Find the pointer
ReadProcessMemory(hProc, new IntPtr(pointer), buffer, 4, out bytesRead);
pointer = BitConverter.ToInt32(buffer, 0);
// Add the offset to the value previously found
ReadProcessMemory(hProc, new IntPtr(pointer + offset), buffer, 4, out bytesRead);
var lightColourScale = BitConverter.ToSingle(buffer, 0);

Тем не менее, действительно трудно вызывать все эти функции вручную. Я настоятельно рекомендую вам использовать библиотеку инъекций, которая оборачивает все эти вызовы для вас.

Библиотека MemorySharp будет хорошо для вас (я автор). В вашем случае вы могли бы написать следующий код.

using (var memory = new MemorySharp(ApplicationFinder.FromProcessName("Napoleon").First()))
{
    var myValue = memory.Read<float>(memory["wow64cpu.dll"].Read<IntPtr>(4720) + 34, false);
}

Cheat Engine дает свои значения в шестнадцатеричном виде. Вы конвертировали их в декабрь перед их использованием?

Кроме того, другой вопрос похож на ваш: найти адрес с помощью указателя и смещения C#

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