特定のメモリ領域の変更を監視する方法があるかどうか疑問に思っていました。プロセスを開き、使用されているメモリ領域のコレクションを取得するために、次の方法を使用しています。
internal static MemoryProcess OpenProcess(Process process)
{
IntPtr processHandle = OpenProcess(ProcessAccess.Desided, true, (UInt32)process.Id);
if (processHandle == IntPtr.Zero)
return null;
IntPtr processAddress = new IntPtr();
List<MemoryRegion> memoryRegions = new List<MemoryRegion>();
while (true)
{
MemoryBasicInformation info = new MemoryBasicInformation();
if (VirtualQueryEx(processHandle, processAddress, out info, MemoryBasicInformation.Size) == 0)
break;
if (info.Allocation.HasFlag(MemoryAllocation.Commit) && info.Type.HasFlag(MemoryType.Private) && ((info.Protection & MemoryProtection.Readable) != 0) && ((info.Protection & MemoryProtection.Protected) == 0))
memoryRegions.Add(new MemoryRegion(info.BaseAddress, info.RegionSize));
processAddress = new IntPtr(info.BaseAddress.ToInt64() + info.RegionSize.ToInt64());
}
if (memoryRegions.Count == 0)
{
CloseHandle(processHandle);
return null;
}
return (new MemoryProcess(processHandle, memoryRegions));
}
多くのアプリケーションがこれを行っているのを見ました。チートエンジンもその1つです。Google Chrome タブ プロセスを開き、そのメモリ内で特定の値 (文字列 "stackoverflow") を検索して見つけたとします。
今、そのタブを使用して別のまったく異なる Web サイトを閲覧すると、これらのアドレス値が変化していることがわかります。
最後のステップ: その Chrome タブを閉じて、対応するプロセスを強制終了します。
だから...もちろん、メモリ領域の一種の監視が必要です。実際、次のようなものがあります。
Process.Exited イベントを使用するだけでは、メモリ アドレスの値をリアルタイムで更新するには不十分だと思います。