4

プログラムの 1 つが、サービスである別のプログラムを呼び出そうとしOpenProcessます。最初のプログラムは、ローカルの管理者アカウントまたは管理者グループの別のメンバーとして実行されており、サービスは SYSTEM ユーザーとして実行されています。

少なくとも 1 つの環境 (ただしすべてではない) で、への呼び出しが でOpenProcess失敗することがわかりましたERROR_ACCESS_DENIED。さらに、 を使用して特権AdjustTokenPrivilegesを取得すると、成功することがわかりました。以下のプログラムを使用して動作を再現しました。失敗した環境は Windows 8.1 を実行していますが、成功したシステムが実行されているものはわかりません。SE_DEBUG_NAMEOpenProcess

プログラムが要求する唯一のアクセス許可はPROCESS_QUERY_LIMITED_INFORMATION(最終的に を呼び出すためQueryFullProcessImageName) です。私が読んだことのあるものは、そのためにデバッグ権限が必要であることを示唆してPROCESS_VM_READPROCESS_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;
    }
}
4

0 に答える 0