Wednesday, 8 April 2020

Регулярные выражения в PowerShell #2.

Всем привет.

Сегодня еще кое что из книги "Keith Hill, Эффективное программирование в Windows PowerShell. 2009". На сей раз еще раз про регулярные выражения. 

Известно что PowerShell основан на .NET Framework. То есть, он построен с использованием .NET Framework и предоставляет возможности .NET Framework пользователю. Одна из наиболее удобных возможностей в .NET Framework - класс Regex в пространстве имён System.Text.RegularExpressions. Это очень мощный механизм регулярных выражений. PowerShell использует его в ряде сценариев с помощью:
• оператора -match
• оператора -notmatch
• параметра -Pattern командлета Select-String.

Конечно,   чтобы   использовать   эти   операторы   и   Select-String   максимально   эффективно, необходимо хорошо понимать применение регулярных выражений. Справочная система PowerShell содержит раздел с именем "about_Regular_Expression", который вы можете вызвать так:
PS> help about_reg*

Данный раздел представляет собой лишь краткое справочное руководство по различным метасимволам, с его помощью вы не научитесь создавать мощные регулярные выражения. Чтобы узнать, как получить максимальную отдачу от регулярных выражений, и, следовательно, PowerShell, я очень рекомендую прочитать книгу Jeffrey Friedl Mastering Regular Expressions (Джеффри Фридл, Регулярные выражения). В   механизме   поддержки   регулярных   выражений   PowerShell   существует   один   недостаток,   который необходимо знать. Большинство других скриптовых языков поддерживают синтаксис, позволяющий обнаружить все вхождения шаблона в строке. Например, в Perl я могу сделать так:

$_ = "paul xjohny xgeorgey xringoy stu pete brian"; # PERL script
($first, $second, $third) = /x(.+?)y/g;

К сожалению, командлет Select-String не поддерживает эту возможность в версии 1.0. Тем не менее, вы можете обойти это ограничение, используя класс System.Text.RegularExpressions.Regex напрямую. Нет необходимости   указывать   имя   класса   полностью,   PowerShell   имеет   для   него   псевдоним   [regex]. 

Например:
PS> $str = "paul xjohny xgeorgey xringoy stu pete brian"
PS> $first,$second,$third = ([regex]'x(.+?)y').Matches($str) |
>>Foreach {$_.Groups[1].Value}
PS> $first
john
PS> $second
george
PS> $third
ringo

Одна из вещей, за которой необходимо тщательно следить - написание регулярного выражения для поиска во всей строке. Например, вы решили использовать Get-Content для получения содержимого файла и применения к нему регулярного выражения. В этом случае необходимо помнить, что Get-Content считывает файл частями - строка за строкой. Для применения регулярного выражения ко всему содержимому файла, необходимо будет преобразовать это содержимое в одну строку. Я могу сделать это в PowerShell 1.0, например, так:

PS> $regex = [regex]'(?<CMultilineComment>/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)'
PS> Get-Content foo.c | Join-String -Newline | Foreach {$regex.Matches($_)} |
>> Foreach {$_.Groups["CMultilineComment"].Value}
>>

Здесь я использовал командлет Join-String, разработанный PowerShell Community Extensions, который принимает отдельные строки, выводимые Get-Content, и создаёт из них одну строку. Также в примере использован именованный захват CMultilineComment. Этот пример демонстрирует, что при отсутствии возможностей в самом PowerShell, использование среды .NET может стать замечательным "запасным выходом".

Начиная с версии PowerShell 2.0 появились новые возможности, помогающие выполнять поиск в вышеописанном случае. Во-первых,   добавлен   оператор   объединения,   с   помощью   которого   можно   соединять  многострочный текст в одну строку. Во-вторых, в Select-String появились новые параметры, такие как -Context, -NotMatch и -AllMatches. Параметр AllMatches как раз подходит для решения предыдущей задачи. Вот как можно теперь выполнить поиск комментариев:

$pattern = '(?<CMultilineComment>/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)'
PS> (get-content .\foo.c) -join "`n" | Select-String $pattern -all |
>>Foreach {$_.Matches} | Foreach {$_.Value}

Использование   регулярных   выражений   -   очень   мощный   инструмент   PowerShell.   Научитесь   его использовать, и он откроет вам много возможностей поиска и обработки текстовых данных.

Tuesday, 7 April 2020

Story Graph в McAfee.

Всем привет.

В McAfee ENS 10.7 появилась новая функция Story Graph. Story Graph - это удобная визуализация обнаружений угроз, не связанных с использованием файлов (еРО\Threat Event Log).



Диаграмма истории в журнале событий угроз – это визуальное представление обнаружений угроз, не связанных с использованием файлов. Можно изучить контекст угроз, просмотрев подробные сведения о событиях, которые привели к обнаружению. Диаграмма истории помогает определить выполнение, причину, по которой ATP распознает это выполнение как вредоносное, источник и точку цепи атаки, на которой модуль ATP остановил угрозу.

Весьма полезная функция для аналитика.

Sunday, 5 April 2020

Select-String и регулярные выражения в Windows PowerShell.

Всем привет.

Часто можно встретить вопросы связанные не столько с самим PowerShell, сколько с применением в нем регулярных выражений. Это и понятно - регулярные выражения (regexp, regular expressions) обладают огромной мощью, и способны сильно упростить жизнь системного администратора или программиста. Однако в мире системного администрирования Windows они мало известны и непопулярны - в cmd.exe практически единственная возможность их применения это утилита findstr.exe, которая обладает очень маленьким функционалом и использует жутко урезанный диалект регулярных выражений. В VBScript функционал регулярных выражений тоже хорошо запрятан, и практически не используется. А вот в PowerShell, авторы языка позаботились о том чтобы регулярные выражения были легко доступны, удобны в использовании и максимально функциональны. Тем более что с последним пунктом всё оказалось достаточно просто - PowerShell использует реализацию регулярных выражений .NET, а она является одной из самых функциональных и производительных, и даже способна потягаться даже с признанным лидером в этой области - perl.

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

Впрочем знакомство с регулярными выражениями лучше начать не с них, а с более простой технологии которая служит подобным целям, с которой знакомы все Windows администраторы – с подстановочных символов. Наверняка вы не раз выполняли команду dir, и указывали ей в качестве аргумента маску файла, например *.exe. В данном случае звёздочка означает “любое количество любых символов”. Аналогично можно использовать и знак вопроса, он будет означать “один любой символ”, то есть dir ??.exe выведет все файлы с расширением .exe и именем из двух символов. В PowerShell'овской реализации подстановочных символов можно применять и еще одну конструкцию — группы символов. Так например [a-f] будет означать “один любой символ от a до f (a,b,c,d,e,f) ”, а [smw] любую из трех букв (s, m или w). Таким образом команда get-childitem [smw]??.exe выведет файлы с расширением .exe, у которых имя состоит из трех букв, и первая буква либо s, либо m, либо w. Неплохо, неправда ли? Так вот, по сравнению с возможностями регулярных выражения - это пустяки. 

Saturday, 4 April 2020

Reboot of mankind.

Всем привет. На тему дня.

"Эта музыка будет вечной если я заменю батарейки"
Наутилус-Помпилиус.

В комнате совещаний было жарко. Алистер не привык к такой манере ведения разговоров. Тем более что важного незнакомца никто не представил, а на его электронном пропуске многозначительно было указано "Guest". Гость начал разговор первым и сразу пошел в атаку. Указывая пальцем на визуальную диаграмму отражающую масштабы распространения вируса по планете он явно хотел чтобы ему открыли все. Пусть выговориться - решил Алистер -, эта комната не предназначена к скандалам. Но гость не унимался...

- О чем вы говорите? Опять эти ваши эксперименты по выходным?!
- Нет, никаких экспериментов. Только то что было проекте. Мы получили результат которого добивалась вся наша команда целый год.
- А потом, как это бывает в кино, он вышел из под контроля...
- Да нет же - ничего не вышло из под контроля! Все согласно спецификации и требований заказчика. Можете проверить сами.
- Еще как проверю! Но, скажи мне другое - Как эта зараза попала к человеку? В его организм, а? Вы слышите меня, черт возьми?!
- Не знаю точно, но...
- Он не знает! Непостижимо! Вы уже год занимаетесь этим проектом, съели собаку или даже стаю на AI, в твоей команде работают лучшие кодировщики вашей кампании. И ты не знаешь? Ты вообще менеджер или кто?! Еще раз - как Это попало в человека? Вы что, чип в него вставили? Нанотехнологии? Или какую другую хрень ему ввели? Это инъекция, да? Какая, говори?!

Их разговор уже на "ты" явно переходил в информационный шум. В комнате совещаний 31-го отдела кампании повисла пауза. Чашка остывшего кофе на стеклянном столике осталась нетронутой. Градус беседы явно был выше и мог без труда ее подогреть ее еще раз. Алистер еще раз взглянул на своего гостя, тяжело вздохнул и спокойно продолжил.

Friday, 3 April 2020

OpenSSH Server в Windows 10.

Всем привет.

Должно быть вы уже в курсе  что Windows 10  имеет фишки из серии Feature-on-Demand, а именно OpenSSH Client и OpenSSH Server.

Для их установки (через UI) нужно открыть Парамерты -> Приложения -> Управление дополнительным компонентами -> Добавить компонент и выберите OpenSSH Client и/или OpenSSH Server. Как быть с клиентом я уже рассказывал. С сервером сложнее. Здесь нет UI. Однако эту операцию можно выполнить с помощью PowerShell. Убедимся что фичи (не)доступны:

Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
В результате мы должны увидеть что-то такое:

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent

Для установки сервера используйте следующую команду:

# Install the OpenSSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

Команда должна вернуть такой результат:

Path          :
Online        : True
RestartNeeded : False
Отлично! SSH установлен.

Версия на печать

Популярное