Чтение памяти с базовым адресом 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.

Спасибо


person Mitch    schedule 25.08.2013    source источник
comment
Голосовать против и не комментировать почему. Отлично, спасибо.   -  person Mitch    schedule 25.08.2013
comment
Боты WoW разрушают игру ...   -  person Hannes Schneidermayer    schedule 30.05.2015


Ответы (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 #

person Jämes    schedule 15.09.2013