2009-07-21 18 views
1

申し訳ありませんが、CreateRemoteThread/LoadLibrary「トリック」を使用して別のプロセスにコードを注入しています。CreateRemoteThread、LoadLibrary、およびPostThreadMessage。適切なIPC方法は何ですか?

スレッドIDと、私の選択したDLLがスピンアップするプロセスがあります。少なくとも理論的には、DLLは現時点で何もしないので、これを確認することはややこしいことです。当分の間、私は信仰だけでそれを受け入れるつもりです。それに、私はこの方向に強く踏み出す前に、この質問に答える必要があります。

基本的に、DllMainでブロックすることはできません。しかし、リモートスレッドと通信する必要があるのは、そのIDです。これは事実上、ブロックするPostThreadMessage/GetMessageの否定を頼みます。私はDllMainの別のスレッドをスピンアップすることができますが、私はそのIDを作成しているスレッドに戻し、別のスレッドのIDをリモートのものに渡す方法はありません。

簡単に言えば、プロセス内でリモートスレッドを作成する場合、元のプロセスとどのように通信する必要がありますか?

答えて

6

ステップゼロ;注入されたDLLにはエントリポイントが必要です。Init()を呼び出すと、LPCWSTRが単一のパラメータとして使用され、intが返されます。つまり、LoadLibrary()と同じシグネチャであり、スレッド開始機能アドレスとしても同様に有効です。

ステップ1;ロードライブラリとリモートスレッドを使用して注入します。注入されたDLLで何も巧妙にしないでくださいDLLMain()。注入スレッドの終了コードとして返されたHMODULEを格納します。これは注入されたDLLのHMODULEで戻り値はLoadLibrary()です。

のx64上のHMODULEGetThreadExitCode()から返さDWORD値よりも大きく、アドレス空間の変化が意味するよう/DYNAMICBASEとASLR(アドレス空間配置のランダム化)が有効になっている場合、これはもはやx64の上で信頼性の高いアプローチであることに注意してくださいHMODULEの値がDWORDに入るのに十分小さい可能性はもはやなくなっています。共有メモリを使用して通信するための作業については、以下のコメントとリンクされた質問(こちら)を参照してください。HMODULE

ステップ2;注入を行っているプロセスにLoadLibraryを使用して注入されたDLLをロードします。その後、アドレス空間にInit()のエントリポイントのオフセットを見つけて、そこからアドレス空間に注入されたDLLのHMODULEを引きます。これで、Init()関数の相対オフセットが得られました。ターゲットプロセス(すなわち、ステップ1で保存した値)に注入されたDLLのHMODULEをとり、それにInit()の相対アドレスを追加します。ターゲットプロセスにInit()というアドレスが設定されました。

ステップ3; LoadLibrary()を呼び出すのと同じ「リモートスレッド」アプローチを使用して、ターゲットプロセスにInit()を呼び出します。文字列をInit()呼び出しに渡すことができます。これはあなたが気に入っているものであれば何でも構いません。

私がする傾向があるのは、名前付きパイプ名の一部として使用する一意の文字列キーを渡すことです。 Injected DLLと注入プロセスは、名前付きパイプの名前を知っているので、それらの間で通信することができます。 Init()関数はDLLMain()ではなく、DLLMain()LoadLibraryなどから呼び出されていない)に影響する制限を受けず、通常の処理を行うことができます。注入されたDLLと注入プロセスが名前付きパイプを介して接続されると、コマンドやデータの結果を好きなように前後に渡すことができます。 Init()関数を文字列に渡すので、名前付きパイプがこの特定のインスタンスのインジェクションプロセスとこの特定のインジェクションされたDLLに対して一意であることを確認できます。つまり、インジェクションプロセスの複数のインスタンスを同時に実行でき、複数のターゲットプロセスに注入することができ、これらの通信チャネルはすべてユニークで制御可能です。

+0

CreateRemoteThread(...、dllExportAddrInRemoteProcess、stringBuffer、...)に文字列を渡すと、(WriteProcessMemoryなしで)どのように動作するのかわかりません。しかし、両方のプロセスでは、注入されたスレッドのプロセスIDとスレッドIDを知っているので、IPCで使用されている名前の一部として使用できます。 – Anders

+0

はい、WriteProcessMemory()はLoadLibrary()と同じ方法で使用します。私はあなたが他の手段でユニークなIDをファッジすることに同意しますが、制限のためにDLLMain()で行うことができない初期化を行うために、DLLMain()以外のものを呼び出す必要があります。 –

+1

終了コードのタイプはDWORDです - 32ビットの符号なしint値、プロセスが64ビットであればHMODULEを取得する方法は? – amanjiang

1

モジュールがプロセスのアドレス空間に正常にロードされたときにdllのロードに使用したスレッドが終了したため、スレッドのスレッドIDはリモートプロセスにありません。

名前付きセクション/パイプ/名前付きウィンドウ/ etcの作成などの通常のプロセス間通信方法を簡単に使用できます。あなたの「インジェクション」プロセスと通信する。

関連する問題