MemRead
メモリを読み取り、バイト配列を返すメソッドがあります
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, ref byte lpBuffer, int dwSize, out int lpNumberOfBytesRead);
public static Span<byte> MemRead(this Process process, IntPtr address, int size)
{
if (process == null)
throw new ArgumentException("Process is null");
Span<byte> buffer = new byte[size];
bool success = NativeMethods.ReadProcessMemory(process.Handle, address, ref MemoryMarshal.GetReference(buffer), size, out int lpNumberOfBytesRead);
if (!success)
throw new Exception("ReadProcessMemory failed");
if (lpNumberOfBytesRead < size)
throw new Exception($"ReadProcessMemory failed : {lpNumberOfBytesRead} bytes read out of {size}");
return buffer;
}
そして、変換を呼び出して実行するメソッドMemReadInt32
、MemReadBool
、 ... があります。MemRead
public static int MemReadInt32(this Process process, IntPtr address)
{
return BitConverter.ToInt32(MemRead(process, address, 4));
}
ヒープではなくスタックにバッファを割り当てたいので、この行を変更します
Span<byte> buffer = new byte[size];
に
Span<byte> buffer = stackalloc byte[size];
スタックに割り当てられた配列は宣言スコープ外に公開できないため、コンパイラはエラーをスローします。これにより、ヒープへの潜在的な昇格を防ぐことができます。
しかし、その後、読み取りコードと同じメソッドに変換コードを配置する必要があります。MemReadInt32
そして、読み取りコードは、 、MemReadBool
、 ...ごとに繰り返されます。
コードを繰り返さReadMem
ずにスタック割り当てを取得するにはどうすればよいですか?