Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #58, СЕНТЯБРЬ 2005 г.

Windows на страже порядка

Deeoni$

Спецвыпуск: Хакер, номер #058, стр. 058-004-6


Теперь в адресном пространстве подопытного процесса болтается никому не нужная библиотека и кусок памяти. Чтобы избавиться от них, нужно проделать все вышесказанное, но с точностью до наоборот: сначала освободить выделенную память при помощи VirtualFreeEx, затем определить реальный адрес FreeLibrary в kernel32 функцией GetProcAdress, а после этого опять создать удаленный поток, который вызовет FreeLibrary и передаст ей хэндл нашей DLL.

Внедрение троянской DLL

Последний рассмотренный нами метод состоит в подмене реально используемой в приложении библиотеки на свою. Например, точно известно, что какая-то программа подгружает xxx.dll. Можно написать свою библиотеку и назвать ее тем же именем, что и искомая, предварительно переименовав последнюю. Для корректной работы придется экспортировать те же идентификаторы, что и в исходной xxx.dll, задействовав механизм переадресации функций. Но здесь есть одна заковырка: если подменять, например, библиотеку от Microsoft, то при следующем обновлении они вполне могут изменить эту DLL, добавив туда новые функции или сделав еще что-нибудь. Это значит, что не удастся загрузить приложения, использующие эти новые функции.

Этот метод можно также применить для конкретной программы, присвоив нашей библиотеке уникальное имя и добавив ее в раздел импорта exe-файла. И здесь без глубоких знаний форматов exe- и dll-файлов не выживешь.

Перехват API-функций

Теперь немного о перехвате API-функций. Заниматься этим можно только в своем процессе (в чужом слишком сложно), но, комбинируя техники перехвата и внедрения кода, можно добиться неплохих результатов.

Перехват API-вызовов с использованием раздела импорта

В разделе импорта содержится список DLL, необходимых модулю для нормальной работы. Кроме того, в нем перечислены все идентификаторы, которые модуль импортирует из каждой DLL. Вызывая импортируемую функцию, поток получает ее адрес фактически из раздела импорта.

Метод перехвата с использованием раздела импорта выглядит так: определяется точка входа перехватываемой функции, составляется список модулей, в настоящий момент загруженных в контекст требуемого процесса, а затем - перебираются дескрипторы импорта этих модулей в поиске адресов перехватываемой функции. В случае совпадения этот адрес заменяется на адрес нашего обработчика.

Этот способ хорош тем, что код перехватываемой функции не изменяется, поэтому обеспечивается корректная работа в многопоточном приложении. А недостаток в том, что приложения могут сохранить адрес функции до перехвата и затем вызывать ее, минуя обработчик. Также можно получить адрес функции используя GetProcAddress из kernel32.dll.

Сплайсинг функции

Этот способ перехвата довольно стар. Программисты активно использовали его еще в 16-рязрядной Windows. Суть способа в следующем: находится адрес функции, которую нужно перехватить, и заменяются первые пять байт длинным JMP на нужный нам код. Предварительно эти пять байт нужно сохранить где-нибудь, они еще понадобятся для восстановления работоспособности API.

Назад на стр. 058-004-5  Содержание  Вперед на стр. 058-004-7