Запретить запись в ветку реестра

Тема в разделе "WASM.WIN32", создана пользователем RET, 26 фев 2011.

  1. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Приветствую. Может кто подскажет, как залочить ветку реестра на запись в неё, естественно программно. В основном интересует вариант с правами доступа (я в этом слабо соображаю). (Задача заключается в запрете установки LSP, которая сводится к блокировке на запись куста HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters).
     
  2. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    А что не в коммерс пишете? :)
     
  3. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Задача, подразумевается из чисто познавательного интереса, я же написал что не шарю в токенах и правах пользователей и т.п. Вот и хотелось бы подучиться на конкретике.
     
  4. felize

    felize New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    39
    можно через CmRegisterCallback. при обращении к вашей ветке реестра возвращайте access_denied
     
  5. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Я вроде не в ветку WASM.NT.KERNEL запостил. В r0 - методов больше, но интересует r3.
    Есть колбэки и юзермодные (RegNotifyChangeKeyValue), но и они не универсальны, поэтому предпочтительнее манипуляции с правами.
     
  6. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Начните отсюда
    http://msdn.microsoft.com/en-us/library/aa446654(v=VS.85).aspx
    Подробное описание установки дескрипторов безопасности, кажись, у Шрайбера было.
     
  7. Ltonid

    Ltonid New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2010
    Сообщения:
    3
    Я уже воевал в этой области, вот из рабочей проги. По порядку. Однако собирать рабочий код простите не буду, слишком много нюансов. Каменты по памяти.
    Код (Text):
    1. Указаны смещения функции (не экспортируемой) в библиотеке для разных виндей
    2.     ;XP
    3.     ACLUI_XP equ 0AC8h
    4.     ;Vista
    5.     ACLUI_VISTA equ 04F8h
    6.     ;Windows 7
    7.     ACLUI_WIN7 equ 04D8h
    8. сама библиотека
    9. ACLUIDLL db "ACLUI.DLL",0
    10.  
    11. VersionDefinition proc
    12.     CALL GetVersion
    13.     cmp al,5h
    14.     jz XP
    15.     cmp ax,0006h
    16.     jz VISTA
    17.     cmp ax,0106h
    18.     jz SEVEN
    19.     XP:
    20.     mov DWORD PTR [ACLUI_VER],ACLUI_XP
    21.     jmp OS_VER
    22.     VISTA:
    23.     jnz SEVEN
    24.     mov DWORD PTR [ACLUI_VER],ACLUI_VISTA
    25.     jmp OS_VER
    26.     SEVEN:
    27.     mov DWORD PTR [ACLUI_VER],ACLUI_WIN7
    28.     OS_VER:
    29.     push offset[ACLUIDLL]
    30.     CALL LoadLibraryA
    31.     ADD eax,1000h
    32.     ADD eax,DWORD PTR [ACLUI_VER]                   ; смещение функции
    33.     mov ebx,eax
    34.     mov eax, DWORD PTR [eax]
    35.     cmp DWORD PTR [eax],8B55FF8Bh
    36.     jnz exit
    37.     mov DWORD PTR [ACLUI_IMP],ebx
    38. VersionDefinition endp
    Код (Text):
    1. Функция получает и изменяет права, таким образом что отбирает права у админа и юзеров, оставляя у системы.
    2. REGPATCH proc
    3.  
    4.     invoke RegOpenKeyExA,KEY_KEY,ADDR KEYNUM,0,2000000h,ADDR KEY_HANDLE
    5.     cmp eax,2
    6.     jz bad_key
    7.    
    8.     invoke lstrlen,ADDR KEY_NUM
    9.     add eax,eax
    10.  
    11.     invoke MultiByteToWideChar,CP_ACP,MB_COMPOSITE,ADDR KEY_NUM,-1,ADDR KEY_WIDE_BUF,eax  - обязательно юникод
    12.  
    13.  
    14. Здесь лучше ниче не трогать ибо вырвано из регэдита в силу того что выше оговоренная функа не экспортируема
    15.     mov edi,offset[ACLUI_IMP]
    16.     push offset[SEC_BUF]
    17.     xor esi,esi
    18.     mov ebp,esp
    19.     add ebp,8
    20.     mov eax,ebp
    21.     add eax,0Ch
    22.     mov DWORD PTR DS:[eax],4h
    23.     push esi
    24.     push esi
    25.     push esi
    26.     push esi
    27.     push DWORD PTR SS:[ebp+0Ch]
    28.     push 4h
    29.     mov eax,offset[KEY_WIDE_BUF]
    30.     push eax
    31.     CALL GetNamedSecurityInfoW  
    32.  
    33.     cmp eax,5
    34.     jz DACL_bad
    35.     cmp eax,2
    36.     jz DACL_bad
    37.    
    38.     mov eax,DWORD PTR [SEC_BUF]
    39.     cmp BYTE PTR [eax],01
    40.     jnz DACL_bad
    41.    
    42.     go:
    43.     invoke RegGetKeySecurity,KEY_HANDLE,DACL_SECURITY_INFORMATION,0,ADDR DACL_SIZE  - получаем таблицу DACL для ВЕТКИ реестра
    44.  
    45.     CALL DACLpatch  - функция измененния права (описана ниже)
    46.     mov eax,DWORD PTR [SEC_BUF]
    47.     add eax,14h
    48.     mov ebx,DWORD PTR [DACL_SIZE]
    49.     push 0
    50.     push eax
    51.     push 0
    52.     push 0
    53.     mov eax,0B0000004h
    54.     push eax
    55.     push 4
    56.     push offset [KEY_WIDE_BUF]
    57.     mov edx,10000000h
    58.     mov esi,40000000h
    59.     mov edi,20000000h
    60.     CALL SetNamedSecurityInfoW     - сохраняем права
    61.    
    62.     DACL_bad:
    63.     push DWORD PTR [KEY_HANDLE]
    64.     CALL RegCloseKey
    65.     bad_key:
    66.     RETN
    67. REGPATCH endp
    Код (Text):
    1. DACLpatch proc
    2.     mov eax,DWORD PTR [SEC_BUF]     ;адрес данных
    3.     ADD eax,14h             ;смещение до данных
    4.     xor edx,edx             ;обнуление едх
    5.     mov ecx,DWORD PTR [DACL_SIZE]       ;размер данных
    6.     sub ecx,14h             ;уменьшение общего размера
    7.     mov edi,eax             ;кладем адрес данных в еди
    8.     mov eax,19h             ;поиск байта только чтение
    9. DP:
    10.     REPNE SCASB             ;поиск
    11.     cmp ecx,0               ;проверям кончились ли данные
    12.     jz DP_out               ;прыжок на выход
    13.     cmp BYTE PTR [edi+1],02h        ;проверям что 19 02
    14.     jnz DP                  ;если нет то повторяем поиск
    15.     cmp BYTE PTR [edi-3],14h        ;проверям системная ли учетка
    16.     jz dal                  ;если да то пропускаем
    17. men:
    18.     cmp DWORD PTR [SecName],4D4C4B48h
    19.     jnz user_keys
    20.     cmp BYTE PTR [edi-3],18h
    21.     jnz dal
    22.     cmp BYTE PTR [edi+15],20h
    23.     jnz dal
    24.     user_keys:
    25.     mov BYTE PTR [edi-1],3Fh        ;если нет то меняем 19 на 3F
    26.     mov BYTE PTR [edi+1],0Fh        ;02 на 0F
    27.     mov BYTE PTR [edi-4],02h        ;применяем обе галочки
    28. dal:
    29.     jmp DP                  ;повторяем цикл   
    30. DP_out:
    31.     retn
    32. DACLpatch endp
    Вопросов будет дофига. Описаний в инете 0. Все содрано с regedit.

    По поводу отношения тех или иных байт.
    3F0F - все вкючено
    1902 - только чтение

    Порядок в дакл соотвествует порядку отображения в regedit, так что состав самого дакл понять будет не сложно.
     
  8. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Ltonid
    Спасибо буду разбираться. Как что-то получится - выложу копилируемый код.
    Вопрос: совместимость с вин7 присутствует?
     
  9. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Дык все равно можно будет заинжектится в свцхост и с правами системы записать все что нужно? Я правильно понял? Тогда имхо это не очень)
    Самый надежный способ это while(TRUE) удалять все оттуда=)
     
  10. Ltonid

    Ltonid New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2010
    Сообщения:
    3
    Нет, вы не правильно поняли. У системы тоже можно права отобрать и тогда никто не сможет изменить ветку не изменив права. Просто данный код это не делает, на то были свои причины.

    Да с 7 совместимость есть, я же написал в каментах.

    Также плюсом програмного изменения явялется то что не надо отвязывать ветку от родителя, при сохранении прав она сама отвязывается, но при этом права применяются на всех детей. (это важно)