русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Внедрение DLL


Дата добавления: 2013-12-23; просмотров: 1344; Нарушение авторских прав


Лекция №21

Внедрение:

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 проецируется на адресное пространство на все время жизни.

 

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

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

Внедрение 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 и удалит библиотеку.

 

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

Недостатки:

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

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

 

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

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

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

Недостатки:

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

Суть метода:

 

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

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



<== предыдущая лекция | следующая лекция ==>
Лекция №20 | Устройства ввода-вывода


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.527 сек.