· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Как противостоять TerminateProcess

<< . 1 . 2 . 3 . 4 . >>

Посл.отвђт Сообщен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()

<< . 1 . 2 . 3 . 4 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.107