0

「codecave」手法を使用してコードを別のプロセスに挿入する。コードを挿入して新しいスレッドを作成し (また、新しいスレッドのコードを挿入し)、そのスレッドをターゲット プロセスのメイン スレッドと並行して実行することは可能ですか?

これは dll インジェクションで管理できますが、純粋なコード インジェクションだけで可能かどうかを知りたいです。

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

ありがとう。

4

5 に答える 5

0

CreateRemoteThread関数があります。

于 2011-02-04T08:30:19.590 に答える
0

問題は、コードをプロセスに挿入しても、挿入されたコードの先頭にスレッドを作成しない限り、実行されないことです。通常、コードインジェクションを行うには、完全なDLLをインジェクションします。DLLを挿入する一般的な方法の1つは、次のとおりです。

  • ターゲットプロセスへのハンドルを取得します(EnumProcesses、CreateTool32Snapshot / Process32First / Process32Next、FindWindow / GetWindowThreadProcessId / OpenProcessなど)
  • DLLのパスを指す文字列と同じ長さのメモリをターゲットプロセスに割り当てます(VirtualAllocEx)
  • この割り当てられたメモリへのDLLのパスを指す文字列を書き込みます(WriteProcessMemory)
  • LoadLibraryルーチンでリモートスレッドを作成し(GetModuleHandle / GetProcAddressでアドレスを取得)、割り当てられたメモリへのポインターをパラメーターとして渡します(CreateRemoteThread)
  • 割り当てられたメモリを解放します(VirtualFreeEx)
  • 開いているハンドルをすべて閉じます(CloseHandleを使用してプロセスハンドル、スナップショットハンドルなど)

この方法を避けたい特別な理由がない限り、コードを自分でコピーすることをお勧めします(WriteProcessMemoryおよびおそらくページ保護の設定(VirtualProtectEx))。ライブラリをロードせずに、変数を手動でマップし、関数ポインターを再配置し、LoadLibraryが行う他のすべての作業を行う必要があります。

CreateRemoteThreadのセマンティクスについては前に質問しました。別のプロセスにスレッドを作成し、それ自体が終了するか、他の何かが実行するまで続行します(誰かがTerminateThreadを呼び出すか、プロセスが終了してExitProcessを呼び出すなど)。スレッドは、合法的に作成されたスレッドと同じように並列実行されます(コンテキスト切り替え)。

于 2011-08-08T20:53:39.020 に答える
0

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

于 2013-09-21T07:35:52.833 に答える
0

もちろんですが、リモート スレッドのコードをプロセス (関数など) に挿入する必要もあります。関数のサイズを決定する明確な方法がないため、関数全体をリモート プロセスに挿入するのは面倒です。挿入されたコードが小さい場合、このアプローチははるかに効果的です。その場合、短いアセンブリ スタブを挿入してから、CreateRemoteThread を呼び出します。

とはいえ、単純な DLL インジェクションと比較して、これを行う利点は何でしょうか? 「ハートビート」機能は、注入された DLL を使用して簡単に実装できます。(かなりのオーバーヘッドがあると誰かが私に言わない限り?)

于 2011-08-08T20:05:36.750 に答える
0

「Winject (CreateRemoteThread を呼び出すもの)」などの 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);
}

よろしく、マイケル

于 2011-08-08T19:57:04.903 に答える