В работе Работа с hiv файлами

Тема в разделе "Реестр Microsoft Windows", создана пользователем Sonfire, 10 окт 2016.

  1. Sonfire
    Оффлайн

    Sonfire Новый пользователь

    Сообщения:
    6
    Симпатии:
    0
    Вопрос как изменить привилегии в этих hiv файлах?
     
  2. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.497
    Симпатии:
    4.312
    Здравствуйте, Sonfire !
    Добро пожаловать на SafeZone.

    Подмонтировать к реестру.
    Изменить привилегии нужных разделов.
    Выгрузить обратно.

    (если это то, что Вы имели в виду).

    Пример:
    Код (Text):

    reg load hku\Temp hkcu.hiv

    :: код для смены прав (нужно скорректировать путь по отношению к ветви hku\Temp)

    reg unload hku\Temp
     
    Необходимы повышенные привилегии.

    Пример, как изменить права есть здесь: http://safezone.cc/threads/kak-izmenit-prava-dostupa-k-reestru.27430/
     
    Последнее редактирование: 10 окт 2016
    Sonfire и Kиpилл нравится это.
  3. Kиpилл
    Онлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.232
    Симпатии:
    4.980
    Dragokas, а на скрипт перевести можно?
    icacls не подходит,api такой я не нашел.
     
    Sonfire нравится это.
  4. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.497
    Симпатии:
    4.312
    Что именно перевести, как смонтировать hiv, или как изменить права?
    Смонтировать только через WinAPI или reg.exe, а на счёт прав можно и скриптом, только смотря, что конкретно ты хочешь поменять...

    Вот пример, как я изменял права с запрета на разрешение:

    Код (vb.net):
    'On Error Resume Next
    Dim oWMI, UC, oStdReg, CurSID, AdmSID, objSD, SID, i

    Const FILE_WRITE_DATA = 2
    Const ACE_ALLOW = 0
    Const ACE_DENY = 1
    Const HKCU = &H80000001

    UC = "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.zip\UserChoice"

    set oShell = CreateObject("WScript.Shell")

    Set oStdReg = GetObject("winmgmts:{impersonationLevel=Impersonate, (Security)}!\\.\root\default:StdRegProv") ' grant SeSecurityPrivilege

    Set oWMI = GetObject("winmgmts:\\.\Root\CIMV2")

    CurSID = oWMI.Get("Win32_UserAccount.Domain='" & oShell.ExpandEnvironmentStrings("%UserDomain%") & "',Name='" & oShell.ExpandEnvironmentStrings("%UserName%") & "'").SID
    AdmSID = "S-1-5-32-544"

    'Извлекаем дескриптор безопасности
    'Set objSD = oWMI.Get("Win32_SecurityDescriptor").SpawnInstance_()

    oStdReg.GetSecurityDescriptor HKCU, UC, objSD

    If Not IsNull(objSD.DACL) Then

        'Перечисляем все списки избирательного доступа из дескриптора безопасности
        For i = 0 to UBound(objSD.DACL)

            'получаем SID пользователя в этом DACL
            SID = objSD.DACL(i).Trustee.SIDString

            'если это SID локального администратора или SID текущего пользователя
            if ((SID = CurSID) or (SID = AdmSID)) then

                'если устанавливалась привилегия на запись данных
                if (objSD.DACL(i).AccessMask And FILE_WRITE_DATA) then

                    'если эта привилегия содержит запрет
                    if (objSD.DACL(i).AceType = ACE_DENY) then
                       
                        'изменить привилегию на разрешительную
                        objSD.DACL(i).AceType = ACE_ALLOW

                    end if
                end if
            end if
        next
    end if

    'записать дескриптор безопасности обратно
    oStdReg.SetSecurityDescriptor HKCU, UC, objSD

    set oStdReg = Nothing
    set oWMI = Nothing
     
    Если нужно добавить привилегии для нового пользователя, то будет совсем по-другому.
     
    Sonfire и Kиpилл нравится это.
  5. Sonfire
    Оффлайн

    Sonfire Новый пользователь

    Сообщения:
    6
    Симпатии:
    0
    Спасибо большое! vb.net не знаю, может есть ссылка на документацию в Microsoft или на языках c++/c#?
    --- Объединённое сообщение, 13 окт 2016 ---
    И еще это у вас для изменения привилегий пользователя скрипт, а как уже разобрали на другом форуме мне совсем другое нужно.
    Или может вы расшифруете ""Изменения в списке привилегий с помощью прямой манипуляций с hive-ами""
     
  6. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.497
    Симпатии:
    4.312
    1) Это не VB.NET, а vbs-файл (просто тема подсветки такая).
    2) Мой ответ был дан Кириллу, не Вам.

    А тот ответ, что я давал ранее - это батник (как и пример дальше по ссылке), не язык программирования.
    Если никогда не работали с привилегиями DACL, то советую сперва попробовать изменить что-нибудь с помощью командной строки, а уж затем переходить к более сложным реализациям, вроде C++.
    Если у Вас не на чем по-практичковаться. То файл hiv вы можете создать командой
    Код (Text):
    reg save
    А... это вы с той загадочной темы :) Я её уже читал. К сожалению, не могу знать, что хочет от Вас преподаватель.

    Есть. И не только на Microsoft. Есть и по-лучше. Только там в основном всё на английском.
    Понимаете, изменить списки привилегий даже если вы уже чётко определились, что вам нужно смонтировать hiv-файл, это всё ещё очень широкое понятие.

    Есть несколько способов, изменить Security Descriptor:
    1) Создать новый дескриптор безопасности на основе SDDL-строки.
    2) Извлечь все существующие DACL из SD, изменить их свойства, и записать SD обратно.

    Затем, что конкретно вы хотите поменять:
    1) Добавить нового SID
    2) Добавить кому-то из существующих SID в DACL новую привилегию (например, запрет на удаление раздела, или любую из этих:
    perm.png
    3) Удалить привилегию, а с ней возможно и весь DACL, если других привилегий в нём не прописано.

    Из литературы могу посоветовать:
    Helge Klein - Permissions: A Primer, or: DACL, SACL, Owner, SID and ACE Explained
    Марк Руссинович, Соломон Д., Ионеску Алекс (6-е издание). Глава 6. Безопасность. Поздраздел "Дескрипторы безопасности и управление доступом".
    MSDN. Security Descriptors
    и т.д. по списку всех интересующих API-функций.

    Это довольно ёмкая тема. Поэтому смотрите готовые примеры.

    Ещё раз на счёт способов изменения SD.
    Например, чтобы создать SD на основе строки SDDL, см. пример и описание. При этом нужно хорошо разбираться в формате такой строки. Ещё описание.
    Я в своих программах использую другой подход, создавая DACL вручную, или редактируя существующий DACL, извлекая его из SD, и находя нужный из нескольких. Способ описан здесь. Он более длинный, но и более гибкий (на мой взгляд).
    Ну и конечно же вы всегда можете погуглить (на том же кибере) примеры кодов, взяв как поисковую фразу имя одной из API-функций по ссылкам.
    Приложу ещё мой пример (он на VB6, но там используется чистое WinAPI). Осн. функции - RegKeySetOwnerShip и RegKeyResetDACL.

    По поводу монтирования файла hiv см.:
    RegLoadKey function (Windows)
    RegLoadAppKey function (Windows)
    RegUnLoadKey function (Windows)

    Для сохранения:
    RegSaveKey function (Windows)
     

    Вложения:

    Kиpилл и Sonfire нравится это.
  7. Sonfire
    Оффлайн

    Sonfire Новый пользователь

    Сообщения:
    6
    Симпатии:
    0
    Наследующей неделю попытаюсь от него узнать с точки зрения простого пользователя чего он хочет. Надеюсь не все сразу он захочет)
     
    Последнее редактирование модератором: 13 окт 2016
  8. Sonfire
    Оффлайн

    Sonfire Новый пользователь

    Сообщения:
    6
    Симпатии:
    0
    Вроде бы удалось выяснить что хотят. Пойду по схему предложенной Kиpиллом "reg save - reg load - выставляем права - reg unload - reg restore", где выставляем "выставляем права" возьму от сюда http://safezone.cc/threads/kak-izmenit-prava-dostupa-k-reestru.27430/ .
    Хотелось бы узнать как-то можно узнать какие права имеет запрашиваемая ветвь реестра? Желательно через консоль или средствами WinApi


    Второе предупреждение за оверквотинг. Зачем цитируете весь пост?
     
    Последнее редактирование модератором: 19 окт 2016
  9. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.497
    Симпатии:
    4.312
    Через консоль, например CMD можно используя WMI: GetSecurityDescriptor method of the StdRegProv class (Windows)

    Пример команды для HKLM\Software (запускать с повышенными привилегиями):
    Код (Text):
    WMIC /NameSpace:\\root\default Class StdRegProv Call GetSecurityDescriptor hDefKey="&H80000002" sSubKeyName="Software"
    Альтернативы - утилита SubInAcl из Microsoft Resource Kit, или к примеру, SetACL от Helge Klein.

    Псевдокодом:
    GetNamedSecurityInfo -> MakeAbsoluteSD -> GetSecurityDescriptorDacl -> GetAclInformation -> GetAce (в цикле)

    В GetNamedSecurityInfo передаёте путь к ветви согласно синтаксису (см. SE_REGISTRY_KEY), в стркутуре SECURITY_INFORMATION устанавливаете флаг DACL_SECURITY_INFORMATION.
    Получаете Security Descriptor. Здесь чуть больше расписано о его структуре.

    Через GetSecurityDescriptorDacl извлекаете из SD указатель на DACL.
    GetAclInformation с флагом AclSizeInformation заполняет структуру ACL_SIZE_INFORMATION, откуда вы получите кол-во записей Ace.

    Создаете цикл, и передаетё индекс записи Ace в GetAce (от 0 до .AceCount - 1), в результате получаете указатель на Access Control Entry.
    Они бывают нескольких типов. В вашем случае нужны только 2:
    ACCESS_ALLOWED_ACE structure (Windows)
    ACCESS_DENIED_ACE structure (Windows)

    Вот в этой структуре и есть всё, что вас интересует, достаточно разобраться в описаниях полей структуры:
    ACE_HEADER structure (Windows)
    ACCESS_MASK (Windows)

    Тоже самое вы видите в выводе консольной команды.

    Информация, которая пригодится для понимания и разбора списка привилегий:

    Well-Known SIDS
    https://support.microsoft.com/ru-ru/kb/243330

    ACE types
    ACE (Windows)

    Access Rights and Access Masks
    Access Rights and Access Masks (Windows)

    Access Mask Format
    Access Mask Format (Windows)

    Если что-то из теории будет непонятно, спрашивайте.
     
    Последнее редактирование: 19 окт 2016
    Kиpилл и Sonfire нравится это.
  10. Sonfire
    Оффлайн

    Sonfire Новый пользователь

    Сообщения:
    6
    Симпатии:
    0
    Очень много не понятной информации выходит)
    Хотелось бы что бы типа такого

     
  11. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.497
    Симпатии:
    4.312
    Далеко не самая простая тема. Даже если вы возьмете готовый код, основы все равно придётся почитать, чтобы хотя бы рассказать принцип работы преподавателю.

    Ну вот то, что вы процитировали: первая часть "Администратор", "Создатель", "Система" и т.п., это закодировано в SID. По нему и определяется группа или конкретный пользователь, для которого устанавливается привилегия в ACE. По SID выше дал ссылку.

    Вторая часть Full Access, Read Access и т.п. закодировано в Access Mask (ссылку тоже приводил выше), т.е. любой набор галочек (см. скрин в посту №6) кодируется одним числом (битовой маской).
    Чтобы затем разобрать эту битовую маску на составляющие нужно выполнить с числом битовую операцию И.
    Вот кусочек примера от Майкрософт:

    Код (C++):
                case 'r':  //registry
                    if ((pace->Mask & KEY_QUERY_VALUE) == KEY_QUERY_VALUE)
                        wprintf(L".................... KEY_QUERY_VALUE: 0x%X\n", KEY_QUERY_VALUE);
                    if ((pace->Mask & KEY_SET_VALUE) == KEY_SET_VALUE)
                        wprintf(L".................... KEY_SET_VALUE: 0x%X\n", KEY_SET_VALUE);
                    if ((pace->Mask & KEY_CREATE_SUB_KEY) == KEY_CREATE_SUB_KEY)
                        wprintf(L".................... KEY_CREATE_SUB_KEY: 0x%X\n", KEY_CREATE_SUB_KEY);
                    if ((pace->Mask & KEY_ENUMERATE_SUB_KEYS) == KEY_ENUMERATE_SUB_KEYS)
                        wprintf(L".................... KEY_ENUMERATE_SUB_KEYS: 0x%X\n", KEY_ENUMERATE_SUB_KEYS);
                    if ((pace->Mask & KEY_NOTIFY) == KEY_NOTIFY)
                        wprintf(L".................... KEY_NOTIFY: 0x%X\n", KEY_NOTIFY);
                    if ((pace->Mask & KEY_CREATE_LINK) == KEY_CREATE_LINK)
                        wprintf(L".................... KEY_CREATE_LINK: 0x%X\n", KEY_CREATE_LINK);
                    if ((pace->Mask & KEY_WOW64_32KEY) == KEY_WOW64_32KEY)
                        wprintf(L".................... KEY_WOW64_32KEY: 0x%X\n", KEY_WOW64_32KEY);
                    if ((pace->Mask & KEY_WOW64_64KEY) == KEY_WOW64_64KEY)
                        wprintf(L".................... KEY_WOW64_64KEY: 0x%X\n", KEY_WOW64_64KEY);
                    if ((pace->Mask & KEY_WOW64_RES) == KEY_WOW64_RES) // what is this?
                        wprintf(L".................... KEY_WOW64_RES: 0x%X\n", KEY_WOW64_RES);
                    if ((pace->Mask & KEY_READ) == KEY_READ)
                        wprintf(L".................... KEY_READ: 0x%X\n", KEY_READ);
                    if ((pace->Mask & KEY_WRITE) == KEY_WRITE)
                        wprintf(L".................... KEY_WRITE: 0x%X\n", KEY_WRITE);
                    if ((pace->Mask & KEY_EXECUTE) == KEY_EXECUTE)
                        wprintf(L".................... KEY_EXECUTE: 0x%X\n", KEY_EXECUTE);
                    if ((pace->Mask & KEY_ALL_ACCESS) == KEY_ALL_ACCESS)
                        wprintf(L".................... KEY_ALL_ACCESS: 0x%X\n", KEY_ALL_ACCESS);
                    break;
    Описание привилегий: Registry Key Security and Access Rights (Windows)

    И весь код целиком: readme.txt - Display security descriptor of various Windows kernel objects (CppCheckSD)
    Там как раз то, что вам нужно - перечисление прав DACL почти любого объекта безопасности.

    В ACE_HEADER записано в поле AceType, устаналивает ли ACE привилегию разрешения (ACCESS_ALLOWED_ACE_TYPE) или запрета (ACCESS_DENIED_ACE_TYPE).
    В поле AceFlags указано, к каким разделам применяется привилегия и принцип её наследования.
     
    Sonfire нравится это.

Поделиться этой страницей