C # ~ Как читать MultiLevelPointer? - PullRequest
       29

C # ~ Как читать MultiLevelPointer?

0 голосов
/ 04 января 2019

Я немного борюсь с этой частью ... Я хочу сделать это в CE! (Это читается как значение 20 в моем приложении c #)

CE - pointer

Однако мой код не работает ...

[DllImport("kernel32.dll")]
        public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, int dwSize, ref IntPtr lpNumberOfBytesRead);

public int ReadInt32(IntPtr address, int[] pointers)
{
    /* FOR REFERENCE ONLY! PSEUDO-CODE
        ReadProcessMemory(..., ModuleBaseAddress + 0x010F418, Temporary, ..., ...); // -> 0x02A917F8
        ReadProcessMemory(..., 0x02A917F8+0x48, Temporary,  .....,.); // -> 0x02A9A488
        [02A9A488] = 20
     */

    IntPtr bytesRead = IntPtr.Zero;
    byte[] _buff = new byte[sizeof(int)]; 
    int offIndex = 0;
    IntPtr finalval = address;
    Console.WriteLine("[BASE] {0:x}", (int)address);
    foreach(int PointerOffs in pointers)
    {
        ReadProcessMemory(hProcess, address, _buff, _buff.Length, ref bytesRead);
        finalval += pointers[offIndex];

        Console.WriteLine("[Curr ADDRESS] {0:x}", finalval);
        offIndex++;
    }

    return BitConverter.ToInt32(_buff, 0);
}

И вот как я получаю доступ к методу:

 int currAmmo = (int) pReader.ReadInt32((IntPtr)LocalPlayer.BaseAddress, LocalPlayer.oMGAmmo);
            Console.Write("[AMMO] {0}\n", currAmmo);

Output

1 Ответ

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

У вашей функции достаточно проблем, чтобы гарантировать замену, я пытался ее исправить, но проще было начать заново.Используя преинкремент вместо постинкремента, вы будете отменять ссылку на первый указатель перед добавлением идеального смещения.

public static int ReadInt32(IntPtr hProc, IntPtr ptr, int[] offsets)
{
    IntPtr addr = ptr;
    var buffer = new byte[4];

    for (int i = 0; i < offsets.Length; ++i)
    {
        ReadProcessMemory(hProc, addr, buffer, buffer.Length, out var read1);
        addr = IntPtr.Add(new IntPtr(BitConverter.ToInt32(buffer, 0)), offsets[i]);
    }

    ReadProcessMemory(hProc, addr, buffer, 4, out var read);

    return BitConverter.ToInt32(buffer, 0);

}

Сегодня я выучил C # только для ответа на этот вопрос:)

...