デバッグ特権

デバッグ特権を使用すると、他のユーザーがアクセスできないプロセスをデバッグできます。 たとえば、トークンでデバッグ特権が有効になっているユーザーに実行されているプロセスは、ローカル システムとして実行されているサービスをデバッグできます。

デバッグ特権は、ユーザーがデバッガーをプロセスまたはカーネルにアタッチできるようにするセキュリティ ポリシー設定です。 管理者は、ユーザー グループのセキュリティ ポリシーを変更して、この機能を追加したり削除したりできます。 独自のアプリケーションをデバッグしている開発者には、このユーザー特権は必要ありません。 システム コンポーネントをデバッグしている開発者、またはリモート コンポーネントをデバッグしている開発者の場合は、このユーザー特権が必要です。 このユーザー特権は、機密性の高い重要なオペレーティング システム コンポーネントへのフル アクセスを提供します。 既定では、このプロパティは、管理者権限を持つユーザーに対して有効になっています。 管理者権限を持つユーザーは、他のユーザー グループに対してこのプロパティを有効にすることができます。

プロセスのデバッグ特権の変更

次のコード例は、プロセスでデバッグ特権を有効にする方法を示しています。 これにより、アクセスできない他のプロセスをデバッグできます。

//
//  SetPrivilege enables/disables process token privilege.
//
BOOL SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
    LUID luid;
    BOOL bRet=FALSE;

    if (LookupPrivilegeValue(NULL, lpszPrivilege, &luid))
    {
        TOKEN_PRIVILEGES tp;

        tp.PrivilegeCount=1;
        tp.Privileges[0].Luid=luid;
        tp.Privileges[0].Attributes=(bEnablePrivilege) ? SE_PRIVILEGE_ENABLED: 0;
        //
        //  Enable the privilege or disable all privileges.
        //
        if (AdjustTokenPrivileges(hToken, FALSE, &tp, NULL, (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL))
        {
            //
            //  Check to see if you have proper access.
            //  You may get "ERROR_NOT_ALL_ASSIGNED".
            //
            bRet=(GetLastError() == ERROR_SUCCESS);
        }
    }
    return bRet;
}

次の例は、 この関数の使用法を示しています。

HANDLE hProcess=GetCurrentProcess();
HANDLE hToken;

if (OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken))
{
    SetPrivilege(hToken, SE_DEBUG_NAME, TRUE);
    CloseHandle(hToken);
}