Права администратора и юзера

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
GAL
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 69
Зарегистрирован: 05.11.2004 (Пт) 15:57

Права администратора и юзера

Сообщение GAL » 01.07.2005 (Пт) 11:10

Привет!
Нужна помощь..
Пытаюсь програмно создать файл в папке C:\WINDOWS\system32 под правами user'a и выдается ошибка, естественно что под админом все нормально работает.
Что посоветуете?
Обойти можно?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.07.2005 (Пт) 11:22

Нет.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 01.07.2005 (Пт) 11:54

Посоветуем не давать гостям права писать в системе чёх хош)))
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 01.07.2005 (Пт) 12:03

Эх, эти мне юные троянописатели.

GAL
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 69
Зарегистрирован: 05.11.2004 (Пт) 15:57

Сообщение GAL » 01.07.2005 (Пт) 15:52

Не нужно таких высказываний RayShade!
Или ты так уж уверен, что это может быть связано лишь с троянами?
Я не для этого спрашивал.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 01.07.2005 (Пт) 17:37

Брось. Нормальной проге нечего делать в этом фолдере.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 01.07.2005 (Пт) 18:16

2 GAL

Обойти можно.
Если подробно расскажешь - зачем, возможно, дам код.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 01.07.2005 (Пт) 18:37

Интересно, как мы собрались обходить механизм привилегий ОС? :)

С использование escalation exploits? Ну так, на них полагаться нельзя. Потому что могут ведь и патч поставить :)

Олег Козлов
Обычный пользователь
Обычный пользователь
 
Сообщения: 52
Зарегистрирован: 26.05.2005 (Чт) 15:56
Откуда: Нижний Тагил

Сообщение Олег Козлов » 01.07.2005 (Пт) 19:07

А вообще как программно определить, какая учетная запись - админ или ограниченная? (VB 6.0)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.07.2005 (Пт) 19:14

Вот, у меня что-то есть... Не знаю, работает ли. Писалось на основе cmdasuser (с) Keith Brown
Код: Выделить всё
Private Function GetAdminSid() As Long 'Returns PSID
Dim ntauth As SID_IDENTIFIER_AUTHORITY
    ntauth.Value(6) = SECURITY_NT_AUTHORITY
    If 0 = AllocateAndInitializeSid(ntauth, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, GetAdminSid) Then
        s_err "AllocateAndInitializeSid", Err.LastDllError
    End If
End Function

Public Function IsAdmin() As Boolean
Dim htok As Long
    If 0 = OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, htok) Then
        s_err "OpenProcessToken", Err.LastDllError
    End If

Dim cb As Long
    GetTokenInformation htok, TokenGroups, 0, 0, cb
Dim ptg() As Long: ReDim ptg(0 To cb / 4 - 1)
    If 0 = GetTokenInformation(htok, TokenGroups, ptg(0), cb, cb) Then
        s_err "GetTokenInformation", Err.LastDllError
    End If

Dim pAdminSid As Long
    pAdminSid = GetAdminSid
   
Dim it As Long
    For it = 1 To ptg(0)
        If EqualSid(ptg(2 * it - 1), pAdminSid) Then Exit For
    Next
    IsAdmin = (it <= ptg(0))

    FreeSid pAdminSid
    CloseHandle htok
End Function
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.07.2005 (Сб) 5:08

Ммммм....
Как утверждает "Защищённый код", проверки наличия admin sid недостаточно. Он может присутствовать в токене, но быть отключенным. Нужно ещё проверять его включенность...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Олег Козлов
Обычный пользователь
Обычный пользователь
 
Сообщения: 52
Зарегистрирован: 26.05.2005 (Чт) 15:56
Откуда: Нижний Тагил

Сообщение Олег Козлов » 02.07.2005 (Сб) 10:59

Мтыкс... В приведенном выше коде я не разобрался с тремя моментами:

SECURITY_NT_AUTHORITY
TOKEN_QUERY

и функция s_err

???

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 02.07.2005 (Сб) 12:07

SECURITY_NT_AUTHORITY, TOKEN_QUERY - константы, отвечающие за действия вызываемой функции. Смотрите документацию.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.07.2005 (Сб) 13:09

s_err - это простой MsgBox :-)
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.07.2005 (Сб) 13:25

GSerg писал(а):Ммммм....
Как утверждает "Защищённый код", проверки наличия admin sid недостаточно. Он может присутствовать в токене, но быть отключенным. Нужно ещё проверять его включенность...

GSerg добавляет, что нужно проверять флаг SE_GROUP_ENABLED в поле Attributes структуры SID_AND_ATTRIBUTES.
Изображение

Олег Козлов
Обычный пользователь
Обычный пользователь
 
Сообщения: 52
Зарегистрирован: 26.05.2005 (Чт) 15:56
Откуда: Нижний Тагил

Сообщение Олег Козлов » 02.07.2005 (Сб) 15:33

Amed писал(а):SECURITY_NT_AUTHORITY, TOKEN_QUERY - константы, отвечающие за действия вызываемой функции. Смотрите документацию.
Бы еще знать, где ее найти.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 02.07.2005 (Сб) 15:48

Код: Выделить всё
Private Const TOKEN_QUERY As Long = &H8&
Private Const SECURITY_NT_AUTHORITY As Long = &H5&

А вообще вот, нашел в API-Guid'е:
Код: Выделить всё
'Code submitted by Anderson Mesquita (anderson@paulistasul.org.br)

' This function will determine whether or not a thread is running in the user context
' of the local Administrator account, you need to examine the access token associated
' with that thread using the GetTokenInformation() API, since this access token
' represents the user under which the thread is running. By default the token
' associated with a thread is that of its containing process, but this user context
' will be superceded by any token attached directly to the thread. So to determine a
' thread’s user context, first attempt to obtain any token attached directly to the
' thread with OpenThreadToken(). If this fails, and it reports an ERROR_NO_TOKEN,
' then obtain the token of the thread’s containing process with OpenProcessToken().

'This code requires one form and one module

'in a form
Option Explicit
Private Sub Form_Load()
    If IsAdmin Then
        MsgBox "Your an Administrator", vbInformation, Caption
    Else
        MsgBox "Keep Dreaming", vbInformation, Caption
    End If
End Sub

'in a module
Option Explicit
Option Base 0     ' Important assumption for this code

Private Const ANYSIZE_ARRAY = 20 'Fixed at this size for comfort. Could be bigger or made dynamic.

' Security APIs
Private Const TokenUser = 1
Private Const TokenGroups = 2
Private Const TokenPrivileges = 3
Private Const TokenOwner = 4
Private Const TokenPrimaryGroup = 5
Private Const TokenDefaultDacl = 6
Private Const TokenSource = 7
Private Const TokenType = 8
Private Const TokenImpersonationLevel = 9
Private Const TokenStatistics = 10

' Token Specific Access Rights
Private Const TOKEN_ASSIGN_PRIMARY = &H1
Private Const TOKEN_DUPLICATE = &H2
Private Const TOKEN_IMPERSONATE = &H4
Private Const TOKEN_QUERY = &H8
Private Const TOKEN_QUERY_SOURCE = &H10
Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const TOKEN_ADJUST_GROUPS = &H40
Private Const TOKEN_ADJUST_DEFAULT = &H80

' NT well-known SIDs
Private Const SECURITY_DIALUP_RID = &H1
Private Const SECURITY_NETWORK_RID = &H2
Private Const SECURITY_BATCH_RID = &H3
Private Const SECURITY_INTERACTIVE_RID = &H4
Private Const SECURITY_SERVICE_RID = &H6
Private Const SECURITY_ANONYMOUS_LOGON_RID = &H7
Private Const SECURITY_LOGON_IDS_RID = &H5
Private Const SECURITY_LOCAL_SYSTEM_RID = &H12
Private Const SECURITY_NT_NON_UNIQUE = &H15
Private Const SECURITY_BUILTIN_DOMAIN_RID = &H20

' Well-known domain relative sub-authority values (RIDs)
Private Const DOMAIN_ALIAS_RID_ADMINS = &H220
Private Const DOMAIN_ALIAS_RID_USERS = &H221
Private Const DOMAIN_ALIAS_RID_GUESTS = &H222
Private Const DOMAIN_ALIAS_RID_POWER_USERS = &H223
Private Const DOMAIN_ALIAS_RID_ACCOUNT_OPS = &H224
Private Const DOMAIN_ALIAS_RID_SYSTEM_OPS = &H225
Private Const DOMAIN_ALIAS_RID_PRINT_OPS = &H226
Private Const DOMAIN_ALIAS_RID_BACKUP_OPS = &H227
Private Const DOMAIN_ALIAS_RID_REPLICATOR = &H228

Private Const SECURITY_NT_AUTHORITY = &H5

Type SID_AND_ATTRIBUTES
    Sid As Long
    Attributes As Long
End Type

Type TOKEN_GROUPS
    GroupCount As Long
    Groups(ANYSIZE_ARRAY) As SID_AND_ATTRIBUTES
End Type

Type SID_IDENTIFIER_AUTHORITY
    Value(0 To 5) As Byte
End Type

Declare Function GetCurrentProcess Lib "Kernel32" () As Long

Declare Function GetCurrentThread Lib "Kernel32" () As Long

Declare Function OpenProcessToken Lib "Advapi32" ( _
    ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, _
    TokenHandle As Long) As Long

Declare Function OpenThreadToken Lib "Advapi32" ( _
    ByVal ThreadHandle As Long, ByVal DesiredAccess As Long, _
    ByVal OpenAsSelf As Long, TokenHandle As Long) As Long

Declare Function GetTokenInformation Lib "Advapi32" ( _
    ByVal TokenHandle As Long, TokenInformationClass As Integer, _
    TokenInformation As Any, ByVal TokenInformationLength As Long, _
    ReturnLength As Long) As Long

Declare Function AllocateAndInitializeSid Lib "Advapi32" ( _
    pIdentifierAuthority As SID_IDENTIFIER_AUTHORITY, _
    ByVal nSubAuthorityCount As Byte, ByVal nSubAuthority0 As Long, _
    ByVal nSubAuthority1 As Long, ByVal nSubAuthority2 As Long, _
    ByVal nSubAuthority3 As Long, ByVal nSubAuthority4 As Long, _
    ByVal nSubAuthority5 As Long, ByVal nSubAuthority6 As Long, _
    ByVal nSubAuthority7 As Long, lpPSid As Long) As Long

Declare Function RtlMoveMemory Lib "Kernel32" ( _
    Dest As Any, Source As Any, ByVal lSize As Long) As Long

Declare Function IsValidSid Lib "Advapi32" (ByVal pSid As Long) As Long

Declare Function EqualSid Lib "Advapi32" (pSid1 As Any, pSid2 As Any) As Long

Declare Sub FreeSid Lib "Advapi32" (pSid As Any)

Declare Function CloseHandle Lib "Kernel32" (ByVal hObject As Long) As Long

Public Function IsAdmin() As Boolean
    Dim hProcessToken       As Long
    Dim BufferSize          As Long
    Dim psidAdmin           As Long
    Dim lResult             As Long
    Dim X                   As Integer
    Dim tpTokens            As TOKEN_GROUPS
    Dim tpSidAuth           As SID_IDENTIFIER_AUTHORITY

    IsAdmin = False
    tpSidAuth.Value(5) = SECURITY_NT_AUTHORITY
   
    ' Obtain current process token
    If Not OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, True, hProcessToken) Then
        Call OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, hProcessToken)
    End If
    If hProcessToken Then

        ' Deternine the buffer size required
        Call GetTokenInformation(hProcessToken, ByVal TokenGroups, 0, 0, BufferSize) ' Determine required buffer size
        If BufferSize Then
            ReDim InfoBuffer((BufferSize \ 4) - 1) As Long
           
            ' Retrieve your token information
            lResult = GetTokenInformation(hProcessToken, ByVal TokenGroups, InfoBuffer(0), BufferSize, BufferSize)
            If lResult <> 1 Then Exit Function
           
            ' Move it from memory into the token structure
            Call RtlMoveMemory(tpTokens, InfoBuffer(0), Len(tpTokens))
           
            ' Retreive the admins sid pointer
            lResult = AllocateAndInitializeSid(tpSidAuth, 2, SECURITY_BUILTIN_DOMAIN_RID, _
                    DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdmin)
            If lResult <> 1 Then Exit Function
            If IsValidSid(psidAdmin) Then
                For X = 0 To tpTokens.GroupCount
               
                    ' Run through your token sid pointers
                    If IsValidSid(tpTokens.Groups(X).Sid) Then
                   
                        ' Test for a match between the admin sid equalling your sid's
                        If EqualSid(ByVal tpTokens.Groups(X).Sid, ByVal psidAdmin) Then
                            IsAdmin = True
                            Exit For
                        End If
                    End If
                Next
            End If
            If psidAdmin Then Call FreeSid(psidAdmin)
        End If
        Call CloseHandle(hProcessToken)
    End If
End Function
Последний раз редактировалось A.A.Z. 02.07.2005 (Сб) 15:49, всего редактировалось 1 раз.

Олег Козлов
Обычный пользователь
Обычный пользователь
 
Сообщения: 52
Зарегистрирован: 26.05.2005 (Чт) 15:56
Откуда: Нижний Тагил

Сообщение Олег Козлов » 02.07.2005 (Сб) 15:49

А где можно скачать этот API Guide?

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 02.07.2005 (Сб) 15:50


tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.07.2005 (Сб) 19:55

A.A.Z. писал(а):А вообще вот, нашел в API-Guid'е:

На первый взгляд, замечание GSerg-а там точно так же не учтено, как и в моём коде...
Изображение

HiMik2003
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 21.07.2003 (Пн) 11:32
Откуда: Кишинёв

Сообщение HiMik2003 » 03.07.2005 (Вс) 10:22

А почему бы не использовать функцию CheckTokenMembership ?
Вот что писано в МСДНе:
The CheckTokenMembership function determines whether a specified SID is enabled in an access token.

И в ремарках:
The CheckTokenMembership function simplifies the process of determining whether a SID is both present and enabled in an access token.

Just because a SID is present in the token, doesn't mean that the system will use it in an access check. The SID may be disabled or have the SE_GROUP_USE_FOR_DENY_ONLY attribute. The system uses only enabled SIDs to grant access when performing an access check.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.07.2005 (Вс) 10:36

HiMik2003 писал(а):А почему бы не использовать функцию CheckTokenMembership ?

Видать, потому что её на NT нет? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

HiMik2003
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 21.07.2003 (Пн) 11:32
Откуда: Кишинёв

Сообщение HiMik2003 » 03.07.2005 (Вс) 15:32

GSerg писал(а):
HiMik2003 писал(а):А почему бы не использовать функцию CheckTokenMembership ?

Видать, потому что её на NT нет? :)



С чего ты взял?

CheckTokenMembership:
Requirements
Windows NT/2000 or later: Requires Windows 2000 or later.
Header: Declared in Winbase.h; include Windows.h.
Library: Use Advapi32.lib.

Sorry, я вначале не въехал про NT, думал платформа NT5
Я думал, что сейчас ранее чем 98 никто не юзает, стоил ли принимать во внимание?

GAL
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 69
Зарегистрирован: 05.11.2004 (Пт) 15:57

Сообщение GAL » 04.07.2005 (Пн) 12:36

Я хотел сделать чтобы история запуска моей программы (База данных), ну там кто, когда, под каким именеми, распечатывали ли что-нибудь из базы на принте и т.д., записывалась в ini файл в C:\WINDOWS\system32, а не в ее app.path , файлик бы этот никто кроме меня не прочитал бы.
А ты, RayShade, говоришь - трояны...

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 04.07.2005 (Пн) 12:56

GAL писал(а):Я хотел сделать чтобы история запуска моей программы (База данных), ну там кто, когда, под каким именеми, распечатывали ли что-нибудь из базы на принте и т.д., записывалась в ini файл в C:\WINDOWS\system32, а не в ее app.path , файлик бы этот никто кроме меня не прочитал бы.
А ты, RayShade, говоришь - трояны...


B как ты себе это представляешь?

Записать могу, а прочитать нет?!?!?!? хехе

Тебе нужно делать службу и в неё передавать данные о пользователе, а она в свою очередь будет уже писать.
Только системная папка виндов не очень подходит для хранения инфы....
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 04.07.2005 (Пн) 12:59

GAL

Наивный ты я смотрю :) Я еще раз повотрю - нормальной проге делать нечего в этом фолдере. Хочешь чтобы никто не прочитал - шифруй.

GAL
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 69
Зарегистрирован: 05.11.2004 (Пт) 15:57

Сообщение GAL » 04.07.2005 (Пн) 13:01

Sebas
... файлик бы этот никто кроме меня не прочитал бы...
Я имел ввиду, что никто не знал бы что он там и никто его соответственно и не читал бы.

GAL
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 69
Зарегистрирован: 05.11.2004 (Пт) 15:57

Сообщение GAL » 04.07.2005 (Пн) 13:05

RayShade
Ну может и наивный.. :?
Если вы не заметили, то у меня одна звездочка..
А насчет шифрования..
Подскажите как именно, я такого еще не делал.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 04.07.2005 (Пн) 13:06

GAL писал(а):Sebas
... файлик бы этот никто кроме меня не прочитал бы...
Я имел ввиду, что никто не знал бы что он там и никто его соответственно и не читал бы.


Бугагагаг! Наивняк! Если ввязываешься в такое дело, запомни!
ДАЖЕ КУХАРКИ ЗНАЮ ЧТО ТАКОЕ КЕЙ_ЛОГГЕР И ЮЗАЮТ ХЕКСЭДИТ.
Не держи других за дураков, и сам им не станешь!
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 04.07.2005 (Пн) 13:06

Про шифрование можно поискать на форуме :)

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 116

    TopList  
cron