|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Апр 23, 2004 11:42:13 Уверен. |
|
|
Дата: Апр 23, 2004 14:45:11 Раз никто мне не может нормально объяснить как же всё-таки изменить SecurityDescriptor, а в сети что-то я такой инфы не нахожу, то придется пытаться ставить хук подменой кода API OpenProcess, что есть не лучший выход судя по написанному у Рихтера.. |
|
|
Дата: Апр 23, 2004 15:08:27 · Поправил: RobinFood Так ты все это время просто ждал готового кода? :-0 Вместо того, чтобы переделать для себя тот код, который тебе дали? :-0 Тогда уточни, что именно тебе непонятно? На всякий случай вкратце повторю все вышесказанное и добавлю чуть-чуть отсебятины. Тебе нужно вызвать SetSecurityInfo, куда передать "правильно заполненный" DACL. Есть несколько способов заполнить этот самый DACL, я для этого пользовался (мне этот вариант показался самым простым) функцией ConvertStringSecurityDescriptorToSecurityDescriptor. Ты в эту функцию передаешь строку с "псевдо-кодом" прав доступа, а она тебе возвращает уже заполненный DACL. Вот тебе пример такой строки (пишу по памяти, поэтому могу где-то опечататься): "O:WDG:WDD:(D;;GA;;;WD)". Краткое объяснение этой строки. O: - Owner G: - Group задают владельца и группу. Так как нам ни то, ни то устанавливать не надо, можно задать что угодно. В данном случае устанавливается WD, т.е. WORLD (everyone). D: - DACL В скобках задается куча параметров, разделенных точкой с запятой. Если параметр необязателен, то его можно опустить. Я использовал следующие параметры D - Disable GA - GenericAll WD - World В результате теоретически к твоему процессу будет запрещен (Disable) любой (GenericAll) доступ для всех (World). Практически - например, хуки работать будут. Да и описанный раньше метод с перехватом прав тоже сработает... Если что-то непонятно - давай конкретные вопросы. |
|
|
Дата: Апр 23, 2004 16:40:06 Вот с заполнением структуры как раз и проблема, т.к. многие атрибуты не понятны, не понятно также какой SecurityDescriptor имеет процесс по умолчанию ;-) Хотелось бы сделать так: 1) GetSecurityInfo 2) потом выбить из полученных атрибутов PROCESS_TERMINATE 3) SetSecurityInfo |
|
|
Дата: Апр 23, 2004 17:14:45 · Поправил: Asterix т.е. где то место в этой DACL чтоб можно было сделать xor его:-), PROCESS_TERMINATE ?? |
|
|
Дата: Апр 23, 2004 17:16:44 Ага, ясно. Учти, что структура недокументирована, зато документированы функции для работы с ней. Сделай так: GetSecurityInfo ConvertSecurityDescriptorToStringSecurityDescriptor здесь посмотри, какие атрибуты уже есть. Если какой-то атрибут непонятен, давай его сюда, посмотрим :) потом измени полученную строку, и уже дальше ConvertStringSecurityDescriptorToSecurityDescriptor SetSecurityInfo В предыдущем сообщении я не указал одну важную деталь: может быть несколько групп скобок (ACE-строк), например, так: "G:WDO:WDD:(A;;GA;;;WD)(D;;GA;;;AU)" Владельца и группу мы игнорируем. Еще два сокращения, о которых я пока не писал: A - Allowed AU - AuthenticatedUsers. Итого, доступ запрещен юзерам, и разрешен всем остальным (у запрета приоритет над разрешением). Ты хочешь установить правило для всех. "Все" - это World, WD. Значит, твоя задача - проверить, есть ли в какой-то из ACE-строк (последним элементом) сокращение WD. Если нет нигде - ты просто добаляешь новую ACE-строку, в которой последним элементом будет WD. Если где-то есть, смотришь, разрешен ли доступ (что в первом элементе - A или D). Если D - тебе нужно изменить эту ACE-строку, добавить в нее запрет. Если A - нужно изменить эту ACE-строку, убрать из нее разрешение. Если вдруг есть и то, и то (в разных ACE-строках) - нужно исправить обе. И теперь самое интересное. Как задать запрет/разрешение на убиение? Права, которые тебе вернет ConvertSecurityDescriptorToStringSecurityDescriptor, будут заданы не в виде сокращения (например, "GA"), а в виде битовой маски (например, "0x1f0fff"). Тебе нужно преобразовать эту строку в число, наложить на полученное число флаг PROCESS_TERMINATE, который численно равен 0x1 (т.е. для добавления флага нужно сделать OR число, 0x1, а для убирания AND число, 0xFFFFFFFE), и преобразовать полученное число обратно в такую же строку. P.S. Чувствую, что написал невнятно, поэтому если сам не разберешься, давай полученную строку, и посмотрим, что с ней сделать. P.P.S. И учти, что после D:(...)(...)...(...) может еще идти S:(...) - что с ним делать, я пока не в курсе, так что лучше его просто не трогать. |
|
|
Дата: Апр 23, 2004 17:17:15 · Поправил: RobinFood Да-а-а, вот это я торможу :) Действительно, можно вместо OR x, 1 и AND x, FFFFFFFE сделать просто XOR x,1 :) |
|
|
Дата: Апр 23, 2004 17:27:20 А как правильно? можно: and x, not PROCESS_TERMINATE или xor x, PROCESS_TERMINATE Зы: пошёл в 2k кодить получать строку дескриптора ;-) |
|
|
Дата: Апр 23, 2004 17:39:10 Если будет (A;;0xXXXXXXXX;;;WD), то надо AND x, not PROCESS_TERMINATE, если (D;;0xXXXXXXXX;;WD), то надо OR x, PROCESS_TERMINATE, ну, а если строки WD не будет вообще, тогда ты будешь создавать свою строку, и делать просто MOV x, PROCESS_TERMINATE. гм... я вот тут подумал... можно (и даже, пожалуй, так будет лучше) делать AND/OR не только для WD, но и для всех остальных. А WD с единственным флагом создавать в любом случае, независимо от того, есть ли оно уже, или еще нет. Кстати, тогда XOR лучше вообще не делать, чтобы не получилось так, что у кого-то прав и так не было, а ты, пытаясь их отобрать, случайно их подарил :) |
|
|
Дата: Апр 23, 2004 18:34:23 RobinFood Посмотри, я тут в параметрах не ошибся. И ещё ты случайно не знаешь чему равно SDDL_REVISION_1 ? .DATA? sd SECURITY_DESCRIPTOR <> Dacl ACL <> StringSecurityDescriptor db 256 dup (?) .CODE invoke GetCurrentProcess invoke GetSecurityInfo, eax, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, OFFSET Dacl, NULL, OFFSET sd cmp eax, ERROR_SUCCESS jne @F invoke ConvertSecurityDescriptorToStringSecurityDescriptor, OFFSET sd, SDDL_REVISION_1, DACL_SECURITY_INFORMATION, OFFSET StringSecurityDescriptor, NULL invoke LocalFree, OFFSET sd @@: |
|
|
Дата: Апр 23, 2004 18:51:26 По-моему, ошибся, и даже не один раз. Даже не столько в параметрах, сколько в их типах. SDDL_REVISION_1 equ 1 .DATA? pSD dd ? pDacl dd ? pStringSecurityDescriptor dd ? .CODE invoke GetCurrentProcess invoke GetSecurityInfo, eax, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, OFFSET pDacl, NULL, OFFSET pSD cmp eax, ERROR_SUCCESS jne @F invoke ConvertSecurityDescriptorToStringSecurityDescriptor, pSD, SDDL_REVISION_1, DACL_SECURITY_INFORMATION, OFFSET pStringSecurityDescriptor, NULL invoke LocalFree, pSD invoke LocalFree, pStringSecurityDescriptor По-моему, так. P.S. Кстати да! GetCurrentProcess всегда возвращает "псевдохэндл", равный INVALID_HANDLE_VALUE. Так что пользуйся либо OpenProcess, либо DuplicateHandle, на твой выбор. |
|
|
Дата: Апр 23, 2004 19:20:22 Кстати да! GetCurrentProcess всегда возвращает "псевдохэндл", равный INVALID_HANDLE_VALUE. Так что пользуйся либо OpenProcess, либо DuplicateHandle, на твой выбор. А зачем, разве GetCurrentProcess будет не достаточно? Мда, а вот с поинтерами поинтеров я действительно запутался.. |
|
|
Дата: Апр 23, 2004 19:24:46 А это ты скоро узнаешь :) Если GetSecurityInfo свалится :) fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdoutRd,
GetCurrentProcess(), &hChildStdoutRdDup , 0,
FALSE,
DUPLICATE_SAME_ACCESS);
if( !fSuccess )
ErrorExit("DuplicateHandle failed");
|
|
|
Дата: Апр 23, 2004 20:45:17 Скомпилил, прогнал код под отладчиком, но что-то искомую строку, которая должна получиться я не заметил, какой-то набор байт.. volodya В смысле, как свалится? |
|
|
Дата: Апр 23, 2004 20:49:34 В смысле: If the function succeeds, the return value is ERROR_SUCCESS. If the function fails, the return value is a nonzero error code defined in Winerror.h. Т.е. если при прогоне под отладчиком тебе эта функция вернула бяку, то одна из возможных причин - это GetCurrentProcess() |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.107 |