Чтение памяти - Не читается даже самый первый базовый адрес - C#
Формулировка задачи:
Во общем хочу прочитать память, нужно прочитать так:
Читаю базовый адресс 0xFFF6525C, он содержит указатель на другой адресс 0x654CC5E0 этот + смещение содержит другой указатель и так 5 раз.
Но не читает даже самый первый базовый адресс...
А вот адресс, в котором лежит простое число, на пример "1150" - читает нормально...
Где косяк подскажите...
p.s. ReadProcessMemory\VirtualProtect\OpenProcess\CloseHandle - Это простые DllImport'ы.
private void ReadMem() { byte[] buf = new byte[4]; uint oldMemProtect; int bytesReaded; uint baseAddr = 0xFFF6525C; // В дизассемблере показывает что этот адресс содержим другой адресс 0x546CC80A IntPtr hProcess = OpenProcess(ProcessAccessFlagsAll, false, this.pId); // Тут все нормально получаю хендл VirtualProtect((IntPtr)baseAddr, 4, PAGE_READWRITE, out oldMemProtect); // Меняю защиту на PAGE_READWRITE ReadProcessMemory(hProcess, (IntPtr)baseAddr, buf, 4, out bytesReaded); // Читаю в buf VirtualProtect((IntPtr)baseAddr, 4, oldMemProtect, out oldMemProtect); // Меняю защиту обратно CloseHandle(hProcess); MessageBox.Show(BitConverter.ToInt32(buf, 0).ToString()); // И тут читает либо криво либо buf = null }
Решил на другом форуме.
BitConverter.ToUInt32(buf, 0)
Решение задачи: «Чтение памяти - Не читается даже самый первый базовый адрес»
textual
Листинг программы
[DllImport("kernel32", SetLastError = true)] static unsafe extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte* lpBuffer, int dwSize, IntPtr lpNumberOfBytesRead); //// public unsafe T Read<T>(IntPtr address) where T : struct { var buffer = new byte[Marshal.SizeOf(typeof(T))]; fixed (byte* pointer = buffer) { ReadProcessMemory(this.Process.Handle, address, pointer, buffer.Length, IntPtr.Zero); return (T)Marshal.PtrToStructure(new IntPtr(pointer), typeof(T)); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д