Pull to refresh
45
0

Windows system programmer, student.

Send message

Решил более детально замерить различные аспекты производительности создания процессов в Windows, вот мои результаты для Windows 10 20H2.

Обычный запуск, система без антивируса:

  • ~7 мс на ShellExecuteEx - высокоуровневый API оболочки предназначенный скорее для открытия файлов в приложении по умолчанию, чем создания процессов.

  • ~1.1 мс на CreateProcess - основной документированный метод.

  • ~0.8 мс на NtCreateUserProcess - нижележащий системный вызов.

  • ~0.9 мс на NtCreateProcessEx + NtCreateThreadEx - альтернативный (более старый) способ, требующий больше действию вручную.

Создание клона процесса (местный аналог fork), система без антивируса:

  • ~1.5 мс используя NtCreateUserProcess.

  • ~0.9 мс используя NtCreateProcessEx + NtCreateThreadEx.

В то же время, создание нового потока занимает всего ~0.03 мс, что намного быстрее.

Упомянутый выше NtCreateProcessEx имеет интересную особенность - он создаёт только объект процесса, без изначального потока. Поскольку драйвера, которые подписываются на синхронные уведомления о создании процессов (посредством PsSetCreateProcessNotifyRoutine) получают их только при создании первичного потока в целевом процессе, мы получаем возможность измерить "чистое" время создания процессов, без вклада от сторонних драйверов. В этом случае NtCreateProcessEx тратит ~0.6 мс.

Наличие в системе дополнительных драйверов (вроде антивируса или EDR), может существенно повлиять на результаты. Так, включённый Windows Defender даёт примерно +90% замедления, заставляя CreateProcess тратить по ~2.1 мс. Но это ещё ничего, если взять какой-нибудь откровенно плохой антивирус, например, китайский 360 Security, то можно замедлить CreateProcess в 200 (!) раз, до ~240 мс.

функцию Windows API с самым длинным именем — AccessCheckByTypeResultListAndAuditAlarmByHandle

DeriveRestrictedAppContainerSidFromAppContainerSidAndRestrictedName будет длиннее =)

У вас уж очень странный список «опасных» привилегий приведён. В него каким-то образом попали Change Notify, которая по-умолчанию выдана вообще всем, и Lock Memory, которой разве что физическую память можно исчерпать. В то же время, отсутствует Impersonate (которая по смыслу аналогична попавшей в список Assign Primary Token) и TCB, которая вообще чуть ли не самая мощная (и неспроста имеет описание «Действовать в качестве части операционной системы»).


Если кому интересно, вот примерный список того, как можно использовать различные привилегии для повышения прав:
  1. Create Token — создаём произвольные токены, включая в них любые группы и привилегии.
  2. Tcb — можем создавать токены любых пользователей без знания пароля + добавлять произвольное членство в группах.
  3. Take Ownership — если можем открыть объект хоть с какими-то правами, сможем открыть и с полными, назначив себя владельцем.
  4. Load Driver — доступ в ядро ОС.
  5. Backup/Restore — можем игнорировать назначенные права доступа к файлам и реестру на чтение/запись.
  6. Debug — полный доступ к высокопривилегированным процессам.
  7. Impersonate — действия от имени других пользователей (если удалось достать копию токена).
  8. Assign Primary Token — создание процессов от имени других пользователей (если удалось достать копию токена).
  9. Relabel — переопределение меток целостности, на которых основана одна из моделей безопасности.
  10. Manage Volume — переписываем права на доступ к файлам.

Да, именно так. Откройте свойства любого файла внути папки Документы, во вкладке Безопасность будет список тех, кому разрешён доступ. Так вот, там не будет ничего, что разрешает даже читать эти файлы изнутри AppContainer'а. Как же программы из Microsoft Store могут открывать и редактировать документы? Ответ — им для этого должен помочь специальный процесс, называемый брокером, который эти права имеет. Именно он показывает диалоги открытия/сохранения файлов, и, соответсвенно, требует участия пользователя.

ATMFD.DLL (в последних версиях ATMLIB.DLL), которая работает на уровне ядра ещё со времён NT

Работала. Да, ATMFD это драйвер режима ядра, но в Windows 10 его уже нет. Его замена — ATMLIB — обычная dll пользовательского режима. Эту часть функциональности они уже вынесли из ядра.


В результате мы получаем исполнение кода с правами приложения, в котором будет открыт вредоносный документ. Поскольку пользуются этой библиотекой в основном UWP-приложения, которые работают в AppContainer, — мы имеем исполнение произвольного кода уже в песочнице. И, в отличие от Контроля Учётных Записей, AppContainer признаётся Microsoft'ом за границу безопасности. И, для тех кто не знает, AppContainer реализует модель прав аналогичную андроиду: без явного разрешения не будет доступа ни к файлам, ни к интернету, ни к микрофону.


Пользователи Windows 10 могут расслабиться и спокойно ждать патча.

Есть такой проект — Kiwix. Это коллекция дампов сайтов вроде Википедии и StackOverflow + оффлайновая читалка для них (в том числе в виде сервера). Они используют специальный формат для хранения контента, со сжатием и полнотекстовым поиском. Русскоязычная Википедия без картинок, например, весит всего несколько гигабайт. Если сделаете дамп Хабра и опубликуете его на их платформе — будет просто замечательно.

На котятах так-то много чего объяснить можно:


— Записывай, даю тебе котят: серого, рыжего, чёрного. Теперь повтори. Напоминаю, их было 65536.
— Серый, рыжий, чёрный, ~8Пчћяу}ніІзІfНљ™5kЦ&{P@ssw0rd! цмдљL…

Отличный вопрос. Как и ожидалось, всегда видны изменения снаружи транзакций + внутри той, где был открыт дескриптор директории. Изоляция работает предсказуемо.


Из документации

Transacted Operations
If there is a transaction bound to the directory handle, then the notifications follow the appropriate transaction isolation rules.


Меня это ещё вот на какую мысль навело. Тот же Process Monitor имеет минифильтр в режиме ядра, а значит видит все операции. Но он не показыает, в контексте какой транзакции они были проведены. Получается, что транзакции — идеальный инструмент для запутывания логов Process Monitor'a =)

Про deprecated ответил выше. В конце-концов это всего лишь эксперимент, вся идея для программы и статьи возникла из неожиданной простоты реализации. Посмотрим.

Да, я тоже это заметил. Возможно, имеется ввиду именно Win32 API, поскольку в документации для драйверов об этом ничего нет. Учитывая, что я пользуюсь именно Native API, а также то, насколько Microsoft бережно относится к его обратной совместимости, надеюсь, они не уберут транзакции в ближайшем будущем.

Данный файл не получится так просто запустить, система ругается и отправляет нас думать о своем поведении

Это его с помощью CreateProcess не запустить, а вот с помощью RtlCreateUserProcess уже можно. Для этого даже утилиты есть. При отладке позволяет сэкономить довольно много времени. Другое дело, что NtDisplayString работать не будет, нужно как-то по другому выводить результат.

До сих пор встречаю инсталляторы, которые распаковываются в Temp и запускаются оттуда.


Запомните: корень папки Temp — это помойка, в ней может лежать что угодно, в том числе и любые dll, которые запущенная оттуда программа радостно подхватит. Если вам нужно распаковаться во временное хранилище и запустить оттуда код — создавайте хотя-бы подпапку со случайным именем.


P.S.

И то, даже в этом случае будет состояние гонки, так что по-хорошему на эту папку нужно ещё и правильный дескриптор безопасности навесить. Естественно, это относится к ситуации, когда пользователь работает со включённым UAC в Admin Approval Mode, ведь в этом случае папка Temp является общей для программ, работающих с разными уровнями привилегий.

Windows включает в себя 9 категорий аудита и 50 субкатегорий для тонкой настройки.

Уточнение: 50 их было в Windows Vista. В Windows 7 их 53. Windows 10 RS5 и того больше — 59.


Тем, кто серьёзно хочет изучить возможности аудита в Windows, рекомендую книгу Windows Security Monitoring: Scenarios and Patterns. Это что-то вроде справочного пособия по событиям из логов безопасности и возможным сценариям мониторинга.

Да, я как-то запихнул в его список автозамены тонну разнообразных символов, вводимых в TeX-овской нотации. Оказалось довольно удобно. Можно прямо в браузере написать \Delta и получить Δ. Или даже придумать что-нибудь своё вроде \ok для ✓ или --> для →.


Правда эта программа не для параноиков. Punto Switcher ставит глобальные хуки и подсовывает свою dll-ку во все процессы, до которых дотянется (хотя прекрасно может работать и без неё). И местами может вызывать этим глюки.

Хм… Вот держу сейчас в руках белый светодиодный фонарик, питающийся от одной батарейки AAA. Как это согласуется с табличкой про падение напряжения? Китайские инженеры опять нарушают законы физики?)
Насчёт первого пункта: на CodeProject есть редактор реестра на Native API, который позволяет работать с подобными именами.
Нужно будет вернуть посты-ссылки.

Только если в виде отдельного потока / раздела сайта / ещё чего. Мне не нравится идея видеть их вперемешку с полноценными статьями. Это совершенно разные форматы. Не стоит давать полноценным статьям (на создание которых может уходить довольно много ресурсов) теряться в потоке постов, написанных за несколько минут.


Я понимаю желание поделиться информацией с сообществом для её конструктивного обсуждения. Но в текущем формате Хабра это может иметь нежелательные последствия.

Кстати, помимо упомянутых torrent и ed2k ещё можно попробовать DC++ и Fopnu.
А с айпи да, это только смотреть, кто из них сможет нормально пробить NAT…
Это исключительно недоделка тех, кто выкладывал книгу. Текстовый слой и оглавление форматом-то поддерживается. В pdf тоже, знаете, иногда пихают просто набор jpeg-ов.

Information

Rating
Does not participate
Location
Россия
Registered
Activity