В настоящее время я пытаюсь реализовать чтение памяти в C # по базовым указателям, найденным с помощью Cheat Engine.Я на 100% уверен, что нашел правильные указатели и смещения, так как они прекрасно работают в Cheat-Engine, даже между перезапусками.
Я сейчас реализую его в C #, не было проблем с точками одного уровня, но по какой-то причине я не могу заставить работать мой последний многоуровневый указатель.
Все идет хорошо, пока не добавится последнее значение, а затем он возвращает мне что-то «случайное», это указателиЯ нашел и вижу, что он работает в Cheat Engine.
Это моя реализация в C #:
public static int ReadFromPointer(int address, int[] offsets)
{
Console.WriteLine("----------");
Console.WriteLine("Address: " + address);
int ptr = ReadPointer(address);
Console.WriteLine($"Pointer returned as int: {ptr}, hex: {ptr:X}");
foreach (var offset in offsets)
{
Console.WriteLine($"Adding offset: {offset:X} to Pointer: {ptr:X}");
ptr = ReadPointer(ptr + offset);
Console.WriteLine($"Pointer returned as int: {ptr}, hex: {ptr:X}");
}
Console.WriteLine("----------");
return ptr;
}
private static int ReadPointer(int adress)
{
int ptrNext;
int bytesRead = 0;
byte[] _Value = new byte[4];
ReadProcessMemory((IntPtr)ProcessHandle, (IntPtr)adress, _Value, IntPtr.Size, ref bytesRead);
ptrNext = BitConverter.ToInt32(_Value, 0);
return ptrNext;
}
и я называю это следующим образом:
var valueToFind = ProcessHelper.ReadFromPointer((int)baseAddress + 0x00C45A5C, new []{ 0xEC, 0x1C, 0x178, 0x74, 0x458 });
Теперь здесь идет «случайная» часть, каждый указатель добавляется правильно, кроме последнего, когда он должен добавить 0x458 к указателю 1E138F80, это должно вернуть 1E1393D8, нов итоге возвращает "41C00000"
Я не уверен, что это из-за того, что мой последний указатель больше не является 4 байтами или происходит какое-то преобразование, которое смешивает его.Любая помощь здесь будет принята с благодарностью!