KB131065 демонстрирует, как активировать SeDebugPrivilege, чтобы открыть дескриптор любого процесса. У него есть функция с именем SetPrivilege
, которая вызывает AdjustTokenPrivileges
, но есть две реализации и не упоминается почему.
Первая реализация вызывает ATP в два прохода:
//
// first pass. get current privilege setting
//
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(
hToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES),
&tpPrevious,
&cbPrevious
);
if (GetLastError() != ERROR_SUCCESS) return FALSE;
//
// second pass. set privilege based on previous setting
//
tpPrevious.PrivilegeCount = 1;
tpPrevious.Privileges[0].Luid = luid;
if(bEnablePrivilege) {
tpPrevious.Privileges[0].Attributes |= (SE_PRIVILEGE_ENABLED);
}
else {
tpPrevious.Privileges[0].Attributes ^= (SE_PRIVILEGE_ENABLED &
tpPrevious.Privileges[0].Attributes);
}
AdjustTokenPrivileges(
hToken,
FALSE,
&tpPrevious,
cbPrevious,
NULL,
NULL
);
Это похоже на излишество. Я не вижу в документации ничего, что указывало бы на то, что поля Attributes
параметра предыдущего состояния получают какие-либо дополнительные флаги, которые необходимо сохранить. Больше похоже на то, что этот код начинается с , отключая привилегию, а затем возвращается и либо повторно включает, либо отключает ее снова. Я правильно истолковал это? Другие рекомендуют эту технику?
Вторая реализация SetPrivilege
выглядит больше, чем я ожидал:
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if(bEnablePrivilege) {
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
} else {
tp.Privileges[0].Attributes = 0;
}
AdjustTokenPrivileges( hToken, FALSE, &tp, cb, NULL, NULL );
Вторая версия упрощена? Я заметил, что по сути это то же самое, что продемонстрировано в Включение и отключение привилегий в C ++ , за исключением того, что в статье базы знаний игнорируется возвращаемое значение API и идет непосредственно к GetLastError
для обнаружения успеха и неудачи.