Приветствую. Может кто подскажет, как залочить ветку реестра на запись в неё, естественно программно. В основном интересует вариант с правами доступа (я в этом слабо соображаю). (Задача заключается в запрете установки LSP, которая сводится к блокировке на запись куста HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters).
Задача, подразумевается из чисто познавательного интереса, я же написал что не шарю в токенах и правах пользователей и т.п. Вот и хотелось бы подучиться на конкретике.
Я вроде не в ветку WASM.NT.KERNEL запостил. В r0 - методов больше, но интересует r3. Есть колбэки и юзермодные (RegNotifyChangeKeyValue), но и они не универсальны, поэтому предпочтительнее манипуляции с правами.
Начните отсюда http://msdn.microsoft.com/en-us/library/aa446654(v=VS.85).aspx Подробное описание установки дескрипторов безопасности, кажись, у Шрайбера было.
Я уже воевал в этой области, вот из рабочей проги. По порядку. Однако собирать рабочий код простите не буду, слишком много нюансов. Каменты по памяти. Код (Text): Указаны смещения функции (не экспортируемой) в библиотеке для разных виндей ;XP ACLUI_XP equ 0AC8h ;Vista ACLUI_VISTA equ 04F8h ;Windows 7 ACLUI_WIN7 equ 04D8h сама библиотека ACLUIDLL db "ACLUI.DLL",0 VersionDefinition proc CALL GetVersion cmp al,5h jz XP cmp ax,0006h jz VISTA cmp ax,0106h jz SEVEN XP: mov DWORD PTR [ACLUI_VER],ACLUI_XP jmp OS_VER VISTA: jnz SEVEN mov DWORD PTR [ACLUI_VER],ACLUI_VISTA jmp OS_VER SEVEN: mov DWORD PTR [ACLUI_VER],ACLUI_WIN7 OS_VER: push offset[ACLUIDLL] CALL LoadLibraryA ADD eax,1000h ADD eax,DWORD PTR [ACLUI_VER] ; смещение функции mov ebx,eax mov eax, DWORD PTR [eax] cmp DWORD PTR [eax],8B55FF8Bh jnz exit mov DWORD PTR [ACLUI_IMP],ebx VersionDefinition endp Код (Text): Функция получает и изменяет права, таким образом что отбирает права у админа и юзеров, оставляя у системы. REGPATCH proc invoke RegOpenKeyExA,KEY_KEY,ADDR KEYNUM,0,2000000h,ADDR KEY_HANDLE cmp eax,2 jz bad_key invoke lstrlen,ADDR KEY_NUM add eax,eax invoke MultiByteToWideChar,CP_ACP,MB_COMPOSITE,ADDR KEY_NUM,-1,ADDR KEY_WIDE_BUF,eax - обязательно юникод Здесь лучше ниче не трогать ибо вырвано из регэдита в силу того что выше оговоренная функа не экспортируема mov edi,offset[ACLUI_IMP] push offset[SEC_BUF] xor esi,esi mov ebp,esp add ebp,8 mov eax,ebp add eax,0Ch mov DWORD PTR DS:[eax],4h push esi push esi push esi push esi push DWORD PTR SS:[ebp+0Ch] push 4h mov eax,offset[KEY_WIDE_BUF] push eax CALL GetNamedSecurityInfoW cmp eax,5 jz DACL_bad cmp eax,2 jz DACL_bad mov eax,DWORD PTR [SEC_BUF] cmp BYTE PTR [eax],01 jnz DACL_bad go: invoke RegGetKeySecurity,KEY_HANDLE,DACL_SECURITY_INFORMATION,0,ADDR DACL_SIZE - получаем таблицу DACL для ВЕТКИ реестра CALL DACLpatch - функция измененния права (описана ниже) mov eax,DWORD PTR [SEC_BUF] add eax,14h mov ebx,DWORD PTR [DACL_SIZE] push 0 push eax push 0 push 0 mov eax,0B0000004h push eax push 4 push offset [KEY_WIDE_BUF] mov edx,10000000h mov esi,40000000h mov edi,20000000h CALL SetNamedSecurityInfoW - сохраняем права DACL_bad: push DWORD PTR [KEY_HANDLE] CALL RegCloseKey bad_key: RETN REGPATCH endp Код (Text): DACLpatch proc mov eax,DWORD PTR [SEC_BUF] ;адрес данных ADD eax,14h ;смещение до данных xor edx,edx ;обнуление едх mov ecx,DWORD PTR [DACL_SIZE] ;размер данных sub ecx,14h ;уменьшение общего размера mov edi,eax ;кладем адрес данных в еди mov eax,19h ;поиск байта только чтение DP: REPNE SCASB ;поиск cmp ecx,0 ;проверям кончились ли данные jz DP_out ;прыжок на выход cmp BYTE PTR [edi+1],02h ;проверям что 19 02 jnz DP ;если нет то повторяем поиск cmp BYTE PTR [edi-3],14h ;проверям системная ли учетка jz dal ;если да то пропускаем men: cmp DWORD PTR [SecName],4D4C4B48h jnz user_keys cmp BYTE PTR [edi-3],18h jnz dal cmp BYTE PTR [edi+15],20h jnz dal user_keys: mov BYTE PTR [edi-1],3Fh ;если нет то меняем 19 на 3F mov BYTE PTR [edi+1],0Fh ;02 на 0F mov BYTE PTR [edi-4],02h ;применяем обе галочки dal: jmp DP ;повторяем цикл DP_out: retn DACLpatch endp Вопросов будет дофига. Описаний в инете 0. Все содрано с regedit. По поводу отношения тех или иных байт. 3F0F - все вкючено 1902 - только чтение Порядок в дакл соотвествует порядку отображения в regedit, так что состав самого дакл понять будет не сложно.
Ltonid Спасибо буду разбираться. Как что-то получится - выложу копилируемый код. Вопрос: совместимость с вин7 присутствует?
Дык все равно можно будет заинжектится в свцхост и с правами системы записать все что нужно? Я правильно понял? Тогда имхо это не очень) Самый надежный способ это while(TRUE) удалять все оттуда=)
Нет, вы не правильно поняли. У системы тоже можно права отобрать и тогда никто не сможет изменить ветку не изменив права. Просто данный код это не делает, на то были свои причины. Да с 7 совместимость есть, я же написал в каментах. Также плюсом програмного изменения явялется то что не надо отвязывать ветку от родителя, при сохранении прав она сама отвязывается, но при этом права применяются на всех детей. (это важно)