Как изменить привилегии ключей реестра?

Здравствуйте, Sonfire !
Добро пожаловать на SafeZone.

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

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

Пример:
Код:
reg load hku\Temp hkcu.hiv

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

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

Пример, как изменить права есть здесь: https://safezone.cc/threads/kak-izmenit-prava-dostupa-k-reestru.27430/
 
Последнее редактирование:
Dragokas, а на скрипт перевести можно?
Что именно перевести, как смонтировать hiv, или как изменить права?
Смонтировать только через WinAPI или reg.exe, а на счёт прав можно и скриптом, только смотря, что конкретно ты хочешь поменять...

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

VB.NET / VBA:
'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

Если нужно добавить привилегии для нового пользователя, то будет совсем по-другому.
 
Что именно перевести, как смонтировать hiv, или как изменить права?
Смонтировать только через WinAPI или reg.exe, а на счёт прав можно и скриптом, только смотря, что конкретно ты хочешь поменять...

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

VB.NET / VBA:
'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

Если нужно добавить привилегии для нового пользователя, то будет совсем по-другому.

Спасибо большое! vb.net не знаю, может есть ссылка на документацию в Microsoft или на языках c++/c#?
И еще это у вас для изменения привилегий пользователя скрипт, а как уже разобрали на другом форуме мне совсем другое нужно.
Или может вы расшифруете ""Изменения в списке привилегий с помощью прямой манипуляций с hive-ами""
 
1) Это не VB.NET, а vbs-файл (просто тема подсветки такая).
2) Мой ответ был дан Кириллу, не Вам.

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

Или может вы расшифруете ""Изменения в списке привилегий с помощью прямой манипуляций с hive-ами""
А... это вы с той загадочной темы :) Я её уже читал. К сожалению, не могу знать, что хочет от Вас преподаватель.

может есть ссылка на документацию в Microsoft или на языках c++/c#?
Есть. И не только на 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)
 

Вложения

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

Предупреждение

Второе предупреждение за оверквотинг. Зачем цитируете весь пост?
 
Последнее редактирование модератором:
Хотелось бы узнать как-то можно узнать какие права имеет запрашиваемая ветвь реестра?
Желательно через консоль
Через консоль, например CMD можно используя WMI: GetSecurityDescriptor method of the StdRegProv class (Windows)

Пример команды для HKLM\Software (запускать с повышенными привилегиями):
Код:
WMIC /NameSpace:\\root\default Class StdRegProv Call GetSecurityDescriptor hDefKey="&H80000002" sSubKeyName="Software"
Идет выполнение (StdRegProv)->GetSecurityDescriptor()
Метод успешно вызван.
Параметры вывода:
instance of __PARAMETERS
{
Descriptor =
instance of __SecurityDescriptor
{
ControlFlags = 39956;
DACL = {
instance of __ACE
{
AccessMask = 131097;
AceFlags = 0;
AceType = 0;
Trustee =
instance of __Trustee
{
Domain = "BUILTIN";
Name = "Пользователи";
SID = {1, 2, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0, 33, 2, 0, 0};
SidLength = 16;
SIDString = "S-1-5-32-545";
};
},
instance of __ACE
{
AccessMask = 2147483648;
AceFlags = 10;
AceType = 0;
Trustee =
instance of __Trustee
{
Domain = "BUILTIN";
Name = "Пользователи";
SID = {1, 2, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0, 33, 2, 0, 0};
SidLength = 16;
SIDString = "S-1-5-32-545";
};
},
instance of __ACE
{
AccessMask = 983103;
AceFlags = 0;
AceType = 0;
Trustee =
instance of __Trustee
{
Domain = "BUILTIN";
Name = "Администраторы";
SID = {1, 2, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0, 32, 2, 0, 0};
SidLength = 16;
SIDString = "S-1-5-32-544";
};
},
instance of __ACE
{
AccessMask = 268435456;
AceFlags = 10;
AceType = 0;
Trustee =
instance of __Trustee
{
Domain = "BUILTIN";
Name = "Администраторы";
SID = {1, 2, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0, 32, 2, 0, 0};
SidLength = 16;
SIDString = "S-1-5-32-544";
};
},
instance of __ACE
{
AccessMask = 983103;
AceFlags = 0;
AceType = 0;
Trustee =
instance of __Trustee
{
Domain = "NT AUTHORITY";
Name = "СИСТЕМА";
SID = {1, 1, 0, 0, 0, 0, 0, 5, 18, 0, 0, 0};
SidLength = 12;
SIDString = "S-1-5-18";
};
},
instance of __ACE
{
AccessMask = 268435456;
AceFlags = 10;
AceType = 0;
Trustee =
instance of __Trustee
{
Domain = "NT AUTHORITY";
Name = "СИСТЕМА";
SID = {1, 1, 0, 0, 0, 0, 0, 5, 18, 0, 0, 0};
SidLength = 12;
SIDString = "S-1-5-18";
};
},
instance of __ACE
{
AccessMask = 983103;
AceFlags = 0;
AceType = 0;
Trustee =
instance of __Trustee
{
Domain = "BUILTIN";
Name = "Администраторы";
SID = {1, 2, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0, 32, 2, 0, 0};
SidLength = 16;
SIDString = "S-1-5-32-544";
};
},
instance of __ACE
{
AccessMask = 268435456;
AceFlags = 10;
AceType = 0;
Trustee =
instance of __Trustee
{
Domain = "";
Name = "СОЗДАТЕЛЬ-ВЛАДЕЛЕЦ";
SID = {1, 1, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0};
SidLength = 12;
SIDString = "S-1-3-0";
};
},
instance of __ACE
{
AccessMask = 131097;
AceFlags = 0;
AceType = 0;
Trustee =
instance of __Trustee
{
Domain = "ЦЕНТР ПАКЕТОВ ПРИЛОЖЕНИЙ";
Name = "ВСЕ ПАКЕТЫ ПРИЛОЖЕНИЙ";
SID = {1, 2, 0, 0, 0, 0, 0, 15, 2, 0, 0, 0, 1, 0, 0, 0};
SidLength = 16;
SIDString = "S-1-15-2-1";
};
},
instance of __ACE
{
AccessMask = 2147483648;
AceFlags = 10;
AceType = 0;
Trustee =
instance of __Trustee
{
Domain = "ЦЕНТР ПАКЕТОВ ПРИЛОЖЕНИЙ";
Name = "ВСЕ ПАКЕТЫ ПРИЛОЖЕНИЙ";
SID = {1, 2, 0, 0, 0, 0, 0, 15, 2, 0, 0, 0, 1, 0, 0, 0};
SidLength = 16;
SIDString = "S-1-15-2-1";
};
}};
Group =
instance of __Trustee
{
Domain = "NT AUTHORITY";
Name = "СИСТЕМА";
SID = {1, 1, 0, 0, 0, 0, 0, 5, 18, 0, 0, 0};
SidLength = 12;
SIDString = "S-1-5-18";
};
Owner =
instance of __Trustee
{
Domain = "BUILTIN";
Name = "Администраторы";
SID = {1, 2, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0, 32, 2, 0, 0};
SidLength = 16;
SIDString = "S-1-5-32-544";
};
SACL = {};
};
ReturnValue = 0;
};
Альтернативы - утилита SubInAcl из Microsoft Resource Kit, или к примеру, SetACL от Helge Klein.

или средствами WinApi
Псевдокодом:
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)

Если что-то из теории будет непонятно, спрашивайте.
 
Последнее редактирование:
Через консоль, например CMD можно используя WMI: GetSecurityDescriptor method of the StdRegProv class (Windows)

Пример команды для HKLM\Software (запускать с повышенными привилегиями):
Очень много не понятной информации выходит)
Хотелось бы что бы типа такого

1 - Administrators Full Access
2 - Administrators Read Access
3 - Administrators Read and Write Access
4 - Administrators Read, Write and Delete Access
5 - Creator Full Access
6 - Creator Read and Write Access
7 - World Full Access
8 - World Read Access
9 - World Read and Write Access
10 - World Read, Write and Delete Access
11 - Power Users Full Access
12 - Power Users Read and Write Access
13 - Power Users Read, Write and Delete Access
14 - System Operators Full Access
15 - System Operators Read and Write Access
16 - System Operators Read, Write and Delete Access
17 - System Full Access
18 - System Read and Write Access
19 - System Read Access
20 - Administrators Read, Write and Execute Access
21 - Interactive User Full Access
22 - Interactive User Read and Write Access
23 - Interactive User Read, Write and Delete Access
 
Далеко не самая простая тема. Даже если вы возьмете готовый код, основы все равно придётся почитать, чтобы хотя бы рассказать принцип работы преподавателю.

Ну вот то, что вы процитировали: первая часть "Администратор", "Создатель", "Система" и т.п., это закодировано в 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 указано, к каким разделам применяется привилегия и принцип её наследования.
 
Назад
Сверху Снизу