среда, 12 августа 2009 г.

Перехват Win32 API функций в привязанных PE-файлах

Цель:
Показать два вида хука в привзязанных по импорту PE32-файлах.
Задачи:
  • Пояснить что такое привязанный файл;
  • Показать способ создания привязанного файла;
  • Описать установку хука функций в привязанных файлах;
  • Перечислить условия срабатывания Хук-функции;
  • Указать на важность обнаружения таких хуков в файлах; 
Работа системного загрузчика:

Прежде чем приступить к описанию сути, приведу упрощенную схему загрузки исполнимого модуля в адресное пространство процесса:
  1. Выделяет память размером в PE->OptionalHeader.SizeOfImage байт. Загручик пытается выделить память по предполагаемому адресу указанному в PE->OptionalHeader.ImageBase (далее по тексту IB);
  2. В выделенную память проецируются данные секций из файлового образа;
  3. Затем происходит проверка значений IB и адреса выделенной памяти(далее hInstance);
  4. Настройка адресов импортируемых функций из других модулей;
  5. При наличии разницы меж адресами в п.3 происходит фиксание кода используя таблицу перемещаемых элементов, при ее отсуствии приложение не загружается;
Следует заметить, что первым в пространство процесса сначала процеруется не сам исполнимый модуль, который запущен на выполнение, а все его импортируемые модули. А перед этими импортируемыми молудулями, загрузчик просаматривает зависимости на наличие у них своих импортируемых модулей. В случае нахождения грузятся первыми их импортируемые модули и т.д. до первого модуля, который ничего не импортирует!
Привязки:
В целях оптимизации при запуске файла был разработан механизм "привязывания"(англ. binding). Этот механизм позволяет исключить настройку адресов импортируемых функций из других модулей при соблюдении некоторых условий загрузки.
Эти условия таковы:
  • hInstance и IB импортируемого модуля одинаковы;
  • TimedateStamp в описателе IMAGE_BOUND_DESCRIPTOR-е совпадает с TimedateStamp импортируемого модуля;
Когда эти условия выполнены процесса настройки адресов импортирумых функций не происходит.
Да и зачем настраивать, если все лежит по тем местам, где и предполагалось?
Ошибочно полагать, что если эти условия не соблюдены, то файл не загрузится. Нет. Это не так, файл будет загружен, потому что произойдет процесс настройки адресов.
Виды привязок:
  1. Старый(англ. old binding);
  2. Новый(англ. new binding, bound);
Получение привязанных файлов:
Оба типа привязок можно получить с помощью утиллиты bind.exe входящей в MS Platform SDK, MSDN. Применяя эту тулзу к файлу без указания каких-либо ключей вообще мы можем получить второй вид привязки - новый. Применив ключ "-o" к файлу, мы получим первый вид привязки - старый.
Определение привязки:
  • Для новой привязки это наличие директории Bound, расположенной по адресу PE->OptionalHeader.DataDirectory[11].VirtualAdress и наличию значения 0xFFFFFFFF в IMAGE_IMPORT_DESCRIPTOR.TimedateStamp;
  • Для старой значение IMAGE_IMPORT_DESCRIPTOR.TimedateStamp отличного от 0x0 и 0xFFFFFFFF;
Установка хука:
  1. Привязать файл с помощью bind.exe
  2. Найти адрес импортируемой фукнции в IAT (IMAGE_IMPORT_DESCRIPTOR->FirstThunk), на которую требуется установить хук;
  3. Поставить в найденном элементе IAT свой адрес;
  4. В коде по своему адресу, по окончании работы выполнить переход по оригинальному адресу;
Поиск хука:
  1. Определить наличие привязки;
  2. Каждый адрес в IAT проверять на попадание в диапазон адресов от IB до IB+PE->OptionalHeader.SizeOfImage;
  3. В случае обнаружения такого адреса мы получаем адрес перехваченной функции;
Важность:
  1. Прежде всего следует отметить что зловреды современности не толко стараются применять разнообразные полиморфные генераторы, для усложнения анализа и обнаружения продуктами ИБ, но и спрятать факт перехода на код инжектируемых данных. Тот факт, что настройка адресов импортируемых функций может произойти, а может и нет говорит о том, что воспроизвести ситуацию, какая была у пользователя весьма не тривиальна. Выход один, добавить функционал обнаружения перехваченных АПИ-шек в свои тулзы, как флажок ;)
  2. Не могу утверждать, что все продукты современных антивирусов знают о старом и новом способах привязки и следовательно перехвате.

Комментариев нет: