
- •Введение
- •Эволюция ос.
- •Классификация ос.
- •Краткий обзор архитектуры Windows.
- •Основные системные файлы Windows 95, nt, 2000.
- •Средства аппаратной поддержки управления памятью.
- •Сегментная организация памяти.
- •Страничная или сегментно-страничная организация памяти.
- •Механизмы управления памятью Windows.
- •Раздел 4. В него загружаются ядро Windows nt и драйверы устройств. Этот раздел полностью защищен и по чтению, и по записи. Регионы в адресном пространстве.
- •Системные переменные и операционные системы.
- •Передача физической памяти региону.
- •Механизм выделения страниц физической памяти.
- •Выделение физической памяти под программный код.
- •Атрибуты защиты страниц.
- •Стек потока.
- •Стек потока под Windows 95, 98.
- •Функции компилятора для контроля стека.
- •Кучи (Heaps).
- •Особенности кучи в Windows 95, Windows nt.
- •Структура арены.
- •Рассмотрим функции работы с кучей.
- •Удаление кучи.
- •Выделение блока памяти в определённой куче.
- •Освобождение блока кучи.
- •Дополнительные кучи Win32 процесса.
- •Создание дополнительных куч для эффективного управления памятью.
- •Локальный доступ. Создание дополнительных куч для локализации доступа.
- •Файлы проецируемые в память (фпвп).
- •Проецирование в память exe и dll файлов.
- •Совместное использование статических данных несколькими экземплярами exe и dll модулей.
- •Иерархия функций работы с памятью.
- •Объекты kernel32.Dll.
- •Процессы.
- •Структуры данных процесса.
- •Структура блока pdb.
- •Блок kprocess.
- •Блок переменных окружения (peb).
- •Переменная ядра, связанная с процессами.
- •Последовательность действий, выполняемых функцией CreateProcess.
- •Потоки.
- •Основные функции для работы с потоками.
- •Управляющие структуры ос для работы с потоками.
- •Описание структур управления потоками.
- •Управление потоками.
- •Лекция № 11
- •Функции Win32 связанные с планированием.
- •Учёт квантов времени.
- •Сценарий планирования.
- •Поток простоя.
- •Динамическое повышение приоритета потока.
- •Планирование потоков в системах с симметричной мультипроцессорной системой (smp).
- •Синхронизация.
- •Синхронизация потоков без использования объектов синхронизации.
- •Синхронизация потоков.
- •Критические секции.
- •Работа потока с несколькими критическими секциями.
- •Синхронизация объектов.
- •События со сбросом вручную.
- •События с автоматическим сбросом.
- •Модули.
- •Структура imte.
- •Структура modref.
- •Файлы. Формат pe файла.
- •Особенности ре формата:
- •Заголовок ре файла.
- •Основные секции исполняемого файла.
- •.Idata bfc0847d .Text jmp dword ptr [00040042 … call 00014408 (Вызов GetMessage) Прикладная программа
- •Импортирование ре файлов.
- •Эскпорт ре файлов.
- •Лекция № 15
- •Ресурсы ре файла.
- •Базовые поправки ре файла.
- •Файловые системы.
- •Загрузочный сектор.
- •Особенности ntfs.
- •Новые возможности ntfs.
- •Структура ntfs на диске.
- •Кластеры.
- •Главная таблица файлов.
- •Структура файловых ссылок.
- •Записи о файлах.
- •Индексация имён файлов.
- •Битовая карта.
- •Восстанавливаемость ntfs.
- •Журнал транзакций.
- •Записи контрольной точки.
- •Восстановление данных в ntfs.
- •Проход повтора.
- •Проход отмены.
- •Отказоустойчивость ntfs.
- •Словарь терминов.
.Idata bfc0847d .Text jmp dword ptr [00040042 … call 00014408 (Вызов GetMessage) Прикладная программа
User32.dll
BFC0847D GetMessage(…)
00014408
Сделано так для того, чтобы загрузчику не приходилось изменять каждую инструкцию, вызывающую какую-либо функцию из модуля. Теоретически загрузка происходит быстрее, так как всё находится в одной секции. На этом методе основан метод работы программы шпиона.
Импортирование ре файлов.
Рассмотрим структуру секции .idata. Перед загрузкой в память в секции .idata хранится информация, необходимая для того, чтобы загрузчик мог определить адреса целевых функций и пристыковать их к исполняемому файлу. После загрузки секция .idata содержит указатели функций, импортируемых ехе файлом. Секция .idata имеет следующую структуру:
Список функций Таблица адресов
Characteristics
TimeDataStamp
Name
FirstThunk GetMessage(…)
LoadIcon(…)
Translate(…)
… …
HintName
//////////
О пределяются
*
.dll
User32.dll
80000112
Программа в таблице импорта должна указать список внешних dll и функций, вызываемых из этих dll. Для каждой внешней dll в секции импорта создаётся структура, которая состоит из следующих полей:
Name – имя внешней dll, причём имя указывается не в таблице, а указатель на RVA, содержащей имя внешней dll. Имя представляет строку символов, заканчивающихся 0.
TimeDataStamp – отметка о времени и дате создания этой dll. Перед загрузкой в этом поле 0. После загрузки записывается конкретная дата и время создания.
Остальные два поля используются для определения функций данной dll, которые используются ехе файлами.
Characteristics – представляет RVA, указывающий на массив двойных слов, каждое двойное слово соответствует одной функции, импортируемой из этой dll. С помощью четырёх байт функции могут вызываться по номеру и по имени. Если старший байт двойного слова установлен 1, то импортирование производится по номре и младший 31 бит используется для определения номера страницы, то есть если в какой-либо ячейке записано 80000112, значит, что импортируется 112-я функция модуля user32.dll. Если старший бит 0, то это значит, что младший 31 бит является RVA, который указывает на строку символов ASCII, содержащей имя функции.
FirstThunk – указывает на массив двойных слов, который заполняется загрузчиком. До загрузки этот массив пустой. После загрузки в него записывается массив функций внешних dll.
Структура таблицы импорта не является жёсткой. Некоторые компоновщики не используют поле FIrstThunk.
Эскпорт ре файлов.
Информация об экспортируемых функциях хранится в секции .edata (обычно в dll файлах). Таблица экспорта имеет следующую структуру:
характеристики
Base
…
NumberOfFunction 3
NumberOfNames 2
AddressOfFunctions
AddressOfNames
AddressOfNameOrdinals
400042 400085
400197
Т аблица
э кспорта
MyFunc1 MyFunc3
1 3
Из dll экспортируется 3 функции, причём 2 из них по имени. Рассмотрим структуру таблицы экспорта.
Характеристики – в нём указывается время и дата создания dll, в них находится RVA, который указывает на строку с именем этой dll.
? Зачем дублируется имя dll?
Ответ: чтобы ускорить, чтобы все данные, которые необходимы, брались из таблицы экспорта.
Начальный номер экспорта для функций, экспортируемый данным модулем, например, если модуль экспортирует с 10, 11, 15, то начальный номер 10.
NumberOfFunction – количество элементов в таблице адресов.
NumberOfNames – количество элементов в таблице имён.
Следующие три поля указывают на соответствующие таблицы.