プログラムの 1 つが、サービスである別のプログラムを呼び出そうとしOpenProcess
ます。最初のプログラムは、ローカルの管理者アカウントまたは管理者グループの別のメンバーとして実行されており、サービスは SYSTEM ユーザーとして実行されています。
少なくとも 1 つの環境 (ただしすべてではない) で、への呼び出しが でOpenProcess
失敗することがわかりましたERROR_ACCESS_DENIED
。さらに、 を使用して特権AdjustTokenPrivileges
を取得すると、成功することがわかりました。以下のプログラムを使用して動作を再現しました。失敗した環境は Windows 8.1 を実行していますが、成功したシステムが実行されているものはわかりません。SE_DEBUG_NAME
OpenProcess
プログラムが要求する唯一のアクセス許可はPROCESS_QUERY_LIMITED_INFORMATION
(最終的に を呼び出すためQueryFullProcessImageName
) です。私が読んだことのあるものは、そのためにデバッグ権限が必要であることを示唆してPROCESS_VM_READ
いPROCESS_ALL_ACCESS
ません。
私は保護されたプロセスについて読んだことがあります.私が対象としているサービスは保護されたプロセスとして指定されていませんが、ドキュメントには、保護されたPROCESS_QUERY_LIMITED_INFORMATION
プロセスに付与することを禁じられているアクセス許可の中にはない.
元の呼び出しがOpenProcess
失敗するのはなぜですか? また、デバッグ権限によって違いが生じるのはなぜですか?
#include <Windows.h>
#include <iostream>
#include <sstream>
#include <string>
int main(int argc, char* argv[])
{
std::istringstream pid_s(argv[1]);
DWORD pid;
pid_s >> pid;
bool debug = !!argv[2];
if (debug) {
TOKEN_PRIVILEGES NewState;
NewState.PrivilegeCount = 1;
if (!LookupPrivilegeValue(nullptr, SE_DEBUG_NAME, &NewState.Privileges[0].Luid)) {
std::clog << "Could not acquire debug-privilege name: " << GetLastError() << "\n";
return EXIT_FAILURE;
}
HANDLE token;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token)) {
std::clog << "Could not acquire process token: " << GetLastError() << "\n";
return EXIT_FAILURE;
}
NewState.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(token, FALSE, &NewState, sizeof(NewState), nullptr, nullptr)) {
std::clog << "Could not enable debug privilege: " << GetLastError() << "\n";
return EXIT_FAILURE;
}
std::clog << "Acquired debug privilege\n";
} else {
std::clog << "Not acquiring debug privilege\n";
}
HANDLE proc = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, pid);
if (proc) {
std::clog << "Acquired process handle\n";
CloseHandle(proc);
return EXIT_SUCCESS;
} else {
std::clog << "Failed to acquire process handle: " << GetLastError();
return EXIT_FAILURE;
}
}