Считывание объекта с помощью ReadProcessMemory C#
Увидел в чужом коде такое:
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [MarshalAs(UnmanagedType.AsAny)] [Out] object lpBuffer, int dwSize, out int lpNumberOfBytesRead);
Большее всего меня заинтересовал третий аргумент. Попробовал повторить:
[DllImport("kernel32.dll")]
extern public static bool ReadProcessMemory(nint hProcess, nint lpBaseAddress, object? lpBuffer, int nSize, out int lpNumberOfBytesRead);
Всегда выдаёт 0(Я тестил на int). Сделал как надо через через массив байт, данные есть Исходя из этого могу сделать вывод что почему-то не передаётся ссылка
Короче есть ли способ превратить массив байт в объект или сразу счесть объект?
Контекст:
Мой
public T? GetObject<T>(nint offset)
{
T? result = default;
if (!Kernel32.ReadProcessMemory(target.Handle, Module.BaseAddress + offset, result, Marshal.SizeOf<T>(), out int readsBytes))
throw new Exception($"Memory read error(code: {Kernel32.GetLastError()})");
return result;
}
Чужой:
[NullableContext(0)]
public static T Read<[IsUnmanaged] T>(IntPtr Address) where T : struct, ValueType
{
int size = Marshal.SizeOf<T>();
object buffer = default(T);
int lpNumberOfBytesRead;
Memory.ReadProcessMemory(Memory._proc.Handle, Address, buffer, size, out lpNumberOfBytesRead);
if (lpNumberOfBytesRead != size)
{
return default(T);
}
return (T)((object)buffer);
}
Ответы (1 шт):
Автор решения: Pronik
→ Ссылка
Потыкался ещё немного и пришёл к такому коду:
[DllImport("kernel32.dll")]
extern public static bool ReadProcessMemory(nint hProcess, nint lpBaseAddress, [MarshalAs(UnmanagedType.AsAny)][Out] object lpBuffer, int nSize, out int lpNumberOfBytesRead);
public T GetObject<T>(nint offset)
{
object result = default(T);
if (!Kernel32.ReadProcessMemory(target.Handle, Module.BaseAddress + offset, result, Marshal.SizeOf<T>(), out int readsBytes))
throw new Exception($"Memory read error(code:{Kernel32.GetLastError()})");
return (T)result;
}
Я всё ещё не особо понимаю почему так а не иначе, но оно вроде работает