2011-02-04 3 views
0

'codecave'手法を使用してコードを別のプロセスに挿入することで、新しいスレッドを作成するためのコードを挿入することができます(そして、新しいスレッドのコードを注入することも可能です)。そして、そのスレッドをターゲットプロセスのメインスレッドと並列に実行させることができますか?コーデックケーションでスレッドを注入する

私はこれをdll注入で管理できますが、純粋なコードの注入で可能かどうかを知りたいと思います。

まず、さまざまな注入手法について学びますが、最終的に実行を監督するために、ランダムプロセスのハートビート機能を作成します(高可用性)。 WindowsはターゲットOSであり、言語はC/C++(必要な場合はインラインASM)です。

ありがとうございました。

答えて

0

CreateRemoteThread関数があります。

+0

はい、それはわかっていますが、CreateRemoteThreadを呼び出すプロセスが終了するとそのスレッドは生き残りますか?作成されたスレッドは、ターゲットプロセスが終了するまで生き残りたい。 – 0xb055

+0

ちょっと試してみてはいかがですか?とにかく、新しいスレッドがターゲットプロセスに属し、作成プロセスには属さないため、これは存続するはずです。 – zvrba

+0

@ 0xb055:CreateRemoteThreadは、この別のプロセスが新しいスレッドの所有者であるなど、別のプロセスでスレッドを作成します。スレッドハンドル以外の2つのプロセス間の接続を意味するものではなく、単独では何もしません。 – jweyrich

0

な「Winject(CreateRemoteThreadを呼び出し、1)ターゲットプロセスが終了するまで残っているスレッドを作成することは非常に容易であるDLLインジェクションローダーを使用して

ちょうど関数内でスレッドを作成します。

void run_thread(void* ass) 
{ 
    // do stuff until process terminates 
} 
BOOL APIENTRY DllMain(HMODULE hModule, DWORD result, LPVOID lpReserved) 
{ 
    HANDLE handle = (HANDLE)_beginthread(run_thread, 0, 0); 
} 

に関して、 マイケル

0

確かに、しかし、あなたはまた、リモートプロセスに全体の機能を注入する。(例えば機能)プロセスにリモートスレッドのためにコードを挿入する必要があります関数のサイズを決定する明確な方法がないため、痛みです。この方法は、注入されたコードが小さかった場合にはるかに効果的です。その場合は、短いアセンブリスタブを挿入してCreateRemoteThreadを呼び出します。

本当に、まさにまっすぐなDLL注入でこれをする利点は何でしょうか?あなたの「ハートビート」機能は、注入されたDLLと同じように簡単に実装できます。 (かなりのオーバーヘッドがあると私に教えない限り)

0

問題は、コードをプロセスに挿入しても、注入されたコードの先頭にスレッドを作成しない限り、それでも実行されません。通常、コードを注入するには、完全なDLLを注入します。 DLLを注入する一般的な方法の一つがあるに:

  • がターゲットプロセス(EnumProcesses、CreateTool32Snapshot/Process32First/Process32Next、FindWindowを/ GetWindowThreadProcessId/OpenProcessなど)
  • がターゲットプロセスでメモリを割り当てるためにハンドルを取得します。 (VirtualProgramMemory)
  • LoadLibraryルーチンでリモートスレッドを作成します。 GetModuleHandle/GetProcAddressでアドレスを取得)、割り当てられたmにポインタを渡すパラメータ(CreateRemoteThread)
  • としてエモリーリリース割り当てられたメモリ(VirtualFreeEx)
  • は、あなたがしたい特別な理由がない限り任意のハンドル(CloseHandleを持つなど、プロセスハンドル、スナップショットハンドル、)

を開け閉めこの方法を避けるには、コードを自分でコピーすること(WriteProcessMemoryと恐らくページ保護(VirtualProtectEx)を設定すること)がはるかに好ましい方法です。ライブラリをロードせずに、変数を手動でマップし、関数ポインタとLoadLibraryが行う他のすべての作業を再配置する必要があります。

以前はCreateRemoteThreadのセマンティクスについて尋ねました。それは自分自身を終了するか、何か他のものが終了するまで(TerminateThreadを呼び出すか、プロセスが終了してExitProcessを呼び出すなど)、別のプロセスでスレッドを作成します。スレッドは、正当に作成されたスレッドと同じ方法で(コンテキストの切り替え)並列に実行されます。

0

RtlCreateUserThread関数を使用して、リモートスレッドを作成することもできます。

関連する問題