質問

答えが見つからなかったので 以前ここで行われた質問に対して 別のアプローチを試しています。

2 つのプロセス間でメモリを共有する方法はありますか?

2 番目のプロセスは、サポートされていないレガシー プログラムであるため、インジェクションから情報を取得します。

私のアイデアは、そこにコードを挿入し、挿入されたプログラムに渡す構造体の中で、実行する必要のあるデータが配置されている共有メモリのアドレス(またはその他)を渡すことです。データを取得したら、挿入されたスレッド内に独自の変数を設定します。

これは可能でしょうか?どうやって?

コードは大歓迎です。

編集:

わかりにくいと思いますので、補足させていただきます。注射の仕方は知っています。もうやってますよ。ここでの問題は、動的データをインジェクションに渡すことです。

役に立ちましたか?

解決

メモリマップファイルを試すことができます。

>

これはもう少しステップバイステップで説明します詳細。

他のヒント

Windows は共有メモリをサポートしていますが、 ファイルマッピングAPI, 共有メモリ マッピングを別のプロセスに直接挿入することは簡単ではありません。 ファイルExのマップビュー プロセス引数を取りません。

ただし、次を使用して別のプロセスにメモリを割り当てることで、一部のデータを注入できます。 VirtualAllocEx そして 書き込みプロセスメモリ. 。を使用してハンドルをコピーした場合、 複製ハンドル, を呼び出してスタブを挿入します。 ファイルExのマップビュー, 、別のプロセスで共有メモリ マッピングを確立できます。いずれにしてもコードを挿入することになるので、これはうまく機能するはずです。

要約すると、次のことが必要になります。

  • 呼び出して、匿名の共有メモリ セグメント ハンドルを作成します。 ファイルマッピングの作成 hFile には INVALID_HANDLE_VALUE、lpName には NULL を使用します。
  • このハンドルをターゲット プロセスにコピーします。 複製ハンドル
  • 次を使用してコードにメモリを割り当てます。 VirtualAllocEx, 、flallocationType = mem_commit | mem_reserve and flprotect = page_execute_readwrite
  • 次を使用して、スタブ コードをこのメモリに書き込みます。 書き込みプロセスメモリ. 。このスタブはアセンブラで記述する必要がある可能性があります。ここのどこかに HANDLE を書いて、DuplicateHandle から HANDLE を渡します。
  • 次を使用してスタブを実行します リモートスレッドの作成. 。スタブは、取得した HANDLE を使用して呼び出す必要があります。 ファイルExのマップビュー. 。これにより、プロセスは共通の共有メモリ セグメントを持つようになります。

スタブが外部ライブラリをロードする場合は、少し簡単になるかもしれません。つまり、単純に LoadLibrary を呼び出して (LoadLibrary のアドレスを見つけるのは読者の演習として残しておきます)、ライブラリの dllmain エントリ ポイントから作業を実行するだけです。この場合、名前付き共有メモリを使用する方が、DuplicateHandle をいじるよりも簡単になる可能性があります。MSDN の記事を参照してください。 ファイルマッピングの作成 詳細は後述しますが、基本的には、hFile には INVALID_HANDLE_VALUE を、lpName には名前を渡します。

編集:あなたの問題はデータを渡すことであり、実際のコードインジェクションではないため、ここではいくつかのオプションを示します。

  1. 可変サイズの共有メモリを使用します。スタブは、サイズと、共有メモリの名前またはハンドルを取得します。これは、データを 1 回だけ交換する必要がある場合に適しています。 共有メモリセグメントのサイズは、作成後に簡単に変更できないことに注意してください。
  2. 使う 名前付きパイプ. 。スタブはパイプの名前またはハンドルを取得します。その後、適切なプロトコルを使用して可変サイズのブロックを交換できます。たとえば、長さの size_t を書き込み、その後に実際のメッセージを書き込みます。または、PIPE_TYPE_MESSAGE および PIPE_READMODE_MESSAGE を使用し、ERROR_MORE_DATA を監視してメッセージがどこで終了するかを判断します。これは、データを複数回交換する必要がある場合に適しています。

編集2:スタブのハンドルまたはポインターのストレージを実装する方法のスケッチを次に示します。

.db B8            ;; mov eax, imm32
.dl handle_value  ;; fill this in (located at the start of the image + one byte)
;; handle value is now in eax, do with it as you will
;; more code follows...

固定名を使用することもできますが、その方がおそらく簡単です。

パイプ(メモリ用)またはシリアル化(オブジェクト用)を使用しようとしましたか?ファイルを使用して、プロセス間のメモリを管理できます。ソケットは、プロセス間の通信を取得するのにも適しています。

メモリマッピングを使用すると、永続的なメモリスペースを作成する必要さえありません。メモリセクタは、それを共有するすべてのプロセスがシャットダウンすると範囲外になります。他の方法もあります。あるCアプリから別のCアプリにデータを渡す手っ取り早い方法は、OSを使用することです。コマンドラインで app1と入力します| app2 。これにより、app2がapp1の出力先になるか、app1からprintfコマンドがapp2に送信します(これはパイピングと呼ばれます)。

Boost.Interprocess を使用してみてください。 2つのプロセス間で通信します。ただし、サポートされていない既存のソフトウェアにコードを挿入するには、おそらく WriteProcessMemory

Windowsについて話している場合、主な障害は、各プロセスが独自の仮想アドレス空間に存在することです。残念ながら、プロセス間で通常のメモリアドレスをやり取りして、期待する結果を得ることができません。 (一方、スレッドはすべて同じアドレス空間に存在するため、スレッドは同じ方法でメモリを見ることができます。)

ただし、Windowsには共有メモリスペースがあり、正しく管理するには非常に注意する必要があります。共有メモリ空間に空間を割り当てるプロセスは、そのメモリを明示的に解放する責任があります。これは、プロセスが終了すると多少消失するローカルメモリとは対照的です。

共有メモリ空間の使用方法に関するアイデアについては、このMSDNサンプル記事を参照してください。世界を引き継ぐために。えー、レガシーソフトウェアとのインターフェース。または何でも:)あなたが何をすることでも幸運を!!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top