Чтение памяти - Не читается даже самый первый базовый адрес - 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));
}
}