C # Многоуровневые указатели неправильно последний каль - PullRequest
0 голосов
/ 03 декабря 2018

В настоящее время я пытаюсь реализовать чтение памяти в C # по базовым указателям, найденным с помощью Cheat Engine.Я на 100% уверен, что нашел правильные указатели и смещения, так как они прекрасно работают в Cheat-Engine, даже между перезапусками.

Я сейчас реализую его в C #, не было проблем с точками одного уровня, но по какой-то причине я не могу заставить работать мой последний многоуровневый указатель.

Все идет хорошо, пока не добавится последнее значение, а затем он возвращает мне что-то «случайное», это указателиЯ нашел и вижу, что он работает в Cheat Engine.

enter image description here

Это моя реализация в 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" enter image description here

Я не уверен, что это из-за того, что мой последний указатель больше не является 4 байтами или происходит какое-то преобразование, которое смешивает его.Любая помощь здесь будет принята с благодарностью!

1 Ответ

0 голосов
/ 26 мая 2019

Ваша проблема в том, что после добавления последнего смещения вы снова отменяете ссылку на него, как если бы этот адрес указывал на переменную, адрес которой вы пытаетесь получить.Фактически, в этот момент адрес является адресом вашей переменной, а не указателем на нее.Когда добавляется последнее смещение, вы должны остановить и напечатать эту переменную вместо этого.

Я почти уверен, что изменение:

foreach (var offset in offsets)

на

for (var i = 0; i < offsets.Length; ++i)

и изменение

ptr = ReadPointer(ptr + offset);

до

ptr = ReadPointer(ptr + offset[i]);

исправит это.

После завершения печати цикла for будет напечатан правильный адрес.

Если это не помогло, я подготовил для вас функцию замены:

public static IntPtr FindDMAAddy(IntPtr hProc, IntPtr ptr, int[] offsets)
{
    var buffer = new byte[IntPtr.Size];

    foreach (int i in offsets)
    {
        ReadProcessMemory(hProc, ptr, buffer, buffer.Length, out var read);

        ptr = (IntPtr.Size == 4)
        ? IntPtr.Add(new IntPtr(BitConverter.ToInt32(buffer, 0)), i)
        : ptr = IntPtr.Add(new IntPtr(BitConverter.ToInt64(buffer, 0)), i);
    }
    return ptr;
}
...