0

プロセスの終了を停止する場合、1つの方法は、TerminateProcess(またはNtTerminateProcess)にフックすることです。プロセスがそれ自体を終了している場合(たとえば、ウィンドウを閉じたため)、これらの関数に提供されるハンドルはNULLであるため、GetCurrentProcess()およびGetModuleFileNameEx()を使用して終了している実行可能ファイルを確認できます。GetCurrentProcess()は疑似ハンドルを返すため、問題なくアクセスできます。

ただし、あるプロセスが別のプロセスを終了している場合、提供されたハンドルはNULLではありません。終了するプロセスを表します。問題は、そのプロセスに関する情報を取得できないことです。元の[Nt]TerminateProcess()を呼び出す代わりに、「アクセスが拒否されました」というコードを返すだけで済みますが、そのブランケットにより、すべてのプロセスが他のプロセスを終了できなくなります。これは悪い考えです。

ハンドルは有効なものを表す必要があります。そうでない場合、TerminateProcessはそれを使用して有用なことを実行できません。ただし、GetProcessId()を呼び出すこともできず、ERROR_INVALID_HANDLE(またはERROR_ACCESS_DENIED)を取得します。ヘルプやオンラインから収集したさまざまなメソッドを試しました。たとえば、デバッグ権限(成功)、DuplicateHandle()(同じエラー)、ZwQueryInformationProcess()を取得してID(STATUS_ACCESS_DENIED)を取得するなどです。プロセスはIDを返すため、プロセスを列挙することすらできません。また、IDを取得できません。また、OpenProcess()は常に新しいハンドルを返すため、ハンドルを比較できません。

ハンドルにはPROCESS_TERMINATE権限があり、他には何もないと想定できます。Vista以降では、デジタル著作権管理によってプロセスが保護されていることは知っていますが、モルモットとしてProcessExplorerを使用しているため、メディアアプリケーションではありません。

このハンドルから終了するプロセスに関するあらゆる種類の情報を他にどのように取得できるかを誰かが知っていますか?

4

1 に答える 1

1

これは、通常のプロセス ハンドルです。問題は、フック関数がどのプロセスで実行されているかです。呼び出しプロセスの場合、ハンドルはそのまま GetProcessId または NtQueryInformationProcess に使用できます。そうでない場合は、DuplicateHandle を呼び出してハンドルをプロセスに複製する必要があります。

アクセス拒否エラーが発生する場合は、プロセス ハンドルに PROCESS_TERMINATE アクセス権しかないことが原因である可能性があります。その場合、DuplicateHandle を使用して、PROCESS_QUERY_(LIMITED_)INFORMATION アクセスでプロセスを「再開」します。

于 2010-11-07T11:45:24.067 に答える