1

C# でメモリからバイト値を直接読み込もうとしました。Marshal.Copy Marshal.ReadByteすべての範囲でさまざまなアドレスを試してみました。

常に例外が発生します:

System.AccessViolationException: 保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。

保護されたメモリにアクセスするにはどうすればよいですか?

いくつかのメモリ表示ツールを使用していますが、これらのツールは問題なくメモリ全体にアクセスできます。

例:

IntPtr bufPtr = new IntPtr(0x00000772);
byte data = Marshal.ReadByte(bufPtr);

アドレスは既知のプロセス内にないため、使用できませんReadProcessMemory()

4

1 に答える 1

5
  IntPtr bufPtr = new IntPtr(0x00000772);

仮想メモリ アドレス空間の下部 64KB は予約されており、参照できませ。これは null ポインターのバグに対する対策であり、誤って使用すると AccessViolationException がスローされ、通常はプログラムが終了します。

任意のアドレスを選択することはできません。選択する番号は、マップされた仮想メモリの領域のアドレスでなければなりません。有効なアドレスを見つけるには、少なくとも VirtualQuery() への pinvoke 呼び出しが必要です。有効なアドレスが何百万もある可能性があるため、有用性はまだかなり限定されており、実際に何を読んでいるのかわかりません。ヒープを圧縮するときにランダムに物を移動するガベージコレクターを追加すると、有用なものが見つかる可能性はほとんどありません。

SysInternals のVMMap ユーティリティから、プロセスの仮想メモリ アドレス空間がどのように使用されているかについての洞察を得ることができます。すべてを理解するには、オペレーティング システムの設計に関する入門書と、Windows Internals のような本が必要です。

于 2013-01-01T15:58:25.830 に答える