Содержание
- 2. Применение знаний ядра ОС Средства защиты информации – системы шифрования сетевого трафика, защита данных на диске
- 3. Применение знаний при разработке инфраструктуры анализа бинарного кода Драйвер получения информации: список процессов, модулей и копии
- 4. Структура курса Лекции + лабораторные задания: простейший драйвер ядра создание устройств и символических ссылок драйвером консольная
- 5. Программное обеспечение и литература Среда разработки для выполнения лабораторных работ развернута на виртуальной машине VirtualBox Там
- 6. VisualStudio 2008/2010 (WS 2010 не рекомендуется при отсутствии подключения к интернету) Пакет WDK 7.1.0, поддерживает все
- 7. Основные понятия Процессы, потоки и адресные пространства в ОС Windows: взаимосвязь с процессорной архитектурой Архитектура процессора
- 8. Защита памяти по привилегиям («кольца защиты») 0 1 2 3 User mode Kernelmode Передача управления Доступ
- 9. Особенности организации памяти в Windows на примере 32-разрядной адресации Вирт. адрес
- 10. VMCS Трансляция памяти при использовании гипервизора с включенным EPT Вирт. адрес селектор:смещение TLB (буфер ассоциативной трансляции)
- 11. ОС NT, хотя и использует селекторы, но использует их в минимальной степени. NT реализует плоскую 32-разрядную
- 12. Реальная защита памяти по привилегиям, как и реализация понятия адресное пространство, осуществляется посредством механизма страничной организации
- 13. Виртуальное адресное пространство процесса 0 2Гб 4Гб user kernel 0 3Гб 4Гб user kernel Код и
- 14. Каталоги страниц всех процессов организованы так, что преобразование линейного в физический адрес для системного диапазона любого
- 16. Каталоги страниц позволяют создавать «совместно используемые» как внутри одного, так и между несколькими адресными пространствами области
- 17. Разновидность такого механизма – copy-on-write – используется для реализации механизма отображения файлов в память, через который
- 18. Загрузка модулей в адресное пространство Исполняемые файлы в ОС Windows имеют формат PE (Portable Executable). При
- 19. При завершении загрузки модуля со всеми его зависимостями управление передается на функцию – точку входа в
- 21. Поддержка многозадачности Механизм аппаратной поддержки многозадачности, предоставляемый архитектурой x86 (task switching) – в Windows не используется
- 22. Основные понятия: подведение итогов Процесс – соответствует некоторому запущенному в ОС приложению. Процесс можно рассматривать как
- 23. Адресное пространство – диапазон виртуальных адресов, доступный процессу. Для некоторой части этих адресов средствами ОС при
- 24. TSS – Task State Segment Процессор определяет 5 структур для организации переключения задач (multitasking): TSS -
- 26. Переключение на другую задачу осуществляется в одном из 4 случаев: выполняется инструкция JMP или CALL на
- 27. Обработка прерываний и исключений Два механизма прерывания работы программы interrupt – асинхронное событие, как правило генерируемое
- 28. DPL задает ограничение на уровень привилегий кода, который пытается вызвать прерывание (код 3-го кольца защиты не
- 29. EFLAGS EIP CS Error code Свободная часть стека Занятая часть стека ESP перед вызовом прерывания ESP
- 30. Поток – единица исполнения в ОС Windows. Механизм вытесняющей многозадачности, реализуемый ОС, применяется именно к потокам.
- 31. Система приоритетов Windows NT имеет двухуровневую модель приоритетов: Приоритеты высшего уровня (уровни запросов прерываний - Interrupt
- 32. Классы приоритетов в Win32 API 0 31 для 32-разрядных ОС 15 для 64-разрядных ОС Приоритет из
- 33. Приоритеты планирования Схема приоритетов, реализуемая ядром ОС: При запуске потоку назначается базовый приоритет (б.п.). В процессе
- 34. Планировщик Windows реализует «карусельную» (round-robbin) схему переключения потоков по правилу: Если есть потоки из диапазона realtime
- 35. Планировщик Windows реализует «карусельную» (round-robbin) схему переключения потоков по правилу: Если есть потоки из диапазона realtime
- 36. Если потоков с realtime-приоритетом нет – карусельная схема для всех потоков с динамическим диапазоном приоритетов. Для
- 37. Диаграмма состояния потоков
- 38. Готов (Ready). Поток готов к выполнению/рестарту после завершения ожидания. При поиске потока для выполнения диспетчер рассматривает
- 39. Уровни запросов прерываний (IRQL) IRQL – способ управления маскированием прерываний на конкретном процессоре. По сути –
- 40. На уровне IRQL DISPATCH_LEVEL работают так называемые «отложенные процедуры» (Deferred Procedure Calls - DPC), поэтому этот
- 41. при работе процессора на уровне IRQL≥DISPATCH_LEVEL запрещено обращение к выгружаемой памяти – оно немедленно приведет к
- 42. Код потока ISR 1 начало t1 PASSIVE_LEVEL Обработка очереди DPC ISR 2 ISR 1 продолжение Доставка
- 43. !!!В Win10 – появился Rank
- 44. Основные структуры управления памятью ОС Windows Cr3 -> Page Directory, Page Tables (Каталог и таблицы страниц)
- 45. FS:[0] Основные структуры управления процессами и потоками PEB *Peb TEB (Thread Environment Block) TIB FS:[0] FS:[0]
- 46. Пространство имен диспетчера объектов
- 47. Имена ядерных объектов размещаются в едином пространстве имен. Подсистема Win32 скрывает его наличие, транслируя обращения к
- 48. «Забегая вперед» Неразобранная часть имени, если она есть, хранится в стеке размещения в/в в поле FileName
- 49. Структура драйвера Работа драйвера начинается с вызова функции DriverEntry, соответствующей начальной точке входа в исполняемый модуль
- 50. ограничения Проблема при попытке написания кода драйвера на C++: функция main() – не первая функция с
- 51. Многоуровневая модель драйверов Legacy Drivers – WDM – KMDF – WDF Legacy Drivers – по сути
- 52. VisualStudio2019 + WDK for Windows 10 version 2004 (по состоянию на 01.09.2020) https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk Выбрать Desktop development
- 55. Выбор целевой ОС (сборка для Win7 будет работать и на WinXP)
- 56. Изменить свойства проекта
- 57. Интеграции WDK с VisualStudio –VisualDDK
- 59. #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif #include NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { DbgPrint("simple:
- 60. #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif #include void OnUnload(IN PDRIVER_OBJECT DriverObject) { DbgPrint("simple: OnUnload\n"); } NTSTATUS
- 61. Регистрация и запуск/остановка драйвера Внести изменения в reg-файл (в директории с проектом драйвера): "Start"=dword:00000003 "ImagePath"="\\??\\c:\\work\\drv\\l1\\l1\\x64\\Debug\\l1.sys“ (путь
- 62. #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif #include void OnUnload(IN PDRIVER_OBJECT DriverObject) { DbgPrint("simple: OnUnload\n"); IoDeleteDevice(DriverObject->DeviceObject); }
- 63. #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif #include void OnUnload(IN PDRIVER_OBJECT DriverObject) { UNICODE_STRING Win32Device; DbgPrint("simple: OnUnload\n");
- 64. Взаимосвязь основных ядерных объектов при прохождении запроса в/в
- 65. DRIVER_OBJECT Найти устройство по имени int 2E SYSCALL SYSENTER DeviceObject MajorFunction[] DriverUnload() CreateFile(filename, …) NtCreateFile(filename, …)
- 66. DRIVER_OBJECT Найти файловый объект по описателю int 2E SYSCALL SYSENTER DeviceObject MajorFunction[] DriverUnload() ReadFile(hfile, …) NtReadFile(hfile,
- 67. Структура управляющей программы Функции WinAPI OpenSCManager() CreateService() DeleteService() StartService() ControlService() CloseServiceHandle() CreateFile() CloseHandle() Решаемая задача 1.
- 68. Как выяснилось большинство из вас нифига не помнят/не знают базовые вещи по языку С/С++, а потому
- 69. В английском языке для c/cpp используется ДВА термина: declaration (объявление), описывает переменную некоторого типа НО НЕ
- 70. Сборка проекта (build): препроцессинг, компиляция, компоновка(линковка) Проект программы (project в терминологии visualstudio) состоит из множества c/cpp
- 71. Общее правило для проекта программы, состоящего из нескольких c/cpp – файлов: В заголовочных файлах – только
- 72. Каждый c/cpp-файл является единицей компиляции и НЕЗАВИСИМО от остальных файлов проекта проходит через этапы: Препроцессинг: все
- 73. Компиляция: генерация псевдокода в терминах некоторого промежуточного языка (трехадресный код, llvm-представление) или сразу в виде команд
- 74. После того как все файлы проекта без ошибок прошли препроцессинг и компиляцию, происходит этап компоновки он
- 75. .h .h file1.cpp file2.cpp file4.asm Компилятор языка c++ Транслятор языка ассемблер Препроцессор языка c++ Препроцессор языка
- 76. Как запустить сборку (build) проекта Правый клик мышкой на имени проекта – всплывающее меню – Build
- 77. Как запустить компиляцию конкретного c/cpp-файла или единицы компиляции Правый клик мышкой на имени файла – всплывающее
- 85. Оптимизация как часть процесса компиляции Сам процесс компиляции довольно сложен и является объектом научных исследований в
- 100. Дополнительные ссылки «Для чайников» про то же, но в gcc: https://habr.com/ru/post/478124/ А вот «продвинутая» статья по
- 101. Precompiled headers - предварительно откомпилированные заголовки Количество строк кода в стандартных заголовочных файлах операционной системы как
- 102. Для этого надо сделать три вещи: в свойствах проекта в настройках компилятора С/С++ в подпункте Precompiled
- 103. В свойствах каждого c/cpp-файла, для которого хотим задействовать процесс предварительной компиляции заголовков, делаем то же самое,
- 104. В текст c/cpp-файла, для которого хотим задействовать процесс предварительной компиляции заголовков, через #include включить заголовочный файл,
- 105. В текст предварительно компилируемого h-файла, указанного в настройках предварительной компиляции (у нас это stdafx.h), через #include
- 106. Теперь возвращаемся к структуре текущего проекта на следующем слайде - упрощенная схема проекта с пояснениями попытайтесь
- 107. Программа с графическим интерфейсом (GUIApp) scm.h scm.cpp class CguiappApp : public CWinAppEx { virtual BOOL InitInstance();
- 108. Программа с графическим интерфейсом (GUIApp) Консольная программа(TestCons) class CguiappApp : public CWinAppEx { virtual BOOL InitInstance();
- 109. В классе CSCM хотим сделать аналог функции printf, которая печатает диагностические сообщения Первый параметр – строка
- 110. Программа с графическим интерфейсом (GUIApp) Консольная программа(TestCons) class CguiappApp : public CWinAppEx { virtual BOOL InitInstance();
- 111. Кроме обычной форматированной печати строки, нужно уметь получать код и выводить текстовое описание ошибок, возникающих при
- 112. Программа с графическим интерфейсом (GUIApp) Консольная программа(TestCons) class CguiappApp : public CWinAppEx { virtual BOOL InitInstance();
- 113. Два вопроса: как превратить переменное число аргументов (…) в единственный параметр argptr типа va_list? Как получить
- 114. Как превратить переменное число аргументов (…) в единственный параметр argptr типа va_list? Для этого в стандартной
- 115. Мы хотим сделать наш класс управления сервисами CSCM быстро переносимым в другие проекты, в частности в
- 116. Как из функции pf() - члена класса CSCM вызывать функцию vpf() класса диалогового окна CguiappDlg для
- 117. Программа с графическим интерфейсом (GUIApp) Консольная программа(TestCons) class CguiappApp : public CWinAppEx { virtual BOOL InitInstance();
- 118. Пример переноса CSCM в консольную программу (TestCons) – когда надо управлять драйвером без использования GUI #include
- 119. Как получить код ошибок и текстовое описание ошибок, возникающих при работе системных WinAPI-функций? Использование функций FormatMessage()
- 120. Пример использования функции FormatMessage совместно с GetLastError LPVOID lpMsgBuf; char str[2048]; str[2047] = ‘\0’; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER
- 121. Примеры анализа драйвера Использование дизассемблера IDA Pro Использование среды анализа TREX
- 122. Отладочные возможности процессора, особенности в Windows, средства отладки Пошаговая отладка: TraceFlag в регистре флагов Точки прерывания:
- 123. Проблемы программных отладчиков Конкуренция с отлаживаемой программой за общие ресурсы: программные отладчики могут быть выявлены путем
- 124. «Классические» отладчики уровня ОС фактически вытеснены отладочными возможностями симуляторов: backend: VmWare frontend: интерфейс GDB (IDA, VisualStudio,
- 125. Взаимодействие с устройствами ReadFile – ZwReadFile – IRP_MJ_READ WriteFile – ZwWriteFile – IRP_MJ_WRITE DeviceIoControl – ZwDeviceIoControl
- 126. Flags StackSize = 3 AttachedDevice Flags StackSize = 1 AttachedDevice … Пересылка запросов между устройствами -
- 127. Драйвера подразделяются на 3 класса по их положению в стеке драйверов: драйвера высшего уровня, драйвера промежуточного
- 128. Число стеков размещения в/в устанавливается Диспетчером в/в в поле StackSize объекта-устройство. По умолчанию это значение равно
- 129. Код запроса в/в сохранен в поле MajorFunction (есть еще второстепенный код MinorFunction) текущего стека размещения ввода
- 130. BOOL WINAPI ReadFile( __in HANDLE hFile, __out LPVOID lpBuffer, __in DWORD nNumberOfBytesToRead, __out_opt LPDWORD lpNumberOfBytesRead, __inout_opt
- 131. BOOL WINAPI WriteFile( __in HANDLE hFile, __in LPCVOID lpBuffer, __in DWORD nNumberOfBytesToWrite, __out_opt LPDWORD lpNumberOfBytesWritten, __inout_opt
- 132. По адресу lpNumberOfBytesRead/ lpNumberOfBytesWritten в результате успешного завершения функции помещается содержимое поля Irp->IoStatus.Information диспетчерской функции драйвера,
- 133. Метод передачи буфера, используемый в запросах чтения и записи, контролируется полем Flags объекта-устройство (DeviceObject->Flags). После создания
- 135. Размер буфера для операций чтения/записи расположен в стеке размещения в/в: Stack->Parameters.Read.Length Stack->Parameters.Write.Length С точки зрения языка
- 136. Neither I/O buf_1 user kernel virtual address Адр. простр.1 Адр. простр.2 buf_2 физ. память чтение/запись
- 137. Direct I/O buf_1 user kernel virtual address Адр. простр.1 Адр. простр.2 buf_2 физ. память buf_3 MDL
- 138. Buffered I/O buf_1 user kernel virtual address Адр. простр.1 Адр. простр.2 buf_2 физ. память buf_3 Буфер
- 139. BOOL WINAPI DeviceIoControl( __in HANDLE hDevice, __in DWORD dwIoControlCode, __in_opt LPVOID lpInBuffer, __in DWORD nInBufferSize, __out_opt
- 140. По адресу lpBytesReturned в результате успешного завершения функции помещается содержимое поля Irp->IoStatus.Information диспетчерской функции драйвера, обработавшего
- 141. CTL_CODE( DeviceType, Function, Method, Access ) DeviceType определяет тип объекта-устройство, которому предназначен запрос. Это тот самый
- 143. METHOD_BUFFERED InBuf[InBufferSize ] OutBuf[OutBufferSize ] Промежуточный буфер [max(InBufferSize, OutBufferSize)] Irp->AssociatedIrp.SystemBuffer 1. Перед вызовом IRP_MJ_DEVICE_CONTROL копируется InBufferSize
- 144. Механизмы синхронизации Спин-блокировки – для межпроцессорной синхронизации, синхронизации на уровне IRQL=DISPATCH_LEVEL (обычные блокировки) или >DISPATCH_LEVEL (DIRQL)(блокировки
- 145. GUI_App HANDLE hFile=CreateFile(“\\.\SymLinkName”, …) FILE_OBJECT DeviceObject DEVICE_OBJECT GuiDev DriverObject NextDevice DeviceExtension DeviceObject MajorFunction[] DRIVER_OBJECT (FilterDriver) DEVICE_OBJECT
- 146. IoGetDeviceObjectPointer() – по имени устройства получаем его DEVICE_OBJECT (TargetDevice) IoCreateDevice() создаем FilterDevice IoAttachDeviceToDeviceStack() подключаем FilterDevicve к
- 147. Спин-блокировки (spin-lock) Спинлоки служат для обеспечения монопольного доступа потока к защищаемой структуре данных. Физически спинлок представляет
- 148. Пример реализации спин-блокировки (для ядра Windows неверен) mov eax, spinlock_address mov ebx, SPINLOCK_BUSY wait_cycle: lock xchg
- 149. Поток 1 Поток 2 SP 1. 2. 4,5... CPU 3. IRQL=PASSIVE_LEVEL IRQL=PASSIVE_LEVEL 6. 7. 9. 8.
- 150. Поток 1 Поток 2 SP Квантование времени выключено, переключение на поток1 невозможно deadlock 2. 4,5... CPU
- 151. Поток 1 Поток 2 SP 1. 2. 3,4... CPU1 IRQL=PASSIVE_LEVEL IRQL=DISPATCH_LEVEL 5. 6. IRQL=DISPATCH_LEVEL Поток 1
- 152. С каждой спин-блокировкой связан конкретный уровень IRQL, на который перейдет процессор после захвата блокировки. В соответствии
- 153. Функции для работы с обычными спин-блокировками VOID KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock); VOID KeAcquireSpinLock(IN PKSPIN_LOCK SpinLock, OUT PKIRQL
- 154. Взаимоблокировки (deadlocks) Решение: блокировки должны захватываться всеми потоками в одном порядке Поток 1 Поток 2 SP1
- 155. Диспетчерские объекты Dispatcher Objects набор механизмов синхронизации, рассчитанных на применение в основном для уровня IRQL PASSIVE_LEVEL.
- 156. Блокирование потока – состояние потока, при котором он не занимает время процессора. Блокированный поток не будет
- 158. Диспетчерские объекты могут иметь имена в пространстве имен диспетчера объектов (обычно директория \BaseNamedObjects) Через эти имена
- 159. Ожидание (захват) диспетчерских объектов Для ожидания момента перехода объекта из несигнального в сигнальное состояние служат специальные
- 160. Мьютексы ядра Мьютекс (mutex = Mutually EXclusive) означает взаимоисключение, т.е. мьютекс обеспечивает нескольким потокам взаимоисключающий доступ
- 161. VOID KeInitializeMutex(IN PKMUTEX Mutex, IN ULONG Level); LONG KeReleaseMutex(IN PKMUTEX Mutex, IN BOOLEAN Wait); Если параметр
- 162. семафор более гибкая форма мьютексов. В отличие от мьютексов, программа имеет контроль над тем, сколько потоков
- 163. LONG KeReleaseSemaphore( _Inout_ PRKSEMAPHORE Semaphore, _In_ KPRIORITY Increment, _In_ LONG Adjustment, _In_ BOOLEAN Wait ); Adjustment:
- 164. Использование семафоров: задача «потребители – производители» WaitFor… Потоки - производители S2 S1 WaitFor… ReleaseSemaphore ReleaseSemaphore Потоки
- 165. События (events) Позволяют проводить синхронизацию исполнения различных потоков, т.е. один или несколько потоков могут ожидать перевода
- 167. Скачать презентацию