デバッグ特権
デバッグ特権を使用すると、他のユーザーがアクセスできないプロセスをデバッグできます。 たとえば、トークンでデバッグ特権が有効になっているユーザーとして実行されているプロセスは、ローカル システムとして実行されているサービスをデバッグできます。
デバッグ特権は、ユーザーがデバッガーをプロセスまたはカーネルにアタッチできるようにするセキュリティ ポリシー設定です。 管理者は、ユーザー グループのセキュリティ ポリシーを変更して、この機能を含めたり削除したりできます。 独自のアプリケーションをデバッグしている開発者には、このユーザー特権は必要ありません。 システム コンポーネントをデバッグしている開発者、またはリモート コンポーネントをデバッグしている開発者には、このユーザー特権が必要です。 このユーザー特権は、機密性の高い重要なオペレーティング システム コンポーネントへの完全なアクセスを提供します。 既定では、このプロパティは管理者権限を持つユーザーに対して有効になっています。 管理者特権を持つユーザーは、他のユーザー グループに対してこのプロパティを有効にすることができます。
プロセスのデバッグ特権の変更
次のコード例は、プロセスでデバッグ特権を有効にする方法を示しています。 これにより、アクセスできない他のプロセスをデバッグできます。
//
// 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);
}