Чтение памяти с базовым адресом модуля

Как я могу прочитать память с базовым адресом модуля? Например, как я могу прочитать эту память: "winCap64.dll" + 0x123456 + смещения.

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

Изменить: добавлен код samle

    [DllImport("kernel32.dll")]
    static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Boolean bInheritHandle, UInt32 dwProcessId);
    [DllImport("kernel32.dll")]
    static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
    byte[] lpBuffer, UIntPtr nSize, uint lpNumberOfBytesWritten);

    static IntPtr Handle;

    static void Main(string[] args)
    {
        Process[] Processes = Process.GetProcessesByName("process");
        Process nProcess = Processes[0];
        Handle = OpenProcess(0x10, false, (uint)nProcess.Id);
        IntPtr pointer = IntPtr.Add(nProcess.Modules[125].BaseAddress, 0x020C5150);
        int curhp = ReadOffset(pointer, 0x4D8);
        int curhp2 = ReadOffset((IntPtr)curhp, 0x0);
        int curhp3 = ReadOffset((IntPtr)curhp2, 0x1c0);
        Console.WriteLine(curhp3.ToString());
        Console.ReadKey();
    }

    public static int ReadOffset(IntPtr pointer, uint offset)
    {
        byte[] bytes = new byte[24];

        uint adress = (uint)ReadPointer(pointer) + offset;
        ReadProcessMemory(Handle, (IntPtr)adress, bytes, (UIntPtr)sizeof(int), 0);
        return BitConverter.ToInt32(bytes, 0);
    }

    public static int ReadPointer(IntPtr pointer)
    {
        byte[] bytes = new byte[24];

        ReadProcessMemory(Handle, pointer, bytes, (UIntPtr)sizeof(int), 0);
        return BitConverter.ToInt32(bytes, 0);
    }

Ответ 1

Как насчет чего-то подобного?

IntPtr pointer = IntPtr.Add(nProcess.Modules[125].BaseAddress, BaseAddress);
Console.WriteLine("Final: " + pointer.ToString("X"));

int hp = ReadInt32(pointer, Handle);
string hexPrefix = "80" + hp.ToString("X"); //because int32 will cut some digits. I sugget using int64. Even UInt64.
long hexToint = long.Parse(hexPrefix, NumberStyles.HexNumber);
hp = ReadInt32((IntPtr)hexToint + 0x00, Handle);
hexPrefix = "80" + hp.ToString("X");
hexToint = long.Parse(hexPrefix, NumberStyles.HexNumber);
hp = ReadInt32((IntPtr)hexToint + 0x1c0, Handle);
hexPrefix = "80" + hp.ToString("X");
hexToint = long.Parse(hexPrefix, NumberStyles.HexNumber);
hp = ReadInt32((IntPtr)hexToint + 0x0, Handle);

Ответ 2

IntPtr - это агностический способ сохранения указателя и передачи его, например, ReadProcessMemory:

IntPtr pointer = IntPtr.Add(nProcess.Modules[125].BaseAddress, 0x02093458);