Предотвращение уничтожения пользовательского процесса с помощью «End Process» из Process Explorer - PullRequest
17 голосов
/ 31 мая 2011

Я заметил, что GoogleToolbarNotifier.exe нельзя убить из Process Explorer.Возвращает «Отказано в доступе».Он запускается как пользователь, запускает приоритет «Обычный» и запускается из Program Files.

Как они это сделали?

Я думаю, что может быть способ изменить ACL,или пометить процесс как «критический», но я не могу ничего найти.

Обновление:

Я нашел ответ с хорошим анализом.@ Алекс К. был прав в том, что разрешение PROCESS_TERMINATE было удалено для процесса, но я хотел предоставить ответ в коде:

static const bool ProtectProcess()
{
    HANDLE hProcess = GetCurrentProcess();
    EXPLICIT_ACCESS denyAccess = {0};
    DWORD dwAccessPermissions = GENERIC_WRITE|PROCESS_ALL_ACCESS|WRITE_DAC|DELETE|WRITE_OWNER|READ_CONTROL;
    BuildExplicitAccessWithName( &denyAccess, _T("CURRENT_USER"), dwAccessPermissions, DENY_ACCESS, NO_INHERITANCE );
    PACL pTempDacl = NULL;
    DWORD dwErr = 0;
    dwErr = SetEntriesInAcl( 1, &denyAccess, NULL, &pTempDacl );
    // check dwErr...
    dwErr = SetSecurityInfo( hProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pTempDacl, NULL );
    // check dwErr...
    LocalFree( pTempDacl );
    CloseHandle( hProcess );
    return dwErr == ERROR_SUCCESS;
}

Ответы [ 3 ]

10 голосов
/ 14 мая 2012

Код, указанный в вопросе, вводит в заблуждение.Он создает DACL без разрешенных записей и одной запрещенной записи;это может иметь смысл, если вы применяете DACL к файлу с включенным наследованием, но в этом случае запрещающая запись является избыточной.В модели управления доступом Windows, если DACL существует, но не содержит соответствующих ACE, доступ неявно запрещен .

Вот моя версия, в которой применяется пустой DACL, запрещающий любой доступ.(Обратите внимание, что он возвращает код ошибки, а не логическое значение.)

DWORD ProtectProcess(void)
{
    HANDLE hProcess = GetCurrentProcess();
    PACL pEmptyDacl;
    DWORD dwErr;

    // using malloc guarantees proper alignment
    pEmptyDacl = (PACL)malloc(sizeof(ACL));

    if (!InitializeAcl(pEmptyDacl, sizeof(ACL), ACL_REVISION))
    {
        dwErr = GetLastError();
    }
    else
    {
        dwErr = SetSecurityInfo(hProcess, SE_KERNEL_OBJECT, 
                   DACL_SECURITY_INFORMATION, NULL, NULL, pEmptyDacl, NULL);
    }

    free(pEmptyDacl);
    return dwErr;
}
9 голосов
/ 31 мая 2011

При запуске моей копии, для которой установлено Запретить в разрешении Завершить (Process Explorer показывает это).

Предположительно, они вызывают SetKernelObjectSecurity для изменения / удаления ACL при загрузке их процесса.

0 голосов
/ 12 сентября 2013

Я попытался сделать это с помощью написания служб Windows .., а затем внести некоторые изменения

вот ссылка, чтобы написать простую службу Windows http://code.msdn.microsoft.com/windowsdesktop/CppWindowsService-cacf4948

, и мыможет обновить файл Servicabase.cpp с помощью следующих двух операторов:

fCanStop = FALSE;fCanShutdown = FALSE;

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