タイトルが示すように、ランダムなビットのデータ (ULONG) をローカル マシンで実行中のプロセスに関連付けたいと考えています。データを読み書きするプロセスではなく、関連付けられているプロセスでそのデータを永続化したいと考えています。これはWin32で可能ですか?
1 に答える
はい、しかしそれは難しいかもしれません。別のプロセスの任意のメモリアドレスにアクセスすることはできず、任意のプロセスでそれを行いたいため、共有メモリを当てにすることはできません。
トリッキーな方法
できることは、装飾したいプロセス内に (特別で既知の名前を持つ)ウィンドウを作成することです。ウィンドウのない代替ソリューションについては、投稿の最後を参照してください。
- まず、 を使用してプロセスのハンドルを取得する必要があります
OpenProcess
。 - 他のプロセスでメモリを割り当て
VirtualAllocEx
て、特別な既知の名前を持つ (非表示の) ウィンドウを作成する短いメソッドを保持します。 - を使用して、独自のコードからその関数をコピーします
WriteProcessMemory
。 - で実行し
CreateRemoteThread
ます。
次に、このメモリを作成したプロセスとは別のプロセスから、このメモリを識別して読み取る方法が必要です。このためには、その既知の名前を持つウィンドウを見つけるだけで、データの小さなチャンクのホルダーを手に入れることができます。
この手法は、別のプロセスにコードを挿入するために使用される可能性があるため、一部のアンチウイルスが警告する場合があることに注意してください。
最終メモ
アドレス空間のランダム化が無効になっている場合は、プロセス メモリにコードを挿入
する必要がない場合があります。Windows カーネル関数のアドレスを同じパラメータ (たとえば) で呼び出すことができます。これは、ネイティブ アプリケーション (kernel32.dll にリンクされていない) では実行できません。
プロセスのデバッグ権限を持っていない限り、システム プロセスに挿入することはできません (と)。CreateRemoteThread
LoadLibrary
AdjustTokenPrivileges
フェイク ウィンドウの代わりに、データ チャンクとして使用されるローカル変数、TLS またはスタック エントリを使用して中断スレッドを作成することもできます。このスレッドを見つけるには、たとえばthisを使用して名前を付ける必要があります(ただし、ほとんど適用されません)。
素朴な方法
貧弱な人の解決策 (ただし、おそらく実装がはるかに簡単で、より堅牢です) は、ADSを使用して、監視するプロセスごとに小さなデータ ファイルを非表示にすることです (もちろん、そのイメージに関連付けられた ADS には適用できません)。rundll
はるかに複雑にしない限り、サービスと'ed プロセス)。
- すべてのプロセスを繰り返し、それぞれに既知の名前 (およびプロセス ID) を持つ ADS を作成します。
- その中には、システムの起動時間と必要なすべてのデータを保存する必要があります。
その情報を読み返すには:
- すべてのプロセスを繰り返し、その ADS を確認し、それを読み取り、システムの起動時間を比較します (それらが一致しない場合は、未亡人のADS が見つかったことを意味し、削除する必要があります。
もちろん、これらの未亡人の世話をしなければならないので、定期的にチェックする必要があるかもしれません. もちろん、これらすべての小さなデータのチャンクを既知の場所に保存することを回避できます。「リーダー」は毎回それらをすべてチェックし、実行中のプロセスに関連付けられなくなったファイルを削除する可能性があります。