
プログラム B の動作を監視する必要がないため、プログラム A が RAM 全体を読み取らないようにできるかどうか疑問に思っていました。
また、私は Windows 8.1 64 ビットを使用しています。
答え1
Windows で実行されているプログラムは、RAM を直接アドレス指定できません。仮想アドレスにアクセスします。RAM にアクセスするには、この目的のために作成されたカーネル モード ドライバーの助けが必要になります。(これは、Mark Russinovich の「sysinternals ツール」の一部が行っている方法です。.exe 内にリソースとしてパッケージ化されたドライバーをインストールします。)
あるプログラムが別のプログラムにアクセスする場合、Windows のすべてのプロセスは既に独自の仮想アドレス空間を持っており、他のすべてのプロセスとは分離されています。つまり、あるプログラムの 0x10000 は、他のプログラムの 0x10000 とはまったく異なります。どのアドレスを参照しようとしても、常にそのアドレスの自分のプロセスのインスタンスを参照していることになります。
しかし:ReadProcessMemory および WriteProcessMemory API を使用すると、プログラムはプロセス間アクセス (仮想アドレスに関して) を実行できます。これらの API を使用するには、「アクセス」を実行するプロセスが PROCESS_VM_READ または PROCESS_VM_WRITE 権限を付与された別のプロセスを開く必要があります。ユーザー セッション内で実行されているプロセスは、通常、相互にこれを行うことができます (つまり、ほとんどのプロセスのセキュリティ記述子は、プロセスの作成者 (つまり、あなた) に対してこれを許可します)。
しかし、あるプログラムには、別のプロセスで興味深いものがどこにあるのかを知るすべがありません。興味深いものを探すのは、長くて疲れる作業になります。ほとんどの試行は、「アドレスが定義されていません」領域で終わります。特に 64 ビット システムでは、Windows 8.1 以降では顕著です。仮想メモリの定義済み領域内であっても、プログラムがメモリ領域に「銀行口座番号はここにあります:」の直後にその口座番号が続くようなコンテキスト情報を定期的にタグ付けするわけではありません。
自分のプロセスが他のプロセスの「メモリ」(大まかに解釈)にアクセスできるというのは、いくぶん無謀なことのように思われるかもしれません。しかし、1 つのログイン ID と認証の下で行うすべてのことは、すべて 1 人のユーザーによって行われたものとみなされることを忘れないでください。つまり、いずれにしてもすべては自分のデータなのです。
率直に言って、ディスク上のデータについてもっと心配します。データを含むすべてのファイルは、あなたのセキュリティ ID で作成されたものなので、あなたのセキュリティ ID で実行されているすべてのプログラムからアクセスできます。さらに悪いことに、Windows のデフォルトでは、すべてのファイルの作成時に「Users」グループ (基本的に全員) に読み取りアクセスが付与されます。そのため、他のセキュリティ ID で実行されているプログラムも、それらのファイルを読み取ることができます。また、ファイルには適切な名前が付けられ、適切な名前で整理されたディレクトリに格納されることが多いため、accounts.txt などの「興味深い」ファイルを見つけるのはそれほど難しくありません。NTFS ファイルの暗号化は、自分のアカウントで実行されているスヌーパー プログラムに対しては役に立ちません。これは、プロセス間メモリ アクセスよりもはるかに大きなリスクです。