Форум программистов, компьютерный форум, киберфорум
Бета-тестирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/48: Рейтинг темы: голосов - 48, средняя оценка - 4.60
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21

KernelExplorer without driver

25.10.2020, 03:26. Показов 11514. Ответов 74
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как-то давно поставил себе цель сделать некий инструмент на подобии WinDbg и Process Hacker но без использования драйвера.
Посмотреть как далеко может пустить ОС код, запущенный из-под обычного юзера, путем повышения прав, привилегий и т.д.
Но на какое-то время забросил этот проект. И вот сейчас решил восстановить, добавил функционала, поправил ошибки.

Из возможностей на данный момент:
1. открытие дескриптора любого процесса (Protected и ProtectedLite процессы открываются только для чтения)
2. вывод информации о DACL, SACL, таблиц доступа и аудита (в планах добавление функционала для изменения этих данных)
3. полный контроль над токеном процесса (включение, отключение и удаление привилегий)
4. завершение процесса (кроме Protected и ProtectedLite процессов)
Всё что я сейчас перечислил, Process Hacker делает только с включенным драйвером.
5. создание процесса с учетной записью SYSTEM
Здесь немного подробнее расскажу. Перед созданием процесса нужно открыть процесс, на основе которого будет создан новый.
Если открывается процесс, запущенный в SessionId 0, то и новый процесс будет запущен в нулевой сессии.
Это означает, что оконную процедуру вы не увидите, т.к. у каждой сессии свая станция (Windows Station) и у каждой станции свой рабочий стол.
Если открывается процесс, запущенный в SessionId 1, то и новый процесс будет запущен в этой же сессии с оконными процедурами, но как NT_AUTHORITY\SYSTEM (будь то блокнот или ещё что), при условии если parentprocess тоже был SYSTEM.
В следующем обновлении будет реализован механизм выбора рабочего стола (с Winlogon уже экспериментировал и запускал программы на экране блокировки, т.е. чтобы что запустить программу не нужно знать логин и пароль от ОС).

На данный момент никакой нумерации билдов не виду, т.к. попутно проектирую GUI версию (на ней планирую делать нумерацию).

Немного скринов)
Собственно приглашение пользователя ввести команду (всегда начинайте с op - открытие процесса, т.к. данная команда собирает всю необходимую информацию для последующих действий)

Пример вывода информации

Манипуляции с токеном


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

PS: для запуска необходимы права администратора (в дальнейшем эту проблему решу так же, как и у Process Hacker), и набор библиотек VC++ runtime (проект собран на VS2019).
Вложения
Тип файла: 7z KernelExplorer.7z (21.9 Кб, 37 просмотров)
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.10.2020, 03:26
Ответы с готовыми решениями:

MS SQL driver type 4 ошибка: [Microsoft][SQLServer JDBC Driver]No ResultSet set was produced.
Всем привет! Может мне кто-нибудь помочь с моей проблемой связанной с MS SQL driver type 4? Я использую для разработки проекта следующее:...

Ошибка при создании драйвера. Device driver does not install on any devices, use primitive driver if this is intended
Не могу создать драйвер ядра из-за данной ошибки. Помогите пожалуйста))) INF ФАЙЛ ; ; hellodriver.inf ; ...

wpd file system volume driver has a driver problem
Добрый вечер. Выносной хард видит диск но его нельзя открыть. Пробовал встроенным фиксом, он пишет wpd file system volume driver has a...

74
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
27.10.2020, 20:00  [ТС]
Студворк — интернет-сервис помощи студентам
нашёл причину падения программы на Windows 7 - одна из этих функций работает не адекватно:
C++
1
2
3
4
GetSidIdentifierAuthority(ppSidGroup);
GetSidSubAuthorityCount(ppSidGroup);
GetSidSubAuthority(ppSidGroup, i);
GetLengthSid(ppSidGroup);
ну или может быть я их применяю не так, хотя на Windows 10 всё четко.
плюс ещё эта убогая cmd-консоль, которая не имеет вертикальной прокрутки и не разворачивается на весь экран (как conhost.exe на Win10), вымораживает весь мозг..

на данный момент мне семерка интересна только тем, что её системные процессы не имеют никакой защиты (PPL и сопутствующее с ними появились только в Windows 8.1)
но поддерживать её я особо не собираюсь, слишком устаревшее ядро по отношению к современному коду (функции, структуры и прочее).
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
27.10.2020, 23:49  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
нашёл причину падения программы на Windows 7 - одна из этих функций работает не адекватно:
дальнейшее углубление в изучение проблемы выявило простую банальщиность:
для не экспортируемой функции GetSecurityInfoEx из библиотеки advapi32.dll я забыл поменять сигнатуру функции для её поиска
пришлось доставать сигнатуру из advapi32.dll для Windows 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// For Windows 7
BYTE pattren_GetSecurityInfoEx_Win7[68] = {
    0x48,0x8B,0xC4,0x4C,0x89,0x48,0x20,0x44,0x89,0x40,0x18,0x89,0x50,0x10,0x48,0x89,
    0x48,0x08,0x53,0x57,0x41,0x54,0x41,0x55,0x41,0x56,0x41,0x57,0x48,0x83,0xEC,0x68,
    0x45,0x8B,0xE0,0x48,0x8B,0xF9,0x48,0x8D,0x00,0x00,0x00,0x00,0x00,0xE8,0x00,0x00,
    0x00,0x00,0x8B,0xD8,0x85,0xC0,0x0F,0x85,0x00,0x00,0x00,0x00,0x48,0x85,0xFF,0x75,
    0x08,0x8D,0x5F,0x06
}; _TPCCH mask_GetSecurityInfoEx_Win7 = _TEXT("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx?????x????xxxxxx????xxxxxxxx");
 
// For Windows 10
BYTE pattren_GetSecurityInfoEx_Win10[64] = {
    0x48,0x8B,0xC4,0x4C,0x89,0x48,0x20,0x44,0x89,0x40,0x18,0x89,0x50,0x10,0x48,0x89,
    0x48,0x08,0x53,0x56,0x57,0x41,0x54,0x41,0x55,0x41,0x56,0x41,0x57,0x48,0x83,0xEC,
    0x60,0x45,0x8B,0xF0,0x48,0x8B,0xF1,0xE8,0x00,0x00,0x00,0x00,0x8B,0xD8,0x33,0xFF,
    0x85,0xC0,0x0F,0x85,0x00,0x00,0x00,0x00,0x48,0x85,0xF6,0x75,0x08,0x8D,0x58,0x06
}; _TPCCH mask_GetSecurityInfoEx_Win10 = _TEXT("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx????xxxxxxxx????xxxxxxxx");
в итоге программа заработала как надо


с консолью тоже разобрался - если кто не в курсе, делается это так:
левой кнопкой мыши на верхний угол заголовка окна консоли -> Свойства -> вкладка Расположение -> Размер буфера экрана -> и меняем поле высота (я поставил 9999)
всё, теперь можно растягивать окно консоли и пользоваться вертикальной прокруткой.

PS: если кто сможет предоставить сигнатуры функции 64 битных SetSecurityInfoExA/SetSecurityInfoExW и GetSecurityInfoExA/GetSecurityInfoExW из Vista, Windows 8 и Windows 8.1 буду благодарен)
делается это всё за пару минут при помощи x64dbg и плагина SwissArmyKnife, на выходе получается примерно так
Code
1
2
sig \x48\x89\x5C\x24\x18\x89\x54\x24\x10\x48\x89\x4C\x24\x08\x56\x41\x54\x41\x55\x41\x56\x41\x57\x48\x81\xEC\xE0\x00\x00\x00
mask xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ну или выложите 64 битные библиотеки advapi32.dll я сам достану сигнатуру, чтобы уж для всех ОС сделать
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
28.10.2020, 20:14  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
PS: если кто сможет предоставить сигнатуры функции 64 битных SetSecurityInfoExA/SetSecurityInfoExW и GetSecurityInfoExA/GetSecurityInfoExW из Vista, Windows 8 и Windows 8.1 буду благодарен
как и всегда сделал всё сам..

смотрю тема мало кому интересна.
тесторов нет вообще, комментариев по работе программы тоже.
а жаль, функционал у программы уже большой, и много чего хочу ещё реализовать.

выкладываю так сказать промежуточную релизную версию.
допилил поддержку всех современных ОС - начиная от Vista, заканчивая 10.

по поводу перехода в SessionId 0
от Vista до Windows 10 1709 включительно проблем с этим не возникнет - ОС сама предложит использовать утилиту обнаружения интерактивных служб (UI0Detect.exe)
а вот начиная с Windows 10 1803 и новее придётся воспользоваться сторонним приложением от FireDaemon (триал на 30 дней)
ДРАЙВЕР
ПРОВОДНИК
устанавливаете драйвер (через inf файл)
устанавливаете проводник, запускаете, в трее появится соответствующая иконка, правой кнопкой мыши -> переключиться в Сессию 0 (Switch Session 0)
ну и всё, вы попадаете на рабочий стол ядра ОС
предварительно можете запустить какие-нить процессы моей программой, чтобы не так скучно было в ядре
или даже тот же explorer, но толку от него мало - загрузится лишь оболочка, без какой-либо интерактивности, т.к. ядро обитает совершенно в другой папке нежели юзер, а именно здесь
Code
1
C:\Windows\System32\config\systemprofile
в планах всё же добить сервис на запуск без запроса UAC, делается это так
Vista и выше, из службы LocalSystem:
GetTokenInformation + TokenLinkedToken, затем CreateProcessAsUser с
этим токеном. Вот и получили elevated-процесс, причем даже без UAC-запросов.
------------------------------------------------
Вызвать GetTokenInformation+TokenLinkedToken на юзерском токене и получить
полный токен из фильтрованного. Когда CreateProcessAsUser вызывается с полным, а
не фильтрованным токеном, процесс получает администраторские права тихо,
без запросов UAC
и попробовать реализовать утилиту для перехода в Сессию 0 (облегченный вариант FireDaemon).
Вложения
Тип файла: 7z KernelExplorer.7z (148.6 Кб, 7 просмотров)
0
Всегда онлайн
 Аватар для MrOnlineCoder
1084 / 788 / 295
Регистрация: 07.04.2013
Сообщений: 2,703
28.10.2020, 20:31
_lunar_, для теста открыл процесс вашей же программы, и мне вывело кучу всего в консоль, но я прочитать и проскролить ничего не могу, поскольку в Windows 7 командная строка вот такая неудобная, и видно только последние десяток строк Как можно обойти эту проблему?
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
28.10.2020, 20:49  [ТС]
Цитата Сообщение от MrOnlineCoder Посмотреть сообщение
Как можно обойти эту проблему?

Цитата Сообщение от _lunar_ Посмотреть сообщение
с консолью тоже разобрался - если кто не в курсе, делается это так:
левой кнопкой мыши на верхний угол заголовка окна консоли -> Свойства -> вкладка Расположение -> Размер буфера экрана -> и меняем поле высота (я поставил 9999)
всё, теперь можно растягивать окно консоли и пользоваться вертикальной прокруткой.
лучше всего скачайте последнюю сборку программы из поста номер 23
0
Всегда онлайн
 Аватар для MrOnlineCoder
1084 / 788 / 295
Регистрация: 07.04.2013
Сообщений: 2,703
28.10.2020, 22:52
_lunar_, я не особо разбираюсь в "около-ядерном" низкоуровневом программировании под Win32, но например мне не хватило команды help, чтобы еще раз взглянуть на доступные команды. И еще что это за "промт" такой X:>? Просто интуитивно хочется подумать что я нахожусь в корне диска Х, которого у меня нет, может лучше сделать приветствие по типу "lunar> " ?

А можете кратко описать в двух словах как реализовали большинство этих функций без драйвера, который используется в том же Process Hacker?

И кстати увидел первый раз что можно создать процесс .dll файла от имени winlogon.exe
1
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
28.10.2020, 23:46  [ТС]
Цитата Сообщение от MrOnlineCoder Посмотреть сообщение
мне не хватило команды help
ок, это можно сделать.
хотя там команд не особо много, но для информативности и наглядности сделаю небольшое описание

Цитата Сообщение от MrOnlineCoder Посмотреть сообщение
И еще что это за "промт" такой X:>?
это ещё с первых ревизий осталось.
как вариант могу сделать так, чтобы выводился SID пользователя или например имя активного пользователя, который зашел в систему.
в общем подумаю, что лучше выводить.

Цитата Сообщение от MrOnlineCoder Посмотреть сообщение
И кстати увидел первый раз что можно создать процесс .dll файла от имени winlogon.exe
на самом деле это обычный PE файл)
просто не стал городить экзешники, чтобы не запутать пользователя что конкретно нужно запускать.
по сути, там реализован механизм нескольких запусков процессов с повышением SecurityDescriptor до системного процесса.

Цитата Сообщение от MrOnlineCoder Посмотреть сообщение
А можете кратко описать в двух словах как реализовали большинство этих функций
основная завязка идёт на функциях GetSecurityInfo и GetSecurityInfoEx (кстати код реализации GetSecurityInfo переехал в ntmarta.dll, а в advapi32.dll остался только стаб на неё).
GetSecurityInfoEx не документированная и не экспортированная функция в advapi32.dll (собственно интерес к этой функции и был толчком к написанию этой программы).

с помощью GetSecurityDescriptorControl я читаю SACL, DACL и таблицы доступа и аудита (в перспективе добавлю функционал SetSecurityDescriptorControl, чтобы можно было добавлять себе разные ACL и ещё больше увеличить права).
плюс целых ворох функций для работы с SID - GetSidIdentifierAuthority, GetSidSubAuthorityCount, GetSidSubAuthority, GetLengthSid

выглядит всё это примерно так
C++
1
2
3
4
Sys_GetSecurityDescriptor(
    ppProcessSidOwner, ppProcessSidGroup, ppProcessDacl, ppProcessSacl, ppProcessSecurityDescriptor,    // from GetSecurityInfo
    ppProcessAccessList, ppProcessAuditList, ppProcessOwner, ppProcessGroup                     // from GetSecurityInfoEx
)
в одном модуле я объединил обе функции (GetSecurityInfo + GetSecurityInfoEx), именно они и дают эту массу информации.

по поводу защищенных процессов я уже рассказывал - изначально была функция GetProcessInformation, но из-за того, что она не поддерживается Windows 7 (и Vista соответственно), пришлось переделывать на NtQueryInformationProcess и читать PS_PROTECTED_TYPE и PS_PROTECTED_SIGNER

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

ну и плюс много чего по мелочам - всякие заглушки, поиски по сигнатуре, получатели разных id и прочее.
я разбил программу на модули, сейчас у меня 6 модулей и каждый из них в среднем на 1000 строк кода, и это только начало)

Добавлено через 9 минут
Цитата Сообщение от MrOnlineCoder Посмотреть сообщение
взглянуть на доступные команды
попробуйте команду "cp"
введите - c:\\windows\\explorer.exe
на вопрос о сессии выберите системную (1)
рабочий стол выберите Default (1)
и запустите.

должно появиться окно утилиты обнаружения интерактивных служб
согласитесь на переход к сообщению и наблюдайте как ОС настраивает вам рабочий стол в сессии 0
перед этим можно запустить в системной сессии ProcessHacker например, чтобы был функционал полазить по рабочему столу ядра как я показывал здесь KernelExplorer without driver
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
06.11.2020, 00:37  [ТС]
Новая сборка:
- добавил создание процесса как elevated (с повышенными правами и привилегиями), теперь программа создаёт либо системный процесс, либо пользовательский elevated процесс
- вступительное приветствие изменил на
C++
1
2
3
_TCHAR UserName[MAX_PATH]{};
DWORD pcbBuffer = 260;
GetUserName(UserName, &pcbBuffer);
т.к. программа запускается под системным процессом, то и приветствие будет СИСТЕМА
- исправил баг, когда сначала был открыт процесс с токеном только на чтение, то нельзя было изменять привилегии у процесса, открытого с полным доступом к токену
- поменял цвет (хендлы, токены и прочее): зеленый полный доступ, желтый с ограниченным доступом, ну и красный доступа нет
- некоторые оптимизации в коде
- до help руки пока не дошли)


на данный момент переключил свое внимание на UI0Detect
полностью дизассемблировал сервис и его либу (из Windows 10 1709), попытаюсь собрать и интегрировать в программу, чтобы можно было при создании системного процесса в сессии 0 осуществлять переход на соответствующий рабочий стол.
если кому интересно, могу описать этот процесс, реально круто и познавательно
Вложения
Тип файла: 7z KernelExplorer.7z (149.8 Кб, 10 просмотров)
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
06.11.2020, 12:43  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
если кому интересно, могу описать этот процесс, реально круто и познавательно
готово https://www.cyberforum.ru/blog... g6813.html
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
08.11.2020, 13:52  [ТС]
В новой сборке добавлено:
- теперь возможно вывести список всех процессов с их идентификаторами командой lp


- для удобства получения информации теперь можно вводить как имя процесса так и его идентификатор
есть куча процессов с одинаковыми именами (svchost.exe) но разными id, теперь о них можно получать информацию
а также есть процессы с именами, но эти имена "инертны" (например Memory Compression), и вывести их информацию можно только по id
Вложения
Тип файла: 7z KernelExplorer.7z (151.6 Кб, 5 просмотров)
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
11.11.2020, 00:28  [ТС]
Начал прорабатывать новую группу управления - Сервисы.
Меню расширилось до


Главная идея - прикрутить службу UI0Detect (о которой я рассказывал в своём блоге) от Windows 10 1709 к последующим версиям Windows 10.
Команда ui0 создаёт сервис и частично настраивает его как UI0Detect в Windows 7.
Остальные настройки (привилегии и ещё кое-что) установлены как у FireDaemon (в планах дизассемблировать их тулзу, чтобы посмотреть как всё устроено)


Команда ls выводит список всех установленных сервисов в системе (активные и остановленные).
ОС видит созданный сервис UI0Detect


При попытке запуска выдаёт ошибку


План следующий: кто читал блог, тот в курсе, что для запуска сервиса система, в лице Wininit.exe, своей внутренней функцией RegisterSession0ViewerWindowHookDll, должна вызвать функцию Session0ViewerWindowProcHook из Wls0wndh.dll
Умники из Microsoft в версиях Windows 10 1803 и новее просто взяли и вырезали RegisterSession0ViewerWindowHookDll из Wininit.exe (уже дизассемблировал разные версии и сравнивал).
У сервиса (один из svchost.exe), к которому цепляется FireDaemon, я перехвачу хендл и создам в его процессе удаленный поток на функцию Session0ViewerWindowProcHook. При создании процесса в сессии 0, сервис должен будет запустить удаленный поток, тем самым запустить всю цепочку UI0Detect. Будет ли это работать пока не знаю, подозреваю система упадёт в синьку.
Поэтому, если у кого-то есть какие-нибудь идеи, буду рад выслушать


Сборку выкладывать пока не буду (ещё не дописан код для CreateService).
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
13.11.2020, 16:32  [ТС]
Пытаюсь позвать функцию RegisterSession0ViewerWindowHookDll отдельно от Wininit.exe
Её суть заключается в передачи валидного дескриптора hdeskApplication во внутреннюю функцию ResilientSwitchDesktop(HDESK hDesktop) которая в 1803 и выше теперь называется ResilientSwitchDesktopWithFade.
Внутри неё происходит просто переключение SwitchDesktop(hDesktop).

Но чтобы получить валидный дескриптор hdeskApplication нужно позвать ещё одну внутреннюю функцию Wininit.exe - CreatePrimaryTerminal
Опять же, начиная с 1803 microsoft обернул её более сложным прототипом PrimaryTerminalAndHookWorker, который располагается в wininitext.dll
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
__int64 __fastcall PrimaryTerminalAndHookWorker(
    HWINSTA* s_hWinsta,
    HDESK* s_hdeskWinlogon,
    HDESK* s_hdeskApplication,
    __int64 g_Context,
    PWORD g_usState,
    __int16 a6, // = 6
    PWORD v63,
    PSID g_pSidSystem,
    PSID g_pSidLocalService,
    PSID g_pSidLocal,
    PSID g_pSidWorld,
    PSID g_pSidAdmin,
    PSID g_pSidPowerUser,
    PSID g_pSidCreator,
    PSID g_pSidRestricted,
    PSID g_pSidInteractive,
    PSID g_pSidService,
    PSID g_pSidWindowManager,
    PSID g_pSidFontDriverHost,
    PSID g_pSidAnyPackage,
    PSID g_pSidAnyRestrictedPackage
)
{
    WMsgClntInitialize((struct WI_GLOBAL_CONTEXT*)&g_Context, 1);
 
    LPVOID lpMem[5]{};
 
    __int64 result = CreatePrimaryTerminal(s_hWinsta, lpMem, s_hdeskWinlogon, s_hdeskApplication, g_Context);
 
    if ((DWORD)result) {
        *v63 = 1;
    }
 
    else {
        *g_usState = a6;
        HeapFree(GetProcessHeap(), 0, lpMem[0]);
        UpdatePerUserSystemParameters(0);
        result = 0;
    }
 
    return result;
}
CreatePrimaryTerminal сама по себе тоже нехилая функция, вкратце она делает следующее:
- регистрируется процесс services.exe
- создаётся рабочая станция WinSta0
- создаётся рабочий стол Winlogon
- если Winlogon валиден создаётся рабочий стол Default
- всё это регается и создаётся трейд с не менее внушительной callback функцией LaunchUmfdHostWithVirtualAccountThreadPr oc
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
__int64 __fastcall CreatePrimaryTerminal(
    HWINSTA* hWinsta,
    LPVOID* lpMem,
    HDESK* hdeskWinlogon,
    HDESK* hdeskApplication,
    __int64 g_Context
) 
{
    __int64 v39 = 0;
 
    if (RegisterLogonProcess(NtCurrentTeb()->ClientId.UniqueProcess, TRUE)) {
        HWINSTA v10 = CreateWindowStationW(L"WinSta0", 0, 0x2000000, 0);
        SetProcessWindowStation(v10);
        HDESK v17 = CreateDesktopW(L"Winlogon", 0, 0, 0, 0x2000000, 0);
        if (v17) {
            HDESK v18 = CreateDesktopW(L"Default", 0, 0, 0, 0x2000000, 0);
            SwitchDesktop(v17);
            SetThreadDesktop(v17);
            SetWindowStationUser(*v10, &v39, 0, 0);
            CreateThread(0, 0, LaunchUmfdHostWithVirtualAccountThreadProc, 0, 0, 0);
        }
    }
 
}
WMsgClntInitialize регистрирует RPC сервер и запускает ncalrpc
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
__int64 __fastcall WMsgClntInitialize(struct WI_GLOBAL_CONTEXT* a1, int a2)
{
    SIZE_T v5[9]{};
    DWORD v2 = NO_ERROR;
 
    if (a2) {
        v5[0] = WMsgMessageHandler;
        v5[1] = WMsgMessageHandler;
        v5[5] = WMsgNotifyHandler;
        v5[2] = WMsgPSPHandler;
        v5[6] = WMsgBroadcastMessageHandler;
        v5[7] = WMsgBroadcastNotifyHandler;
 
        RegisterWMsgServer(v5);
        v2 = StartWMsgKServer(v3); // ncalrpc
}
В общем то нить прослеживается как всё же добраться до сессии 0 (переключиться на рабочий стол), что-то подобное реализовано FireDaemon Zero.
Но какая же каша этот internal, просто ужас..
0
Всегда онлайн
 Аватар для MrOnlineCoder
1084 / 788 / 295
Регистрация: 07.04.2013
Сообщений: 2,703
13.11.2020, 17:55
Цитата Сообщение от _lunar_ Посмотреть сообщение
PrimaryTerminalAndHookWorker(
    HWINSTA* s_hWinsta,
    HDESK* s_hdeskWinlogon,
    HDESK* s_hdeskApplication,
    __int64 g_Context,
    PWORD g_usState,
    __int16 a6, // = 6
    PWORD v63,
    PSID g_pSidSystem,
    PSID g_pSidLocalService,
    PSID g_pSidLocal,
    PSID g_pSidWorld,
    PSID g_pSidAdmin,
    PSID g_pSidPowerUser,
    PSID g_pSidCreator,
    PSID g_pSidRestricted,
    PSID g_pSidInteractive,
    PSID g_pSidService,
    PSID g_pSidWindowManager,
    PSID g_pSidFontDriverHost,
    PSID g_pSidAnyPackage,
    PSID g_pSidAnyRestrictedPackage
)
А это нормальная практика в таких огромных проектах как винда пихать в функцию столько параметров?

И кстати, в интернете же есть исходные коды Windows 2000 / Windows XP, вы видели их и использовали ли для своей наработки? Понимаю, что между кодом ядра windows xp и windows 10 огромная разница, но все же.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
13.11.2020, 18:51  [ТС]
Цитата Сообщение от MrOnlineCoder Посмотреть сообщение
есть исходные коды Windows 2000 / Windows XP
видел, и скажу вам больше - есть исходники и win2k, и даже частично win10
но применить их на новых версиях win10 практически невозможно в следствии того, что либо эти участки кода по новой переписаны в ядре (что сводит слитые исходники к бесполезному набору кода), либо вырезаны вовсе.

Цитата Сообщение от MrOnlineCoder Посмотреть сообщение
А это нормальная практика в таких огромных проектах как винда пихать в функцию столько параметров?
в windows это нормально) 23 параметра это ещё мало, встречал функции с 50
internal функции очень масштабны (в среднем более 1000 строк одна функция), плюс в этих тысячи строках куча других internal функций (порой кажется, что можно проваливаться в дизассемблере бесконечно), и всё это переплетено в огромный кошмарный, в плане понимания внутреннего устройства программы, узел.

Добавлено через 20 минут
И ещё один момент:
в библиотеке wininitext.dll, начиная с 1803, есть функция с интересным названием UIStartupWorker()
Собственно она ничего не делает, и только возвращает 0
прототип что-то вроде
C++
1
2
3
4
void UIStartupWorker()
{
    return 0;
}
Её применение в Wininit.exe я не нашёл. Думаю что на данном этапе (сборка 10.0.19041.546) это функция просто заглушка.
Скорее всего реализация этой функции появится в новых версиях.
В любом случае, за развитием UIStartupWorker нужно будет следить, есть подозрения что это некая замена UI0Detect.
0
Всегда онлайн
 Аватар для MrOnlineCoder
1084 / 788 / 295
Регистрация: 07.04.2013
Сообщений: 2,703
13.11.2020, 19:33
Цитата Сообщение от _lunar_ Посмотреть сообщение
internal функции очень масштабны (в среднем более 1000 строк одна функция), плюс в этих тысячи строках куча других internal функций (порой кажется, что можно проваливаться в дизассемблере бесконечно), и всё это переплетено в огромный кошмарный, в плане понимания внутреннего устройства программы, узел.
Интересно, это просто сроки вынудили программеров так делать, или это осознанное решение и типа по другому сделать нельзя? А в коде линукса такое есть?

Я когда смотрел сорсы win2k, то там комментариев с документацией нормально так было, т.е. ребята вроде тогда старались все по красоте еще сделать (но это не остановило серию зависаний винды того времени, к сожалению)) ).
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
14.11.2020, 00:36  [ТС]
Цитата Сообщение от MrOnlineCoder Посмотреть сообщение
А в коде линукса такое есть?
с исходниками линукса знаком поверхностно (только в ознакомительных целях).

Цитата Сообщение от MrOnlineCoder Посмотреть сообщение
по другому сделать нельзя?
мне кажется там уже ничего не сделаешь.
объемы контента такие, что урезать код уже не куда.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
14.11.2020, 00:55  [ТС]
Выкладываю новую сборку.
В комплекте лежит сервис UI0Detect.exe и его библиотека WlS0WndH.dll (от Windows 10 1709).
Добавлен новый инструментарий по работе с сервисами:
- ls выводит список всех сервисов в системе (желтый цвет - сервис остановлен (stopped), зеленый цвет - запущен (running))
- os открывает сервис для вывода информации
- cs на данный момент не реализован
- ss запускает/останавливает сервис в зависимости от его состояния (на сервисах драйверов скорее всего не работает)
- ds удаляет сервис
- ui0 ну и самое интересное: создаёт сервис UI0Detect (поэтому файлы и лежат теперь с программой, т.к. с Windows 10 1803 этих файлов в системе больше нет) в остановленном состоянии (функцию RegisterSession0ViewerWindowHookDll и её реализацию на данный момент я отключил во избежание различного рода проблем).
После создания сервиса UI0Detect не забывайте его удалять!
На ОС до Windows 10 1709 создавать UI0Detect не рекомендуется, он итак у вас уже есть и вполне себе работает.


Продолжаю искать способ его запуска. Сервис, обнаружив оконную процедуру в сессии 0, должен стартануть и создать себе процесс, как он это делает в Windows 7

но пока безрезультатно.

Хотя переключение на другие рабочие столы в сессии 1 через Session0ViewerWindowProcHook вполне работает.
Когда реализую обратный выход на рабочий стол Default добавлю этот функционал, т.к. сейчас обратного выхода нет и вы будете смотреть только на черный экран с курсором мыши
Вложения
Тип файла: 7z KernelExplorer.7z (180.1 Кб, 7 просмотров)
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
06.12.2020, 22:09  [ТС]
Новая сборка.
- пофиксил найденные мною ошибки
- оптимизация кода для вспомогательных программ (запуск от админа и Nt авторизация для LocalSystem)
- улучшения кода для блока Service
- ну и самое интересное: по команде ui0 осуществляется переход на рабочий стол Winlogon (для возврата на рабочий стол Default предусмотрен специальный message).

Механизм перехода на рабочие столы отлажен полностью.
Продолжаю поиски получения валидного дескриптора HDESK рабочего стола Default сессии 0.
Вложения
Тип файла: 7z KernelExplorer.7z (154.0 Кб, 7 просмотров)
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
07.12.2020, 11:32  [ТС]
Интересный факт сейчас обнаружил с использованием Explorer++

Моя программа пока без GUI интерфейса (времени всё нет сесть и написать).
Стандартный Explorer уже загружен в систему и его повторный вызов приводит к перезапуску проводника.
Поэтому я решил попробовать поэкспериментировать с альтернативным проводником.
На глаза попался Explorer++

Запустил его на рабочем столе Winlogon:
команда 'cp' -> путь до 'Explorer++.exe' -> выбираем '2' (System process) -> выбираем '2' (USER_SESSION_ID) -> выбираем '2' (Winlogon) -> команда 'ui0'
Ок, проводник запущен на рабочем столе Winlogon сессии 1 (выбор рабочего стола не важен, можно всё тоже самое проделать на Default).
Теперь можно шариться по системе. Запустил из Explorer++ программу Process Hacker.
Т.к. Explorer++ запущен как системный процесс, то всё что он запускает тоже является системным процессом, в частности Process Hacker.
Иными словами в данном случае Explorer++ является частью системы и спокойно позволяет открыть например папку C:\Program Files\WindowsApps, по умолчанию к которой пользователь не имеет доступа.
Соответственно делать с потрахами этой папки всё что угодно (кому там нужно удалить не удаляемые стандартные приложения типа OneDrive и прочей лабуды).

Но будьте аккуратны, я создал настолько мощный инструмент, что неправильные действия могут обрушить систему в синьку (к примеру запуск wininit.exe из Explorer++ вызывает моментальный BSOD в связи со смертью критического процесса).
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
07.12.2020, 16:08  [ТС]
Цитата из моего блога
Рабочих столов также есть несколько видов:
- Default основной рабочий стол, куда загружается Проводник системы (explorer.exe)
- Winlogon, рабочий стол приветствия входа в систему (запрос логина и пароля)
- Disconnect малоизученный рабочий стол (процесс создаётся в нём, но где он отображается, мне найти пока не удалось)
- кроме того есть ещё один рабочий стол - Secure Desktop for UAC (название не точное).
Удалось найти рабочий стол Disconnect


Загрузил на этот рабочий стол Explorer++ и осуществил переход по валидному HDESK.
Очень странный рабочий стол - сообщение для перехода не появляется, приходится переходить обратно на Default по таймеру.
К тому же, загруженный Explorer++ как-будто сломан - окно отображено, но на нём нет никаких контролов (ListView, кнопки и прочее) и оно не активно (переместить либо закрыть нельзя).
Вот уж точно малоизученный рабочий стол - никакой информации в интернете нет, приходится по крупицам выуживать из системы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.12.2020, 16:08

QODBC (MS SQL SERVER) . Driver not loaded Driver not loaded
Собрал себе драйвер QODBC. mingw x86. QSqlDatabase::drivers() возвращает (QSQLITE, QMYSQL, QMYSQL3, QODBC, QODBC3, QPSQL, QPSQL7) ....

На машине клиента "QSQLITE" выдает: Driver not loaded Driver not loaded
#include <QSqlDatabase> #include <QSqlQuery> #include <QSqlRecord> #include <QSqlError> #include <QDebug> #include <QFileDialog> ...

Ошибка - Driver not loaded Driver not loaded
Собрал драйвер MySQL. Пытаюсь запустить простое приложение - подключиться к базе и выполнить sql - запрос. Но получаю сообщение , которое...

Wi-FI driver
Нету драйверов на ОС. Помогите их настроить. Прочитал множество информации по установке драйверов на Д, но все ровно не получается....

Wi-Fi driver
Здравствуйте. У меня Ubuntu 10.04 Не могу установить драйвер для вай фая. http://www.broadcom.com/support/802.11/linux_sta.php ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru