Ответ 1
При запуске моей копии того, что имеет Deny, установленного в разрешении Terminate (Process Explorer показывает это).
Предположительно, они вызывают SetKernelObjectSecurity
для изменения/удаления списков ACL при загрузке процесса.
Я заметил, что GoogleToolbarNotifier.exe нельзя убить из Process Explorer. Он возвращает "Access Denied". Он работает как пользователь, он выполняет "Обычный" приоритет и запускается из программных файлов.
Как они это сделали?
Я думаю, что может быть способ изменить ACL или отметить процесс как "критический", но я не могу найти что-либо.
Update:
Я нашел ответ с хорошей рытью. @Alex K. был прав в том, что для процесса было удалено разрешение 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;
}
При запуске моей копии того, что имеет Deny, установленного в разрешении Terminate (Process Explorer показывает это).
Предположительно, они вызывают SetKernelObjectSecurity
для изменения/удаления списков ACL при загрузке процесса.
Код, заданный в вопросе, вводит в заблуждение. Он создает DACL, не допускающий ввода, и одну запретную запись; это может иметь смысл, если вы применяете DACL к файлу с включенным наследованием, но в этом случае запись deny является избыточной. В модели контроля доступа 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;
}
Я попытался сделать это с помощью записи служб windows.. и затем внести некоторые изменения
вот ссылка, чтобы написать простую службу Windows http://code.msdn.microsoft.com/windowsdesktop/CppWindowsService-cacf4948
и мы можем обновить файл Servicabase.cpp со следующими двумя утверждениями.
fCanStop = FALSE; fCanShutdown = false;