как узнать уровень превилегий процесса?

Тема в разделе "WASM.ASSEMBLER", создана пользователем asm0day01, 28 мар 2026.

  1. asm0day01

    asm0day01 Member

    Публикаций:
    0
    Регистрация:
    7 янв 2020
    Сообщения:
    135
    subj
    --- Сообщение объединено, 28 мар 2026 ---
    или даже как то их редактировать... потому что вродь на все уровни открывается, анн какая то "заshita" 8D
    --- Сообщение объединено, 28 мар 2026 ---
    read - работает почти что со всеми, а вот write... "в процесс писать"
     
  2. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    463
    Может бредовая идея. Если записалось = значит есть привилегия?
     
  3. asm0day01

    asm0day01 Member

    Публикаций:
    0
    Регистрация:
    7 янв 2020
    Сообщения:
    135
    как _программно_ менять уровни защиты процесса? может секретная апи? ;)
    --- Сообщение объединено, 28 мар 2026 ---
    ну вродь да ;)
    --- Сообщение объединено, 28 мар 2026 ---
    еще интересует как это обновляется... там вродь как хэндлу... ;)!!!!!!!!!!!!
    --- Сообщение объединено, 28 мар 2026 ---
    вот кодес
    --- Сообщение объединено, 28 мар 2026 ---
    может UAC программно как то снять можно?!
     

    Вложения:

    • mem6666_11.asm
      Размер файла:
      6,9 КБ
      Просмотров:
      75
  4. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.649
    Правильно ли я понимаю, что под «уровнями защиты процесса» вы имеете в виду механизмы вроде изоляции, привилегий, или, например, такие вещи как Protected Process / Protected Process Light в Windows? В этом контексте мне интересно, существует ли какой-либо программный способ (в том числе через недокументированные или внутренние API) изменить эти уровни для уже запущенного процесса.

    Насколько я понимаю, стандартные документированные средства операционной системы обычно не предоставляют подобной возможности из пользовательского режима, так как это напрямую связано с моделью безопасности и разграничением привилегий. Тем не менее, иногда в сообществе упоминаются «секретные» или внутренние механизмы — хотелось бы уточнить, есть ли в этом хоть какая-то практическая основа, или это скорее область теоретических/исследовательских хакингов с участием драйверов и работы на уровне ядра.

    Если есть какие-то известные подходы, ограничения или подводные камни (например, зависимость от версии ОС или необходимость подписанных драйверов), буду признателен за разъяснение.
    Хочешь, могу дополнительно разобрать, как именно в современных ОС реализована модель защиты процессов и почему такие вещи обычно нельзя менять «на лету».
     
  5. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.153
    Если речь про intergity level, то как ассемблерщик ассемблерщику докладываю:
    Код (Python):
    1. import ctypes
    2. from ctypes import wintypes
    3. import os
    4.  
    5. # Константы Windows API
    6. PROCESS_QUERY_LIMITED_INFORMATION = 0x1000
    7. TOKEN_QUERY = 0x0008
    8. TokenIntegrityLevel = 25
    9. TH32CS_SNAPPROCESS = 0x00000002
    10.  
    11. # Структуры для перечисления процессов
    12. class PROCESSENTRY32(ctypes.Structure):
    13.     _fields_ = [
    14.         ("dwSize", wintypes.DWORD),
    15.         ("cntUsage", wintypes.DWORD),
    16.         ("th32ProcessID", wintypes.DWORD),
    17.         ("th32DefaultHeapID", ctypes.POINTER(ctypes.c_ulong)),
    18.         ("th32ModuleID", wintypes.DWORD),
    19.         ("cntThreads", wintypes.DWORD),
    20.         ("th32ParentProcessID", wintypes.DWORD),
    21.         ("pcPriClassBase", wintypes.LONG),
    22.         ("dwFlags", wintypes.DWORD),
    23.         ("szExeFile", ctypes.c_char * 260)
    24.     ]
    25.  
    26. def get_integrity_level(pid):
    27.     advapi32 = ctypes.windll.advapi32
    28.     kernel32 = ctypes.windll.kernel32
    29.  
    30.     # 1. Открываем процесс
    31.     h_process = kernel32.OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, False, pid)
    32.     if not h_process:
    33.         return "Access Denied"
    34.  
    35.     h_token = wintypes.HANDLE()
    36.     try:
    37.         # 2. Открываем токен процесса
    38.         if not advapi32.OpenProcessToken(h_process, TOKEN_QUERY, ctypes.byref(h_token)):
    39.             return "Access Denied"
    40.  
    41.         # 3. Получаем размер структуры TOKEN_MANDATORY_LABEL
    42.         dw_size = wintypes.DWORD()
    43.         advapi32.GetTokenInformation(h_token, TokenIntegrityLevel, None, 0, ctypes.byref(dw_size))
    44.      
    45.         buffer = ctypes.create_string_buffer(dw_size.value)
    46.         if advapi32.GetTokenInformation(h_token, TokenIntegrityLevel, buffer, dw_size, ctypes.byref(dw_size)):
    47.             # В буфере лежит TOKEN_MANDATORY_LABEL. Первый член — SID_AND_ATTRIBUTES
    48.             # Извлекаем указатель на SID (первые 4/8 байт в зависимости от архитектуры)
    49.             p_sid = ctypes.cast(buffer, ctypes.POINTER(ctypes.c_void_p)).contents
    50.          
    51.             # 4. Получаем RID (уровень целостности) из SID
    52.             # Берем последний SubAuthority
    53.             get_count = advapi32.GetSidSubAuthorityCount
    54.             get_count.restype = ctypes.POINTER(ctypes.c_ubyte)
    55.             sub_auth_count = get_count(p_sid).contents.value
    56.          
    57.             get_auth = advapi32.GetSidSubAuthority
    58.             get_auth.restype = ctypes.POINTER(wintypes.DWORD)
    59.             rid = get_auth(p_sid, sub_auth_count - 1).contents.value
    60.          
    61.             # Маппинг уровней
    62.             if rid < 0x1000: return "Untrusted"
    63.             if rid < 0x2000: return "Low"
    64.             if rid < 0x3000: return "Medium"
    65.             if rid < 0x4000: return "High"
    66.             return "System"
    67.          
    68.     finally:
    69.         if h_token: kernel32.CloseHandle(h_token)
    70.         kernel32.CloseHandle(h_process)
    71.     return "Unknown"
    72.  
    73. def list_processes_integrity():
    74.     kernel32 = ctypes.windll.kernel32
    75.     h_snapshot = kernel32.CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
    76.  
    77.     entry = PROCESSENTRY32()
    78.     entry.dwSize = ctypes.sizeof(PROCESSENTRY32)
    79.  
    80.     print(f"{'PID':<8} {'Integrity':<15} {'Name'}")
    81.     print("-" * 40)
    82.  
    83.     if kernel32.Process32First(h_snapshot, ctypes.byref(entry)):
    84.         while True:
    85.             pid = entry.th32ProcessID
    86.             name = entry.szExeFile.decode('ansi')
    87.             level = get_integrity_level(pid)
    88.             print(f"{pid:<8} {level:<15} {name}")
    89.          
    90.             if not kernel32.Process32Next(h_snapshot, ctypes.byref(entry)):
    91.                 break
    92.  
    93.     kernel32.CloseHandle(h_snapshot)
    94.  
    95. if __name__ == "__main__":
    96.     list_processes_integrity()
     
    GRAFik, Mikl___ и Rel нравится это.
  6. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    308
    Если рассуждать логически, то при входе юзера в сессию, lsass.exe вручает ему токен, где описываются привилегии и многое другое. Это массивная структура, которая будет подключаться во-все запускаемые от имени данного юзера процессы. Для наглядности можно запросить токен у WinDbg - в EPROCESS имеется линк на него. Вот пример для запущенного мною AkelPad:

    Код (Text):
    1. 0: kd> !process 0 1 akelpad.exe
    2. PROCESS fffffa800cf721c0
    3.     SessionId: 1   Cid: 0e3c   Peb: 7efdf000  ParentCid: 0680
    4.     DirBase  : 216483000  ObjectTable: fffff8a001d05a00  HandleCount: 95.
    5.     Image    : AkelPad.exe
    6.     VadRoot  : fffffa800fbad310  Vads 89  Clone 0  Private 681. Modified 496. Locked 0.
    7.     DeviceMap: fffff8a0012e14f0
    8.     Token    : fffff8a00ce924f0  ;<--------------
    9. ..........
    10.  
    11. 0: kd> dt _token fffff8a00ce924f0
    12. nt!_TOKEN
    13.    +0x000 TokenSource         : _TOKEN_SOURCE
    14.    +0x010 TokenId             : _LUID
    15.    +0x018 AuthenticationId    : _LUID
    16.    +0x020 ParentTokenId       : _LUID
    17.    +0x028 ExpirationTime      : 0x7fffffff`ffffffff
    18.    +0x030 TokenLock           : 0xfffffa80`111336c0 _ERESOURCE
    19.    +0x038 ModifiedId          : _LUID
    20.    +0x040 Privileges          : _SEP_TOKEN_PRIVILEGES
    21.    +0x058 AuditPolicy         : _SEP_AUDIT_POLICY
    22.    +0x074 SessionId           : 1
    23.    +0x078 UserAndGroupCount   : 0xf
    24.    +0x07c RestrictedSidCount  : 0
    25.    +0x080 VariableLength      : 0x2bc
    26.    +0x084 DynamicCharged      : 0x400
    27.    +0x088 DynamicAvailable    : 0
    28.    +0x08c DefaultOwnerIndex   : 4
    29.    +0x090 UserAndGroups       : 0xfffff8a0`0ce92800  _SID_AND_ATTRIBUTES  ;<------
    30.    +0x098 RestrictedSids      : (null)
    31.    +0x0a0 PrimaryGroup        : 0xfffff8a0`02f15ab0
    32.    +0x0a8 DynamicPart         : 0xfffff8a0`02f15ab0  -> 0x501
    33.    +0x0b0 DefaultDacl         : 0xfffff8a0`02f15acc _ACL
    34.    +0x0b8 TokenType           : 1 ( TokenPrimary )
    35.    +0x0bc ImpersonationLevel  : 0 ( SecurityAnonymous )
    36.    +0x0c0 TokenFlags          : 0x2000
    37.    +0x0c4 TokenInUse          : 0x1 ''
    38.    +0x0c8 IntegrityLevelIndex : 0xe     ;<----------------------
    39.    +0x0cc MandatoryPolicy     : 3
    40.    +0x0d0 LogonSession        : 0xfffff8a0`0105e720 _SEP_LOGON_SESSION_REFERENCES
    41.    +0x0d8 OriginLogonSession  : _LUID
    42.    +0x0e0 SidHash             : _SID_AND_ATTRIBUTES_HASH
    43.    +0x1f0 RestrictedSidHash   : _SID_AND_ATTRIBUTES_HASH
    44.    +0x300 pSecurityAttributes : 0xfffff8a0`0451f7b0 _AUTHZBASEP_SECURITY_ATTRIBUTES_INFO
    45.    +0x308 SessionObject       : 0xfffffa80`0fef6470
    46.    +0x310 VariablePart        : 0xfffff8a0`0ce928f0
    47. 0: kd>
    48.  
    Имеется таблица по адресу "UserAndGroups", а кол-во записей SID_AND_ATTRIBUTES в ней указывается в поле "UserAndGroupCount=16". При этом уровень доверенности объекта описывает запись "IntergiryLevelIndex=15" в этой таблице. Полями в структуре оперируют Get/SetTokenInformation().

    Права всем объектам ядра (включая процессам) задаются в его дескрипторе безопасности "Security Desc" SD - он хранится в заголовке объекта OBJECT_HEADER. Например объектом для процессов является структура EPROCESS, а заголовок будет лежать на 0x30 байт выше самого объекта. Поскольку в логе уже имеем адрес EPROCESS, то получить хидер того-же AkelPad можно так:

    Код (Text):
    1.  
    2. 0: kd> dt _object_header fffffa800cf721c0-30
    3. nt!_OBJECT_HEADER
    4.    +0x000 PointerCount       : 0n65
    5.    +0x008 HandleCount        : 0n5
    6.    +0x008 NextToFree         : 0x00000000`00000005 Void
    7.    +0x010 Lock               : _EX_PUSH_LOCK
    8.    +0x018 TypeIndex          : 0x7
    9.    +0x019 TraceFlags         : 0
    10.    +0x01a InfoMask           : 0x8
    11.    +0x01b Flags              : 0
    12.    +0x020 ObjectCreateInfo   : 0xfffffa80`10b5f040 _OBJECT_CREATE_INFORMATION
    13.    +0x020 QuotaBlockCharged  : 0xfffffa80`10b5f040
    14.    +0x028 SecurityDescriptor : 0xfffff8a0`01aa5036  ;<---- адрес SD (сбросить мл.тетраду)
    15.    +0x030 Body               : _QUAD  ;<------------------ здесь начинается EPROCESS
    16. 0: kd>
    17.  
    Младшие 4-бита в адресе SD - это счётчик, а потому нужно сбросить их в нуль. Уровень "Integrity Level" задаётся в списке SACL (system access control list) дескриптора SD, и здесь видно, что у меня он имеет значение 12288=0x3000=HIGH (см.софт ProcessHacker):
    Код (Text):
    1.  
    2. 0: kd> !sd 0xfffff8a0`01aa5030
    3. ->Revision: 0x1
    4. ->Control : 0x8814
    5.             SE_DACL_PRESENT
    6.             SE_SACL_PRESENT
    7.             SE_SACL_AUTO_INHERITED
    8.             SE_SELF_RELATIVE
    9. ->Owner   : S-1-5-32-544
    10. ->Group   : S-1-5-21-xxxx-xxxx-xxxx-513
    11.  
    12. ->Dacl    : ->AclRevision: 0x2
    13. ->Dacl    : ->AclSize    : 0x50
    14. ->Dacl    : ->AceCount   : 0x3
    15. ->Dacl    : ->Ace[0]: ->Type : ACCESS_ALLOWED_ACE_TYPE
    16. ->Dacl    : ->Ace[0]: ->Flags: 0x0
    17. ->Dacl    : ->Ace[0]: ->Size : 0x18
    18. ->Dacl    : ->Ace[0]: ->Mask : 0x001fffff
    19. ->Dacl    : ->Ace[0]: ->SID  : S-1-5-32-544
    20.  
    21. ->Sacl    : ->AclRevision: 0x2
    22. ->Sacl    : ->AclSize    : 0x1c
    23. ->Sacl    : ->AceCount   : 0x1
    24. ->Sacl    : ->Ace[0]: ->Type : SYSTEM_MANDATORY_LABEL_ACE_TYPE
    25. ->Sacl    : ->Ace[0]: ->Flags: 0x0
    26. ->Sacl    : ->Ace[0]: ->Size : 0x14
    27. ->Sacl    : ->Ace[0]: ->Mask : 0x00000003    <----------------
    28. ->Sacl    : ->Ace[0]: ->SID  : S-1-16-12288  <------ IL ------
    29. 0: kd>
    30.  
    31. ;//------ Значение маски ---------------------
    32. TOKEN_MANDATORY_POLICY_OFF              =  0x0   ;// Руль! Для токена не применяется обязательная политика целостности.
    33. TOKEN_MANDATORY_POLICY_NO_WRITE_UP      =  0x1   ;// Процесс не может выполнять запись в объекты с более высоким уровнем.
    34. TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN  =  0x2   ;// Уровень, который является меньшим из уровня родителя и уровня exe-файла.
    35. TOKEN_MANDATORY_POLICY_VALID_MASK       =  0x3   ;// NO_WRITE_UP + NEW_PROCESS_MIN
    36.  
    37. ;//--- Integrity Level (уровень целостности)
    38. ;//--- ML = MANDATORY_LEVEL. RID увеличивается на 1000h
    39. ;// SetTokenInformation (hToken, TokenUIAccess, &UIAccess, sizeof(DWORD));
    40. ML_UNTRUSTED            db  'S-1-16-0'     ,0   ;// недоверенный (Anonymous, нет доступа на запись)
    41. ML_LOW                  db  'S-1-16-4096'  ,0   ;// нет доступа на запись к большинству объектов системы
    42. ML_MEDIUM               db  'S-1-16-8192'  ,0   ;// используется обычными приложениями
    43. ML_HIGH                 db  'S-1-16-12288' ,0   ;// <------ права администратора
    44. ML_SYSTEM               db  'S-1-16-16384' ,0   ;// службы и другие приложения системного уровня
    45. ML_PROTECTED_PROCESS    db  'S-1-16-20480' ,0   ;// защищённый (используется в ядре, юзеру не доступен)
    46. ML_SECURE_PROCESS       db  'S-1-16-28672' ,0   ;// наивысший (используется только в Win10)
    47.  
    48. SECURITY_MANDATORY_UNTRUSTED_RID   =  0x0000
    49. SECURITY_MANDATORY_LOW_RID         =  0x1000
    50. SECURITY_MANDATORY_MEDIUM_RID      =  0x2000
    51. SECURITY_MANDATORY_HIGH_RID        =  0x3000  <--------
    52. SECURITY_MANDATORY_SYSTEM_RID      =  0x4000
    53. SECURITY_MANDATORY_PROTECTED_RID   =  0x5000
    54. SECURITY_MANDATORY_SECURE_RID      =  0x7000
    55.  
    В advapi32.dll есть много функций для операций с токеном и SD отдельно, и все они через kernelbase уходят корнями в ntdll.dll. Одна из них RtlSetSaclSecurityDescriptor(), которая призвана выставлять флаги в SACL, но по факту кастрирована (видимо в тушке имеются проверки аргументов). Типичной практикой является патч кода функции, чтобы тест аргументов всегда возвращал false. Эти изменения коснутся только проекции ntdll в нашем процессе, т.к. при записи сработает механизм CopyOnWrite. Более того в штате ОС есть мощная утилита ком.строки icacls - тоже оперирует дескриптором SD.

    Общие сведения (см.меню слева):
    https://learn.microsoft.com/en-us/windows/win32/secauthz/about-authorization
     
    GRAFik и Mikl___ нравится это.
  7. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    73
    Marylin нравится это.