CreateProcess()
withを使用してプロセスを作成し、リモート プロセス内に小さなコード パッチを作成して DLL をロードし、関数(CREATE_SUSPENDED
その DLL によってエクスポートされた) を呼び出します。コードで。VirtualAllocEx()
..., MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE
WriteProcessMemory()
FlushInstructionCache()
その後、CreateRemoteThread()
呼び出してそのコードを呼び出し、hRemoteThread
. リモート コードが意図したとおりに動作することを確認しました。注:LoadLibrary()
このコードは単純に戻ります。と以外の API は呼び出しませんGetProcAddress()
。その後、エクスポートされたスタブ関数を呼び出します。この関数は、現在は単純に値を返し、スレッドの終了ステータスとして渡されます。
PROCESS_INFORMATION::hThread
ここで、奇妙な観察が行われます。 がまだ中断されていることを思い出してください。の終了コードを単に無視hRemoteThread
し、それが終了するのを待たない場合、すべてが「正常」になります。呼び出したルーチンがCreateRemoteThread()
戻っPROCESS_INFORMATION::hThread
て再開され、(リモート) プログラムが実際に実行されます。
ただし、次のことを呼び出すWaitForSingleObject(hRemoteThread, INFINITE)
か実行すると(同じ効果があります):
DWORD exitCode = STILL_ACTIVE;
while(STILL_ACTIVE == exitCode)
{
Sleep(500);
if(!GetExitCodeThread(hRemoteThread, &exitCode))
break;
}
これが続くと、再開される前CloseHandle()
に終了し、プロセスは単に「消えます」。プロセスを停止させずに何とか終了させれば十分です。hRemoteThread
PROCESS_INFORMATION::hThread
hRemoteThread
PROCESS_INFORMATION::hThread
これは、競合状態のように疑わしく見えます。コードをそのままにしても、特定の状況下でhRemoteThread
はまだ高速であり、プロセスが「消える」可能性が高いからです。
これは、プロセス内で最初に実行されるスレッドが自動的にプライマリ スレッドになり、そのプライマリ スレッドには特別なルールがあることを意味するのでしょうか?
特定のスレッドが終了したときではなく、最後のスレッドが終了したときにプロセスが終了するという印象を常に受けていました。
また、注意してください:単純に戻り、戻るのを待っている間はまだ中断されているExitProcess()
ため、ここに関与する呼び出しはありません。hRemoteThread
PROCESS_INFORMATION::hThread
hRemoteThread
これは、Windows XP SP3、32 ビットで発生します。
編集: Sysinternals Process Monitor を試して何が起こっているのかを確認したところ、以前からの観察結果を確認できました。挿入されたコードはクラッシュなどしません。代わりに、コードが挿入されたプログラムを閉じる前に、スレッドを待機しないとスレッドが終了しないことがわかります。への電話をCloseHandle(hRemoteThread)
延期するか何か考えています...
編集 + 1:ではありませんCloseHandle()
。テストのためだけにそれを省略した場合、スレッドが終了するのを待っているときの動作は変わりません。