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