2

特定のメモリ領域の変更を監視する方法があるかどうか疑問に思っていました。プロセスを開き、使用されているメモリ領域のコレクションを取得するために、次の方法を使用しています。

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 イベントを使用するだけでは、メモリ アドレスの値をリアルタイムで更新するには不十分だと思います。

4

1 に答える 1

1

VirtualAllocターゲットアプリケーションで呼び出され、元のフラグに結合できる場合MEM_WRITE_WATCH、システムはこの割り当てられたメモリ領域を追跡し、GetWriteWatch関数を呼び出して、領域が割り当てられてから書き込まれたページのアドレスを取得できます。書き込み追跡状態がリセットされました。ただし、これには多くの作業が必要です。

于 2013-05-12T07:21:27.413 に答える