SystemResearch - исследование объектов ядра

Тема в разделе "WASM.PROJECTS", создана пользователем k3rnl, 24 окт 2023.

  1. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    68
    Доброго времени суток!

    Решил создать отдельную тему для своей утилиты SystemResearch
    0.jpg 1.jpg 2.jpg
    Проект на ранней стадии, много чего задумано и реализуется по мере свободного времени.
    Сборки с новым функционалом буду выкладывать в этой теме.

    Основной упор на код и оптимизацию сделан для Windows 10/11, но также тестирую работу программы в Windows 7. Поддерживаются только 64 битные ОС.
    Среда разработки и компилятор - Pelles C (версия 12.00.2)

    Состав программ:
    1. SystemResearch.exe - основная программа
    2. UI0Detect.exe - сервис (служба) для перехода в терминальную сессию (SessionId = 0)
    3. Wls0wndh.dll - вспомогательная подпрограмма для возврата из терминальной сессии
    4. FDUI0Input.sys - драйвер для устройств ввода-вывода в терминальной сессии

    Инструкция по установке для Windows 10/11:
    1. Файлы UI0Detect.exe и Wls0wndh.dll необходимо поместить в папку Windows\System32
    2. В SystemResearch.exe нажать кнопку Create UI0Detect Service
    3. Установить драйвер FDUI0Input.sys через FDUI0Input.inf
    4. Перезагрузить компьютер

    Перечислять все функции думаю смысла нет, всё интуитивно понятно.
    Списки с процессами и сервисами активируются по двойному щелчку мыши. Правой кнопкой мыши осуществляется обновление списков из контекстного меню.
    Также в программе реализованы всплывающие подсказки при наведении на определенные строки с выведенной информацией.
    Язык программы - английский.

    Из необычных особенностей - специально реализовывал открытие дескрипторов с минимально возможным набором прав. Интересно наблюдать как на это реагируют различные процессы.
    Например процесс csrss.exe - единственный процесс, который не показывает идентификатор сессии если не включена привилегия SeDebugPrivilege у вызывающего процесса.
    В свою очередь для юзермодных процессов можно включать привилегию SeSecurityPrivilege (т.к. используется флаг ACCESS_SYSTEM_SECURITY) заместо SeDebugPrivilege.

    Помимо прочего, при включении в Windows 10/11 изоляции ядра, подключаются гипервизор и два безопасных процесса - Secure System и LsaIso.exe с соответствующим уровнем доверия (Virtual Trust Level).
    Если Secure System является защищенным процессом, то LsaIso.exe спокойно отдаёт свои дескрипторы вызывающему процессу уровня системы. Это создаёт некоторое поле для маневра.

    В общем пока так. По мере свободного времени буду обновлять функционал программы.
     

    Вложения:

    • SystemResearch.zip
      Размер файла:
      41,5 КБ
      Просмотров:
      665
    • UI0Detect.zip
      Размер файла:
      22,7 КБ
      Просмотров:
      657
    • ZeroInput.zip
      Размер файла:
      316,4 КБ
      Просмотров:
      658
    R81..., mantissa, Rel и ещё 1-му нравится это.
  2. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    68
    С релизом Windows 11 23H2 (build 22631) драйвер FDUI0Input.sys перестал работать (как и предыдущие на предыдущих обновлениях ОС).
    Проблема ребят из FireDaemon в том, что они продолжают упорно привязывать свой драйвер к рабочему столу Default.
    При этом механизм переключения в терминальную сессию (winsta.dll) устроен таким образом, что переход осуществляется на рабочий стол Winlogon.
    Отсюда и все беды. Ждём следующего обновления драйвера.

    Пришлось переделать сервис UI0Detect под современные реалии: теперь подпрограмма для возврата из терминальной сессии Wls0wndh.dll запускается на рабочем столе Winlogon.
    При переключении в терминальную сессию вы увидите окно с кнопкой, но взаимодействовать с ним не сможете через клавиатуру и мышь.
    Сами клавиатура и мышь активируются ровно через 180 сек. (заложено в самой системе в драйвере win32kfull.sys), но взаимодействовать всё равно нельзя.
    Чтобы вернуться нужно: либо делать хардресет с кнопки и перезагружать ПК, либо написать программу с таймером, по истечение которого автоматически сработает механизм возврата.
    Загрузить такую программу можно через SystemResearch.exe (соответствующие коррективы для создания системных процессов в терминальной сессии я внёс).

    Данное обновление небольшое, немного нового функционала, оптимизация кода и исправление небольших багов.
    Теперь можно добавлять права Sacl и Dacl в вызывающий процесс для получения доступа к информации, содержащийся в этих Acl (будет реализовано позже).
    Также следует учитывать - Dacl для защищённых процессов получить пока что невозможно.
    Доработал механизм снятия защиты с сервисов.
    Обратите внимание: для снятия защиты с сервиса нужно, чтобы владельцем (owner) вызывающего процесса была СИСТЕМА (соответственно запуск с токеном Trusted Installer Token).
    Если у вас Windows 11 22H2 (build 22621) и более старые ОС новый (временный) файл сервиса UI0Detect.exe качать не нужно.
     

    Вложения:

    • SystemResearch.zip
      Размер файла:
      42,8 КБ
      Просмотров:
      650
    • UI0Detect.zip
      Размер файла:
      11,6 КБ
      Просмотров:
      665
    Последнее редактирование: 6 ноя 2023
    Mikl___ и Marylin нравится это.
  3. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    68
    Давно не обновлял свою утилиту SystemResearch (за это время много всего пофиксено, улучшено, добавлено нового функционала).
    Доработал полностью функционал по управлению сервисами\службами
    0.png 1.png 2.png

    Защита с сервиса снимается если утилита запущена с токеном Trusted Installer и после перезапуска сервиса, процесс будет запущен без защиты.
    Но это касается не всех сервисов, а только части:
    3.png

    Разобрался почему не работала терминальная сессия и в частности клавиатура\мышь.
    Оказалось встроенный в Windows 11 SuperVisor (изоляция ядра и памяти) блокировал драйвер FDUI0Input.sys
    Добавил функционал по распознаванию супервизора и последующий запрет на переход в терминальную сессию.
    Соответственно вернул правильные рабочие станции и рабочие столы для утилит UI0Detect.exe и Wls0wndh.dll

    Следующий этап - таблицы SACL и DACL.
     

    Вложения:

    • SystemResearch.rar
      Размер файла:
      40,8 КБ
      Просмотров:
      643
    • UI0Detect.rar
      Размер файла:
      21,7 КБ
      Просмотров:
      642
    • ZeroInput.zip
      Размер файла:
      316,4 КБ
      Просмотров:
      648
    Marylin и alex_dz нравится это.
  4. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.242
    k3rnl, немножко глупый вопрос - а чем Ты дравера подписываешь?
     
  5. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    68
    UbIvItS, драйвер FDUI0Input.sys не мой. Это разработка FireDaemon https://kb.firedaemon.com/support/solutions/articles/4000123189
    Несколько раз я им помогал в тестировании и нахождении багов.

    А так, ещё в 2016 году, был опыт с EV сертификацией на сайте MS (LiveID аккаунт имеется).
    INF-файл, CAT-каталог, набор утилит (signtool, inf2cat, makecab).
    Далее предлагалось скачать файл winqual.exe и подписать его своим сертификатом, загружал на сервак для проверки валидности цифровой подписи.
    Как сейчас это работает не скажу точно, давно уже драйверами не занимаюсь.
     
    UbIvItS нравится это.
  6. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    68
    Обновил утилиту SystemResearch до версии 1.3.3 (переход с dev-билдов на более привычную модель версий). В основу лёг старый проект KernelExplorer (соответственно и наименование изменено).
    1.png 2.png 3.png 4.png 5.png

    Из нового:
    - токен локальной системы теперь берётся из smss.exe (неважно protected процесс или нет)
    - добавлен простой функционал удаления "занятых" файлов (если файл не удаётся удалить, он переименовывается и после перезагрузки ПК его можно удалить окончательно)
    - сводная информация о дескрипторе безопасности объектов ядра (SDDL строка с расшифровкой по таблицам SACL\DACL)
    - оптимизация алгоритмов выборки и перебора (для уменьшения объема кода (веса файла) и ускорения выполнения)
    - значительное сокращение глобальных переменных

    В планах:
    - расширенная информация о дескрипторе безопасности (advapi32.GetSecurityInfoEx)
    - расшифровка всех флагов, масок доступа, типов объектов, SID'ов\RID'ов и прочее
    - реализация функционала добавления ACE в списки управления доступом ACL

    Немного о доступе к SACL\DACL:
    DACL сервисов\служб читается без каких-либо дополнительных прав - просто запускаете (даже не от имени администратора) и получаете DACL.
    SACL сервисов\служб доступен при включенной привилегии SeSecurityPrivilege (соответственно требуется запуск с правами администратора).
    Доступ к SACL\DACL процессов и их токенов зависит от самих процессов. Для системных процессов SystemResearch должна быть запущена как система или выше (токены локальной системы или TrustedInstaller). Также необходимо включить права SACL и DACL в менеджере прав и привилегий.
    Для получения SDDL строки должна быть включена привилегия SeSecurityPrivilege.

    Скачать: SystemResearch.zip
    VirusTotal - Analysing file
     

    Вложения:

    Mikl___ нравится это.
  7. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    68
    Обновление утилиты до версии 1.3.4

    1.png 2.png

    Всю информацию об объекте ядра в списки ACL я занёс, кроме SE_OBJECT_TYPE (пока используемый метод не работает, позже постараюсь решить проблему).
    Из неудобств (временных) - TreeView не выводит строку длиннее 260 символов (касается некоторых списков прав доступа объекта, остальное всё умещается).
    Постарался структурировать TreeView так, чтобы было удобно читать.
    Пришлось повозиться с SACL процесса lsass.exe - в новых ОС он имеет два ACE. При получении структуры EXPLICIT_ACCESS (в частности перечисления ACCESS_MODE) вылетает 87 ошибка.
     

    Вложения:

    Mikl___ нравится это.
  8. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    68
    Обновление утилиты до версии 1.3.5

    1. Добавлена поддержка Windows 11 24H2
    - упорядочены сигнатуры для не экспортируемой функции GetSecurityInfoEx
    - исправлена битовая маска для преобразования номера билда ОС (в некоторых случаях таблицы SACL\DACL могли загружаться по неверному адресу, что приводило к аварийному завершению программы)
    2. Часть строковых переменных убрана из кода в ресурсы (данные)
    3. Разделение списка прав на объектные и общие (GeneralAccess) для более корректного вывода в строку TreeView
    4. Мелкие фиксы кода
     

    Вложения:

    Mikl___ и alex_dz нравится это.
  9. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    68
    Обновление утилиты до версии 1.3.6

    Дальнейшую разработку временно приостанавливаю.

    Из нового:
    - дескриптор токена процесса (любого, даже защищенного) открывается с правами, необходимыми для получения SDDL и таблиц SACL\DACL
    Не понимаю почему SystemInformer этого не умеет делать. Видимо не учли такой параметр как MandatoryLabelPolicy - у дескриптора процесса он NoWriteUp | NoReadUp, а у дескриптора токена NoWriteUp (что абсолютно не мешает читать его с определенным набором прав и привилегий)
    11.jpg
    22.jpg 33.jpg 44.jpg
    - поменял интерфейс (шрифт), заметил что на больших разрешениях (больше FullHD) окно программы слишком маленькое, соответственно переделал текстовые поля - теперь выделяется и копируется только значение, имя параметра статично (да и выравнивание с этим шрифтом делать легче)
    - добавил информацию о выделенном используемом пространстве самого ACL - Space used и Space free (размер заголовка ACL равен 8 байт)
    - доступ к ACL таблицам через SeSecurityPrivilege
    - изменить защиту сервиса через TrustedInstaller Token
    - пофиксил все баги, которые смог найти в коде
     

    Вложения:

    Mikl___, Marylin и alex_dz нравится это.
  10. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    68
    Открыл исходный код к проекту https://github.com/LunarResearch/SystemResearch
    Там же в релизах последняя скомпилированная версия 1.3.6.2

    На данный момент проектом заниматься нет времени.
    Много чего хотел ещё реализовать. Может когда-нибудь, если будет свободное время.
     
    Research, alex_dz и Marylin нравится это.
  11. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    527
    Спасибо за сорс код!
    попробовал собрать - много вопросовв возникло
    1) в чем собираете прожект, по ходу код С++ хотя файлы у вас .c
    почему С++? напримет используете С++ only конструкции типа nullptr, constexpr
    2) не смог понять откуда у вас некоторые значения, например
    https://prnt.sc/YAnemEIHBg1I
    ни в Windows SDK ни в офиц доке их нету
    https://learn.microsoft.com/en-us/windows/win32/api/accctrl/ne-accctrl-trustee_type
    даже ежели в Pelles C собирали (ver 12) - в нем тоже нету их!
    3) кое-чего добавили только в Win11, я добавил так -

    #ifndef DWMWA_WINDOW_CORNER_PREFERENCE
    // introduced in Windows 11 (Build 22000)
    #define DWMWA_WINDOW_CORNER_PREFERENCE 33
    #endif
    #ifndef DWMWA_SYSTEMBACKDROP_TYPE
    #define DWMWA_SYSTEMBACKDROP_TYPE 38
    #endif

    4) _cpuid -> __cpuid

    5) добавил кастинг в кой-каких местах, например (без - ошибка)
    StartupInfo.lpDesktop = (LPWSTR) TEXT("WinSta0\\Default");
    --- Сообщение объединено, 26 фев 2025 в 00:11 ---
    6) тут тоже непонятка https://prnt.sc/5t1vDHCZtcO4

    Error (active) E0135 class "_TRUSTEE_W" has no member "u" SystemResearch \repos\SystemResearch\SystemResearch\AclWinAPI.cpp 244
    --- Сообщение объединено, 26 фев 2025 в 00:13 ---
    7) впервые вижу такой умопомрачительный goto (вовнутрь цикла)
    https://prnt.sc/pVx6-ue0zGhb
    --- Сообщение объединено, 26 фев 2025 в 00:19 ---
    8) buffer overlow?
    https://prnt.sc/GTxjDkTxsMaN
     

    Вложения:

    k3rnl нравится это.
  12. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    190
    Красота! Кому что-то не нрав, могут сами допилить.
     
    Последнее редактирование: 26 фев 2025 в 02:09
    k3rnl нравится это.
  13. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    68
    alex_dz, проект полностью разработан в Pelles C
    Плюсов там нет, но IDE позволяет использовать стандарт C2X (nullptr, _cpuid и т.д.), поэтому синтаксис напоминает C++
    Добавил файл проекта SystemResearch.ppj - через него должно все запуститься со всеми настройками.

    Совсем забыл, что пару хидеров я переделывал под себя)
    Уже залил на GitHub в папку headers

    По поводу TRUSTEE_IS_ это сопоставление с перечислением (enum), которое я нашёл на каком-то форуме (если найду ссылку, выложу).
    В Windows SDK и половины нет необходимого, приходилось по крупицам собирать информацию для GetSecurityInfoEx и таблиц SACL\DACL

    По 7 пункту: там очень сложная система условий с AceType (в частности с SYSTEM_MANDATORY_LABEL_ACE_TYPE)
    Его может не быть (pAccessEntryList->cEntries выдаст 0), но остальные части ACE вполне существуют (lsass.exe - во втором случае процесс открывается с правом READ_CONTROL)
    1.png

    Вообще разные комбинации прав с разными объектами ядра (и их защитами) дают интересные результаты.
    Например к защищенному токену процесса имеется полный доступ (и к SDDL тоже), в то время как к самому защищенному процессу только заголовок SACL.
     
    Research и alex_dz нравится это.
  14. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    527
    k3rnl
    пульнул последний кодес
    в Пелле12 пробую Build:

    Building C:\Tmp\pellesC\SystemResearch-main\output\AclWinAPI.obj.
    C:\Tmp\pellesC\SystemResearch-main\AclWinAPI.c(218): error #2152: Unknown member 'u' of 'struct _TRUSTEE_W' (did you mean: ptstrName?).
    C:\Tmp\pellesC\SystemResearch-main\AclWinAPI.c(218): error #2113: Left operand of '.' has incompatible type 'wchar_t *'.
    C:\Tmp\pellesC\SystemResearch-main\AclWinAPI.c(404): error #2152: Unknown member 'u' of 'struct _TRUSTEE_W' (did you mean: ptstrName?).
    C:\Tmp\pellesC\SystemResearch-main\AclWinAPI.c(404): error #2113: Left operand of '.' has incompatible type 'wchar_t *'.
    *** Error code: 1 ***
    Done.



    хедера
    dwmapi.h
    accctrl.h

    очень сильно отличаются от виндовых
    "c:\Program Files (x86)\Windows Kits\10\Include\10.0.20348.0\um"

    или их надо поверх брутально переписать у Пелле здесь?
    "c:\Program Files\PellesC\Include\Win\"
    --- Сообщение объединено, 27 фев 2025 в 13:08 ---
    Да, похоже поверх в Пелле - то что надо, пасиб!

    Building C:\Tmp\pellesC\SystemResearch-main\output\AclWinAPI.obj.
    Building C:\Tmp\pellesC\SystemResearch-main\output\DialogBox.res.
    Building C:\Tmp\pellesC\SystemResearch-main\output\ExtensionAclWinAPI.obj.
    Building C:\Tmp\pellesC\SystemResearch-main\output\ExtensionCode.obj.
    Building C:\Tmp\pellesC\SystemResearch-main\output\ExtensionWinAPI.obj.
    Building C:\Tmp\pellesC\SystemResearch-main\output\InternalCode.obj.
    Building C:\Tmp\pellesC\SystemResearch-main\output\InternalWinAPI.obj.
    Building C:\Tmp\pellesC\SystemResearch-main\output\ProcessExWinAPI.obj.
    Building C:\Tmp\pellesC\SystemResearch-main\output\ServiceExWinAPI.obj.
    Building C:\Tmp\pellesC\SystemResearch-main\output\SourceCode.obj.
    Building C:\Tmp\pellesC\SystemResearch-main\SystemResearch.exe.
    Done.
     
    Последнее редактирование: 27 фев 2025 в 13:05
    k3rnl нравится это.
  15. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    527
  16. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    68
    alex_dz, с GetExplicitEntriesFromAcl я вообще не хотел связываться (уже не помню, но что-то мне не нравилось в работе этой функции), и этот код был экспериментальный.
    Видимо отвлекся на другой код и забыл про него, поэтому не дописал окончание.