Перехват библиотечных функций в linux и bsd


         

Введение


При всей непохожести windows на linux между ними можно выделить общие черты. Обе системы образуют "слоеный пирог" из библиотек различных уровней иерархий. Ядерные функции windows NT сосредоточены в файле ntoskrnl.exe, доступ к которым осуществляется через прерывание INT 2Eh (NT 3.5x, NT4.x, W2K) или через INT 2Eh/sysenter (XP, Longhorn). В linux для той же цели используется прерывание IINT 80h (x86 BSD использует гибридный механизм, одновременно поддерживая как INT 80h, так и call  far 0007h:00000000h).

Ядро реализует базовые функции ввода/вывода, распределения памяти, создания/завершения процессов и т. д., причем если NT предоставляет низкоуровневые полуфабрикаты, над которыми еще предстоит поработать, ядерные функции linux'а (они же "системные вызовы" или по-английски sys-calls) вполне юзабельны. Тем не менее прямые обращения к ядру с прикладного уровня встречаются редко. Вместо этого приложения предпочитают использовать системно-независимую библиотеку libc.so.x – отдаленный аналог KERNEL32.DLL из windows. Эта библиотека загружается в физическую память всего один раз, а затем проецируется на адресной пространство всех используемых ее процессов ("so" расшифровывается как "shared object [file]", а x – номер версии, например, "libc.so.6").

Помимо libc, существуют и другие библиотеки, например, libncurses.so.x, отвечающая за управление курсором и отрисовку псевдографики в текстовом режиме ("аналог" USER32.DLL). Библиотеки могут подключаться как на стадии загрузки elf-файла через таблицу символов (аналог таблицы импорта), так и динамически по ходу выполнения программы посредством вызова функций dlopen/dlsym (аналог LoadLibrary/GetProcAddress соответственно). Наконец, всякая программа содержит большое количество непубличных не экспортируемых функций, которые так же требуется перехватывать.

В штатный комплект поставки (out form box) некоторых UNIX'ов входят две "хакерские" утилиты truss и krace (в LINUX – strace), следящие за системными вызовами и ведущие подробный log (см. листинг 1). К сожалению, эти утилиты есть не на всех системах, и даже там где они есть, для решения поставленной задачи они непригодны: многие библиотечные функции обрабатываются локально и до ядра просто не доходят. К тому же strace работает через механизм ptrace, а он нерентабелен (т. е. не позволяет трассировать уже трассируемые программы) и с которым успешно сражаются многие защитные механизмы, черви и упаковщики. Наконец, в некоторых случаях приходится не только шпионить за вызовами, но и "подминать" чужие функции, заменяя их на свои.




Содержание  Назад  Вперед