Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Операционные системы (лекции) (4 семестр).doc
Скачиваний:
9
Добавлен:
04.11.2018
Размер:
728.06 Кб
Скачать

Лекция №21 Внедрение dll

Внедрение:

  1. Использование реестра

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 использует все приложения, использующие графический интерфейс. Во все оконные приложения загружена библиотека.

Трудности:

  1. Поскольку внедренная DLL загружена на ранней стадии процесса, требуется осторожность при вызове функций в самой DLL. Проблема вызова функций из модуля Kernel_32 DLL проблем нет. User_32 DLL не проверяет, загружены ли другие библиотеки.

  2. Т.к. параметры реестра считываются из конфигурации, требуется перезагрузка (для NT 4.0 и более низкие). С Windows 2000 проверка App_ Init_ DLLS проверяется и используется при загрузке каждого нового процесса.

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

  4. DLL проецируется на адресное пространство на все время жизни.

  1. Внедрение потоков с помощью удаленных потоков.

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

Внедрение 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)

Общая последовательность операций:

  1. Выделение блока памяти Virtual Alloc Ex.

  2. Вызывает функцию WRITE Process Memory и копируем строку с адресом.

  3. Используя функцию Get Proc Address получаем истинный адрес функции Load Library А (W) в модуле Kernel 32.

  4. Вызываем Create Remote Thread, который вызовет Load Library, который передаст строку с именем загружаемой библиотеки.

  5. DLL внедрена, DLL- main получает DLL_ PROCCESS_ ATTACH, которая выполняет свои действия.

  6. После этого выполнение необходимых действий: вызов Virtual Free Ex (освобождение блока), с помощью Get Proc Address выяснение адреса функции free Library. Используя Create Remote Thread вызываем поток, который вызовет free Library и удалит библиотеку.

  1. Замена DLL загружаемого процесса на другую DLL с тем же самым именем.

Недостатки:

Мы должны в нашей DLL экспортировать функции исходной библиотеки; если изменится исходная DLL, мы должны изменить и свою DLL.

Суть метода: переименование исходной DLL, используем нашу DLL с именем исходной DLL.

  1. Перехват API вызовов.

  1. Ищется адрес функции, вызов которой необходимо перехватить.

  2. Копируем начальные n байтов, сохраняем у себя в памяти; на их место вставляем jmp с адресом нашей функции.

Недостатки:

В системе с вытесняющей многозадачностью может не работать.

Суть метода:

  1. Перехват API вызова с помощью раздела импорта.

В разделе импорта содержится список DLL, необходимые модулю для работы. В разделе перечислены все идентификаторы, которые наше приложение экспортирует из каждой DLL. При вызове экспортирующей поток получает её адрес из раздела импорта. Для перехвата функции – изменение её адреса в разделе импорта.

58