- •Лекции «Операционные системы» 4 семестр, 2 курс Содержание
- •Лекция №1 История развития ос
- •Операционная система. Общая характеристика.
- •Лекция №2 Требования к ос
- •Ресурсы, виды ресурсов. Управление памятью. Виртуальная память.
- •Методы распределения памяти
- •Лекция №3
- •Cash-ирование данных
- •Понятие процесса. Управление процессами. Синхронизация процессов. Тупики и способы борьбы с ними.
- •Лекция №4 Алгоритмы планирования процессов
- •Средства синхронизации при взаимодействии процессов
- •Файловые системы
- •Лекция №5 Общая модель файловой системы
- •Файловая система fat (таблица распределения файлов)
- •Структура
- •Формат кода каталога
- •Файловая система hpfs
- •Лекция №6
- •Файловая система ntfs(кратко)
- •Операционная система ms-dos
- •Лекция №7 Прерывание. Обработка прерываний
- •Лекция №8
- •Программирование последовательного порта
- •Лекция №9
- •Планирование процесса
- •Многоуровневые очереди
- •Лекция №10
- •Лекция №11 Архитектура Windows nt
- •Лекция №12 Процессы и нити
- •Лекция №13 Алгоритмы планирования процессов и нитей
- •Процесс
- •Распределение процессорного времени между потоками
- •Лекция №14
- •Лекция №15
- •Журнал аудита
- •Политика аудита
- •Лекция №16
- •Настройка и конфигурация windows nt
- •Лекция №17
- •Структура сетевой ос
- •Лекция №18
- •Лекция №19
- •Лекция №20 Динамически подключаемая библиотека (dynamic_link_library dll)
- •Лекция №21 Внедрение dll
Лекция №21 Внедрение dll
Внедрение:
-
Использование реестра
HKLM\ Soft Ware\ Microsoft\ Windows NT\ Current version\ Windows\ App_ Init_ DLLS
Значение параметра App_ Init_ DLLS может быть как имя одной DLL, так и нескольких, разделенных пробелами, либо запятыми.
При перезагрузке реестр сохраняется.
Когда модуль User_32 будет спроецирован на адресное пространство, модуль получит уведомление DLL_ Process_ Attach, и после его обработки вызовет Load_ Library для всех DLL, указанных в строке App_ Init_ DLLS.
В момент загрузки DLL инициализируется как DLL-main. User_32 DLL использует все приложения, использующие графический интерфейс. Во все оконные приложения загружена библиотека.
Трудности:
-
Поскольку внедренная DLL загружена на ранней стадии процесса, требуется осторожность при вызове функций в самой DLL. Проблема вызова функций из модуля Kernel_32 DLL проблем нет. User_32 DLL не проверяет, загружены ли другие библиотеки.
-
Т.к. параметры реестра считываются из конфигурации, требуется перезагрузка (для NT 4.0 и более низкие). С Windows 2000 проверка App_ Init_ DLLS проверяется и используется при загрузке каждого нового процесса.
-
Т.к. библиотека попадает в разные графические приложения, можно проверить.
-
DLL проецируется на адресное пространство на все время жизни.
-
Внедрение потоков с помощью удаленных потоков.
Существуют функции, которые дают возможность управлять чужим процессом. Первоначальное предназначение было использование отладчиком.
Внедрение DLL таким способом предполагает вызов функции Load_Library потоком целевого процесса для загрузки нужной DLL. Т.к. управление потоками чужого процесса затруднено, необходимо создать в чужом процессе свой поток.
Для этого существует функция:
Create Remote Thread (HANDLE hProcess
PRECURITY_ATTRIBUTES pza;
DWORD dw StackSize;
PTHEARD START_RBITINE
pfn Start ADDR
PVOID pv PARAM;
DWORD Sdw Create;
pdword pdw Thread ID ;)
Идентификатор HANDLE hProcess определяет процесс, которому будет принадлежать новый поток (его нет в Create Thread).
Параметр pfn Start ADDR определяет адрес функции потока, причем этот адрес относиться к удаленному процессу. Чтобы заставить вновь созданный поток загрузить в DLL, нужно, чтобы он вызвал Load_Library, необходимо выяснить точный адрес в памяти.
Load_Library А и Load_ Library W определяются передачей информации (в ASCII и ЮНИКОД формате).
Для выяснения точного адреса существует функция:
Get Process Address
Create Remote Thread относится к ядру, находится в Kernel 32 DLL, который используется всеми приложениями. Kernel 32 проецируется, как правило, по одному адресу во всех процессах.
PTHEARD_ START_ ROUTINE _pfn THEARD Rth = (PTHEARD_ START_ ROUTINE) Get Proc Address (Get MoubleHandle (Text (“Kernel 32”)), “Load Library А”)
HANDLE hTheard = Create Remote Thread (hProcess Remote, NULL, Ø, pfn Thread Rtf, “C:\\MyLib.dll”, Ø, NULL);
Строка, которая содержит полное имя файла DLL, находится в адресном пространстве вызывающего процесса. Её адрес должен быть передан созданному потоку, который передает его в Load Library А. Мы должны разместить строку с полным именем DLL в адресном пространстве удаленного процесса. Для этого функция Virtual alloc Ex, которая позволяет выделять память в чужом адресном пространстве.
Pvoid Virtual Alloc Ex (HANDLE hProcess;
PVOID pv Address;
SIZE_T dw Size;
DWORD dw Allocation type;
DWORD fl Protect;)
Для освобождения – Virtual Free Ex.
Далее копируем имя библиотеки из нашего процесса в удаленный.
WRITE Process Memory (HANDLE hProcess
PVOID pv Address remote
Адрес строки → PVOID pv Buffer Local,
с именем библиотеки
PVOID dw Size
PDWORD pdw Num bytes Written)
Общая последовательность операций:
-
Выделение блока памяти Virtual Alloc Ex.
-
Вызывает функцию WRITE Process Memory и копируем строку с адресом.
-
Используя функцию Get Proc Address получаем истинный адрес функции Load Library А (W) в модуле Kernel 32.
-
Вызываем Create Remote Thread, который вызовет Load Library, который передаст строку с именем загружаемой библиотеки.
-
DLL внедрена, DLL- main получает DLL_ PROCCESS_ ATTACH, которая выполняет свои действия.
-
После этого выполнение необходимых действий: вызов Virtual Free Ex (освобождение блока), с помощью Get Proc Address выяснение адреса функции free Library. Используя Create Remote Thread вызываем поток, который вызовет free Library и удалит библиотеку.
-
Замена DLL загружаемого процесса на другую DLL с тем же самым именем.
Недостатки:
Мы должны в нашей DLL экспортировать функции исходной библиотеки; если изменится исходная DLL, мы должны изменить и свою DLL.
Суть метода: переименование исходной DLL, используем нашу DLL с именем исходной DLL.
-
Перехват API вызовов.
-
Ищется адрес функции, вызов которой необходимо перехватить.
-
Копируем начальные n байтов, сохраняем у себя в памяти; на их место вставляем jmp с адресом нашей функции.
Недостатки:
В системе с вытесняющей многозадачностью может не работать.
Суть метода:
-
Перехват API вызова с помощью раздела импорта.
В разделе импорта содержится список DLL, необходимые модулю для работы. В разделе перечислены все идентификаторы, которые наше приложение экспортирует из каждой DLL. При вызове экспортирующей поток получает её адрес из раздела импорта. Для перехвата функции – изменение её адреса в разделе импорта.