0

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;
}

そして、変換を呼び出して実行するメソッドMemReadInt32MemReadBool、 ... があります。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ずにスタック割り当てを取得するにはどうすればよいですか?

4

1 に答える 1