Может тогда как вариант хучить NtTerminateProcess и выключать принудительно перед этим SeDebugPrivilege и затем возвращать обратно какая была? потому что в local group policy по умолчанию группе администраторов разрешено запрашивать эту привилегию. правда весь смысл теряется в таком случае с правами раз хук ставим.
Я думаю буду копать в сторону хуков. Есть еще один вопрос по схожей теме. Нужно поменять права для сервиса, т.е чтобы отключить возможность останавливать\перезапускать и менять режим запуска. Как я понял подход тот же: создаем DALC, добавляем в него правила и добавлем новые DALC в сервис. Для обновления DALC я использую SetSecurityInfo(), но после этого с сервисом вообще ничего нельзя сделать, при любых действиях возвращает "Отказоно в доступе". Приходится руками лезть в реестр, искать сервис и грохать ключ security. Вот код заполнения ACE Код (Text): if (!AddAccessDeniedAce( lpDacl, // адрес DACL ACL_REVISION, // версия DACL SERVICE_STOP|SERVICE_CHANGE_CONFIG, lpSd)) // адрес SID { dwRetCode = GetLastError(); perror("Add access denied ace failed.\n"); printf("The last error code: %u\n", dwRetCode); getchar(); return dwRetCode; } if (!AddAccessAllowedAce( lpDacl, // адрес DACL ACL_REVISION, // версия DACL SERVICE_ALL_ACCESS, lpSd)) // адрес SID { dwRetCode = GetLastError(); perror("Add access allowed ace failed.\n"); printf("The last error code: %u\n", dwRetCode); getchar(); return dwRetCode; } Вызов SetSecurityInfo Код (Text): SetSecurityInfo(hService,SE_SERVICE,DACL_SECURITY_INFORMATION,NULL,NULL,lpDacl,NULL)
я думаю всё просто. дело в том, что мы создаем новый список доступа для определенного SID. а ведь мы должны расширить старый список (скопировать разрешения и для других SID которые были) и добавить в него элемент запрета вот и весь сказ. либо самое простое решение - берем Well-known SID World S-1-1-0 (Everyone) в качестве параметра к lpSid и его проще всего сконвертить из строки через ConvertStringSidToSid и получаем Allow to Everyone SERVICE_ALL_ACCESS + Deny to Everyone SERVICE_STOP|SERVICE_CHANGE_CONFIG хотя тут все же надо похимичить чтобы не давать лишних разрешений всем пользователям
Защититься от администратора в общем случае невозможно. Только крутые программисты думают, что можно защитить администратора от администратора с помощью хуков. В остальных случаях почти всегда можно обойтись без хуков, правильно разработав модель. Насчет сервиса, в структуре SERVICE_STATUS.dwControlsAccepted можно манипулировать флажками SERVICE_ACCEPT_PAUSE_CONTINUE, SERVICE_ACCEPT_STOP. RTFM, в общем.
ну да, кстати. тоже решение и наверное самое верное. и по поводу хуков согласен и по поводу защититься в юзермоде от админа вообще.
хехе ... лично видел где-то в кишках толи lsasrv.dll толи samsrv.dll - if(!strncmpi(username, "Administrator")) ... ;')
Для юзермода можно покопать в сторону заданий (JobObject/JobObjectSecurityLimitInformation/JOB_OBJECT_SECURITY_NO_ADMIN)