- •3. Системный реестр операционной системы Windows. Структура и главные разделы. Точки автозапуска программ. Средства редактирования реестра Windows. Функции работы с реестром из приложения.
- •10. Библиотека работы с двумерной графикой Direct2d. Инициализация библиотеки. Фабрика графических объектов библиотеки Direct2d. Вывод графики средствами библиотеки Direct2d. (потом переведу)
- •12. Системы координат. Трансформации. Матрица трансформаций. Виды трансформаций и их представление в матрице трансформаций. Преобразования в страничной системе координат. Режимы масштабирования.
- •13. Понятие ресурсов программ Windows. Виды ресурсов. Операции с ресурсами.
- •15. Понятие динамически-загружаемой библиотеки. Создание dll-библиотеки. Использование dll-библиотеки в программе методом динамический импорта процедур.
- •1 И 2 часть вопроса смотри в вопросе номер 14
- •17. Понятие объекта ядра ос Windows. Виды объектов ядра. Атрибуты защиты объекта ядра. Дескриптор защиты объекта ядра. Создание и удаление объектов ядра.
- •18.Проецирование файлов в память. Отличие в механизме проецирования файлов в память в ос Windows и unix/Linux. Действия по проецированию файла в память.
- •2. Создание объекта ядра под названием «проекция файла».
- •20. Средства распараллеливания вычислений в ос Windows. Понятия процесса и потока. Достоинства и недостатки процессов и потоков. Создание и завершение процесса. Запуск процессов по цепочке.
- •1. Открытие файла CreateFile.
- •21. Средства распараллеливания вычислений в ос Windows. Понятия процесса и потока. Создание и завершение потока. Приостановка и возобновление потока. Контекст потока.
- •22. Понятие пула потоков. Архитектура пула потоков. Операции с потоками при работе с пулом потоков.
- •23. Распределение процессорного времени между потоками ос Windows. Механизм приоритетов. Класс приоритета процесса. Относительный уровень приоритета потока.
- •24. Механизмы синхронизации потоков одного и разных процессов в ос Windows. Обзор и сравнительная характеристика механизмов синхронизации.
- •25. Синхронизация потоков в пределах одного процесса ос Windows. Критическая секция. Операции с критической секцией. Атомарные операции.
- •26. Синхронизация потоков в пределах одного процесса ос Windows. Ожидаемое условие (монитор Хора). Операции с ожидаемым условием. Пример использования ожидаемого условия для синхронизации потоков.
- •29. Структура системного программного интерфейса ос Windows (Native api). Nt-функции и Zw-функции в пользовательском режиме и режиме ядра ос Windows.
- •30. Системный вызов ос Windows. Алгоритм системного вызова. Особенность системного вызова из режима ядра.
- •31. Отладка драйверов ос Windows. Средства отладки драйверов. Посмертный анализ. Живая отладка.
- •32.Структуры данных общего назначения в режиме ядра ос Windows. Представление строк стандарта Unicode. Представление двусвязных списков.
- •33. Механизм прерываний ос Windows. Аппаратные и программные прерывания. Понятие прерывания, исключения и системного вызова. Таблица векторов прерываний (idt).
- •35. Понятие приоритета прерываний (irql). Приоритеты прерываний для процессора x86 или x64. Процедура обработки прерываний (isr). Схема обработки аппаратных прерываний.
- •36. Программные прерывания. Понятие отложенной процедуры (dpc). Назначение отложенных процедур. Механизм обслуживания отложенных процедур. Операции с отложенными процедурами.
- •37. Понятие асинхронной процедуры (apc). Назначение асинхронных процедур. Типы асинхронных процедур. Операции с асинхронными процедурами.
- •38. Понятие асинхронной процедуры (apc). Асинхронные процедуры режима ядра: специальная и нормальная apc-процедуры. Асинхронные процедуры пользовательского режима.
- •39. Понятие элемента работы (Work Item). Назначение элементов работы. Операции с элементами работы. Очереди элементов работы. Обслуживание элементов работы.
- •41. Управление памятью в пользовательском режиме ос Windows. Оптимизация работы кучи с помощью списков предыстории (Look-aside Lists) и низко-фрагментированной кучи (Low Fragmentation Heap).
- •42. Структура виртуальной памяти в ос Windows. Виды страниц. Состояния страниц. Структура виртуального адреса. Трансляция виртуального адреса в физический. Кэширование виртуальных адресов.
- •45. Управление памятью в режиме ядра ос Windows. Оптимизация использования оперативной памяти с помощью списков предыстории – Look-aside Lists.
- •46. Представление объекта ядра в памяти. Менеджер объектов.
- •47. Фиксация данных в физической памяти ос Windows. Таблица описания памяти (mdl) и ее использование.
- •48. Понятие драйвера ос Windows. Виды драйверов. Типы драйверов в режиме ядра. Точки входа в драйвер.
- •49. Объект, описывающий драйвер. Объект, описывающий устройство. Объект, описывающий файл. Структура и взаимосвязь объектов.
- •50. Понятие пакета ввода-вывода (irp). Структура пакета ввода-вывода. Схема обработки пакета ввода-вывода при открытии файла.
- •51. Понятие пакета ввода-вывода (irp). Структура пакета ввода-вывода. Схема обработки пакета ввода-вывода при выполнении чтения-записи файла.
- •52. Перехват api-вызовов ос Windows в пользовательском режиме. Внедрение dll с помощью реестра. Внедрение dll с помощью ловушек. Внедрение dll с помощью дистанционного потока.
- •53. Перехват api-вызовов ос Windows в пользовательском режиме. Замена адреса в таблице импорта. Перехват в точке входа в процедуру с помощью подмены начальных инструкций (Microsoft Detours).
- •55. Перехват api-вызовов менеджера объектов ос Windows в режиме ядра.
- •56. Перехват api-вызовов создания и уничтожения процессов и потоков ос Windows в режиме ядра.
- •57. Перехват операций с реестром в ос Windows в режиме ядра.
- •58. Перехват операций с файлами в ос Windows в режиме ядра. Мини-фильтры файловой системы.
51. Понятие пакета ввода-вывода (irp). Структура пакета ввода-вывода. Схема обработки пакета ввода-вывода при выполнении чтения-записи файла.
Понятие пакета IRP и его структура
Берём из предыдущего вопроса…
Схема обработки IRP при выполнении чтения-записи файла
1.Менеджер ввода-вывода обращается к драйверу файловой системы с IRP-пакетом, созданным для выполнения чтения-записи файла. Драйвер обращается к своей записи IO_STACK_LOCATION и определяет, какую именно операцию он должен выполнить.
2.Драйвер файловой системы для выполнения операции с файлом может создавать свои IRP с помощью IoAllocateIrp(). Или же он может в уже имеющемся IRP сформировать IO_STACK_LOCATION для драйвера более низкого уровня с помощью IoGetNextIrpStackLocation().
3.Если драйвер создает собственные IRP-пакеты, он должен зарегистрировать в них свою процедуру ZzzIoCompletion(), которая выполнит удаление IRP-пакетов после обработки драйверами нижнего уровня. За удаление своих IRP каждый драйвер отвечает сам. Менеджер ввода-вывода отвечает за удаление своего IRP, созданного для выполнения ввода-вывода.
Драйвер файловой системы устанавливает в IO_STACK_LOCATION указатель CompletionRoutine на свою процедуру XxxIoCompletion(), формирует IO_STACK_LOCATION для драйвера более низкого уровня с помощью IoGetNextIrpStackLocation(), вписывая нужные значения параметров, и обращается к драйверу более низкого уровня с помощью IoCallDriver().
4.Управление передается драйверу устройства процедуре YyyDispatchRead/Write(), зарегистрированной в объекте DRIVER_OBJECT под номером IRP_MJ_XXX. Драйвер устройства не может выполнить операцию ввода-вывода в синхронном режиме. Он помечает IRP-пакет с помощью IoMarkIrpPending() как требующий ожидания обработки или передачи другой процедуре YyyDispatch().
5.Менеджер ввода-вывода получает информацию, что драйвер устройства занят, и ставит IRP в очередь к объекту DEVICE_OBJECT драйвера.
6.Когда устройство освобождается, в драйвере устройства вызывается процедура обработки прерываний (ISR). Она обнаруживает IRP в очереди к устройству и с помощью IoRequestDpc() создает DPC-процедуру для обработки IRP на более низком уровне приоритета прерываний.
7.DPC-процедура с помощью IoStartNextPacket() извлекает из очереди IRP и выполняет ввод-вывод. Наконец, она устанавливает статус-код в IRP и вызывает IoCompleteRequest().
8.В каждом драйвере в стеке вызывается процедура завершения XxxIoCompletion(). В драйвере файловой системы она проверяет статус-код и либо повторяет запрос (в случае сбоя), либо завершает его удалением всех собственных IRP (если они были). В конце, IRP-пакет оказывается в распоряжении менеджера ввода-вывода, который возвращает вызывающему потоку результат в виде NTSTATUS.
РИСУНОК К ВОПРОСУ 51
52. Перехват api-вызовов ос Windows в пользовательском режиме. Внедрение dll с помощью реестра. Внедрение dll с помощью ловушек. Внедрение dll с помощью дистанционного потока.
Перехват API-вызовов ОС Windows в пользовательском режиме.
Задача – изменить поведение окна:
HWND hwnd = FindWindow(ClassName, WindowName);
SetClassLongPtr(hwnd, GWLP_WNDPROC, MyWindowProc);
Изменяемый оконный класс может находиться в адресном пространстве другого процесса, и адрес процедуры MyWindowProc будет не валиден.
Внедрение DLL с помощью реестра:
Зарегистрировать DLL в реестре (имя не должно содержать пробелы): HKLM\Software\Microsoft\Windows_NT\CurrentVersion\Windows\AppInit_DLLs
Выполнить API-перехват в DllMain (reason == DLL_PROCESS_ATTACH). Функции Kernel32.dll можно вызывать смело. С вызовами функций из других DLL могут быть проблемы.
Внедрение DLL с помощью ловушек:
HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, INSTANCE hMod, DWORD dwThreadId); UnhookWindowsHookEx().
Процедура ловушки:
LRESULT MyHookProc(int code, WPARAM wParam, LPARAM lParam); code: если HC_ACTION, надо обработать, если меньше нуля, – вызвать:
LRESULT CallNextHookEx(HHOOK hhook, int code, WPARAM wParam, LPARAM lParam);
Внедрение DLL с помощью дистанционного потока:
HANDLE CreateRemoteThread(HANDLE hProcess, SECURITY_ATTRIBUTES* securityAttributes, DWORD dwStackSize, THREAD_START_ROUTTNE* startAddress, void* parameter, DWORD dwCreationFlags, DWORD* pThreadId);
DWORD ThreadProc(void* parameter);
HINSTANCE LoadLibrary(PCTSTR fileName);
void* p = GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryW");
Передача данных в дистанционный поток:
void* VirtualAllocEx (HANDLE hProcess, void* lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);
bool VirtualFreeEx(HANDLE hProcess, void* lpAddress, SIZE_T dwSize, DWORD dwFreeType);
bool WriteProcessMemory(HANDLE hProcess, void* lpBaseAddress, const void* lpBuffer, SIZE_T nSize, SIZE_T* lpNumberOfBytesWritten);
bool ReadProcessMemory(HANDLE hProcess, void* lpBaseAddress, const void* lpBuffer, SIZE_T nSize, SIZE_T* lpNumberOfBytesRead);
