Какое использование AdjustTokenPrivileges в KB131065 является правильным? - PullRequest
1 голос
/ 25 августа 2010

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 для обнаружения успеха и неудачи.

1 Ответ

1 голос
/ 25 августа 2010

Я всегда использовал второй пример.

Я ничего не вижу в первом примере.Это имело бы смысл, скажем, для функций GetWindowLong\SetWindowLong, но для привилегий просто не существует постоянных настроек, которые можно было бы объединить, и поэтому потребовалось бы получить предыдущее состояние.

И да, они фактически отключаютпривилегия для получения его текущего состояния, что неверно.
С другой стороны, в MSDN, к сожалению, много кусочков ужасного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...