Безопасность процессов и потоков в Windows

Модератор: Злобный

Ответить
OldPirateSilver
Новичок
Сообщения: 1
Зарегистрирован: Сб апр 15, 2006 22:46

Безопасность процессов и потоков в Windows

Сообщение OldPirateSilver »

Здравствуйте!

История началась с того, что появилась необходимость написать "неубиваемый" процесс под Win32NT/2000/XP/2003 - на вроде поведения продукта Касперского 5 и 6 версии (в более ранних версиях такое поведение не замечено). Собсна процесс должен быть зашишён от TerminateProcess из любого доступного process explorer'а. (Прога есть основа IPC в проекте, а заодно ещё и инспектор выполнения и простенький маркер доступа). Вобщем варианты с двумя, кусками каждый из которых запускает другого при падении первого не канают - проблемы с синхронизацией, потеря буферных данных и прочее ... Перехватывать вызовы API функций также не хочеться, т.к. может быть расценено как попытка не санкционированного доступа и заблокировано. На сколько понимаю в антивирусе эта система построена за счёт качественного определения прав доступа (Process & Thread Security and Access Rights). Отталкиваясь от этого, решил написать код, который бы закрывал доступ к процессу и разрешал бы системе выгружать его, только в случае полной перезагрузки операционной системы. Базовые знание об этом процессе получил из MSDN и Windows System Programming Third Edition By Johnson M. Hart. Но как водиться - от теории до практики очень не лёгкий путь - и как следсвие возник сей вопрос.
Есть код:

Код: Выделить всё

...
//Initialize simple ACL wich will be used to setup process DACL
PACL lProcessDACL = NULL;
lProcessDACL = (PACL)LocalAlloc(LPTR, sizeof(ACL));
InitializeAcl(lProcessDACL, sizeof(ACL), ACL_REVISION);

//Creating well-known SID 'Everyone'
PSID lEveryoneSID = NULL;
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &lEveryoneSID);

//Produce ACE wich explicity deny any operation for everyone
EXPLICIT_ACCESS lExplicitAcessForEveryone;
ACCESS_MASK lAllRights = PROCESS_ALL_ACCESS; //PROCESS_TERMINATE;
ZeroMemory(&lExplicitAcessForEveryone, sizeof(EXPLICIT_ACCESS));
lExplicitAcessForEveryone.grfAccessPermissions = lAllRights;
lExplicitAcessForEveryone.grfAccessMode = DENY_ACCESS;
lExplicitAcessForEveryone.grfInheritance= CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE | SUB_CONTAINERS_AND_OBJECTS_INHERIT;
lExplicitAcessForEveryone.Trustee.TrusteeForm = TRUSTEE_IS_SID;
lExplicitAcessForEveryone.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
lExplicitAcessForEveryone.Trustee.ptstrName  = (LPTSTR)lEveryoneSID;

//Injecting produced ACE into prepared ACL
SetEntriesInAcl(1, &lExplicitAcessForEveryone, NULL, &lProcessDACL);

//Setting up current process DACL security information
SetSecurityInfo(GetCurrentProcess(), SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, lProcessDACL, NULL);
...
Этот самый код призван запретить любой доступ к информации процесса при любых условиях всем кому ни попади. Как вариант можно делать вместо/вместе с последним SetSecurityInfo(...) следующий вызов:

Код: Выделить всё

...
SetSecurityInfo(GetCurrentThread(), SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, lProcessDACL, NULL);
...
Соответсвенно данный код должен запрещать доступ к информации текущего потока.

Всё компилиться, обработку ошибок я убрал из привидённого кода дабы его не загромождать - но она присутсвует и на этапе выполнения логи показывают что все вызовы нормально отработали. Но после всего из соседнего процесса я могу подключиться к процессу выполневшему этот код, и даже вижу что в ACL его SD всего одна запись ... угадайте какая ;) и при всём при этом я могу этот процесс хоть ногами пинать ... Сие поведение системы мне не понятно, и вот за разъяснениями к Вам и обращаюсь ... поможите кто чем может :)

Заранее - огромное спасибо.
Ответить

Вернуться в «Программирование»