793

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

Здравствуйте! История началась с того, что появилась необходимость написать "неубиваемый" процесс под 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. Но как водиться - от теории до практики очень не лёгкий путь - и как следсвие возник сей вопрос. Есть код:[code]...//Initialize simple ACL wich will be used to setup process DACLPACL 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 everyoneEXPLICIT_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 ACLSetEntriesInAcl(1, &lExplicitAcessForEveryone, NULL, &lProcessDACL);//Setting up current process DACL security informationSetSecurityInfo(GetCurrentProcess(), SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, lProcessDACL, NULL);...[/code]Этот самый код призван запретить любой доступ к информации процесса при любых условиях всем кому ни попади. Как вариант можно делать вместо/вместе с последним SetSecurityInfo(...) следующий вызов:[code]...SetSecurityInfo(GetCurrentThread(), SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, lProcessDACL, NULL);...[/code]Соответсвенно данный код должен запрещать доступ к информации текущего потока.Всё компилиться, обработку ошибок я убрал из привидённого кода дабы его не загромождать - но она присутсвует и на этапе выполнения логи показывают что все вызовы нормально отработали. Но после всего из соседнего процесса я могу подключиться к процессу выполневшему этот код, и даже вижу что в ACL его SD всего одна запись ... угадайте какая ;) и при всём при этом я могу этот процесс хоть ногами пинать ... Сие поведение системы мне не понятно, и вот за разъяснениями к Вам и обращаюсь ... поможите кто чем может :)Заранее - огромное спасибо.
0