Автор Гілка: перехоплення функцій  (Прочитано 4107 раз)

Відсутній t3rmit

  • Новачок
  • *
  • дописів: 4
  • Карма: +0/-0
Мені необхідно написати програму, що буде слідкувати за виконанням цільової програми і у випадку, якщо будуть відбуватися підозрілі дії - перехоплювати звернення цільової програми до бібліотечних функцій рвіня користувача та функцій рівня ядра(системних викликів) з подальшою їх заміною на попередньо написані програмістом.
Для вирішення першої задачі маю намір написати свою бібліотеку - аналог бібліотеки libc.so з дещо переробленими окремими функціями. Для вирішення другої - зробити щось подібне для таблиці sys_call_table, де зберігаються системні виклики.
Але коли я намагаюся прогланути вміст(код) бібліотеки libc.so за адресою  /usr/lib/libc.so.6, то система видає помилку, з якої я здогадуюся, що файл заблокований системою.  :'( Як можна витягти код даної бібліотеки?
Як можна змусити компоновщик(linker) звертатися саме до моєї нової бібліотеки у випадку необхідності?
Хто може щось порадити, особливо код, по вирішенню мого завдання - буду вдячний!  ::)

Відсутній DalekiyObriy

  • Літератор
  • ******
  • дописів: 1929
  • Карма: +5/-0
Fedora 35 (x86-64)

Відсутній t3rmit

  • Новачок
  • *
  • дописів: 4
  • Карма: +0/-0
Re: перехоплення функцій
« Відповідей #2 : 2008-04-29 21:21:19 »
DalekiyObriy, дякую за статтю. Вона мені дуже знадобиться і дуже підходить до моєї теми. А то всюди попадалася лише теорія, а практики зовсім нічого...
-----------------------------------------------------------------------------
Як я розумію, стандартна бібліотека С(libc.so) та інші подільні(shared) бібліотеки - це об'єктні файли формату ELF. Тобто це вже скомпільована програма(двійкова). А чи можу я якимось чином переглянути її вихідний код до компіляції?
PS: питання першого посту залишаються відкритими... ::)

Михайло Даниленко

  • Гість

Михайло Даниленко

  • Гість
Re: перехоплення функцій
« Відповідей #4 : 2008-04-29 21:54:26 »
Як приклад подібної до вашої функціональності можете поглянути на paco: http://paco.sourceforge.net/

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: перехоплення функцій
« Відповідей #5 : 2008-04-30 15:13:53 »
Як я розумію, стандартна бібліотека С(libc.so) та інші подільні(shared) бібліотеки
Вони не діляться, вони "спільні" бібліотеки. :-)

Цитата
- це об'єктні файли формату ELF.
Так.

Цитата
Тобто це вже скомпільована програма(двійкова).
Так.

Цитата
А чи можу я якимось чином переглянути її вихідний код до компіляції?
Будь яким текстовим редактором. :-) Треба тільки джерельні тексти стягнути. Що у вас за дистрибутив? Я вам тикну пальцем у конкретний пакет.

Цитата
PS: питання першого посту залишаються відкритими... ::)

Перехоплення викликів функцій Сі-них бібліотек робиться елементарно - вам вже відповіли, як. Перехоплення системних викликів теж робиться не складно. Я рекомендую вам глянути на джерельні тексти strace та ltrace - вони вже роблять практично  те що вам потрібно.

http://sourceforge.net/projects/strace/
http://ltrace.alioth.debian.org/

[Fedora Linux]

Відсутній t3rmit

  • Новачок
  • *
  • дописів: 4
  • Карма: +0/-0
Re: перехоплення функцій
« Відповідей #6 : 2008-05-01 16:42:35 »
Цитата
Вони не діляться, вони "спільні" бібліотеки.
Не міг підібрати вдалого перекладу, тому ще в дужках написав.  :)
Цитата
Треба тільки джерельні тексти стягнути. Що у вас за дистрибутив? Я вам тикну пальцем у конкретний пакет.
Було б чудово, якби Ви ткнули. :) Мені необхідно розробити дану програму під Федору.
PS: дякую за посилання!  :)

Відсутній t3rmit

  • Новачок
  • *
  • дописів: 4
  • Карма: +0/-0
Re: перехоплення функцій
« Відповідей #7 : 2008-05-26 19:39:28 »
Знайшов те, що мені потрібно. Здається, спочатку я пішов по помилковому шляху. Ось фрагмент зі статті на російській:
Цитата
А вот другой популярный прием, называемый методом "подмены библиотеки", также позаимствованный из мира Windows:

    * создаем "обертку" (wrapper) вокруг интересующей нас библиотеки, экспортирующей те же самые функции, что и она;
    * оригинальную библиотеку переименовываем или размещаем в другом месте;
    * функции-обертки определяют идентификатор вызывающего их процесса, и, если это действительно "их" процесс, совершают заранее запланированные действия (пишут вызов в log, подменяют аргументы или код возврата и т.д). Как определить id процесса? Это легко, ведь функции-обертки вызываются из контекста процесса, который их использует, и решение задачи сводится к выяснению идентификатора текущего процесса, возвращаемого функцией getpid();
    * функция-обертка передает управление оригинальной функции основной библиотеки или своей собственной подложной функции;

За внешней простотой реализации такого подхода кроется целый ворох проблем. Создать обертки вокруг всех "системных" библиотек вручную практически нереально, и эту работу необходимо автоматизировать, написав несложный парсер so-файлов и кодогенератор. Необязательно генерировать готовый ELF-файл, проще создать Си-программу и откомпилировать ее с помощью gcc.
"Глобальность" перехвата воздействует на все процессы, и кривая "обертка" рушит ось так, что только дампы летят. Давай не будем трогать системные библиотеки, а вместо этого изменим переменную LD_LIBRARY_PATH в окружении "подопытного" процесса. Она специально предусмотрена на тот случай, если отдельно взятому приложению требуется предоставить свой набор библиотек (статический и динамический загрузчики сначала ищут библиотеку в путях, указанных LD_LIBRARY_PATH, и только если там ее не оказывается, переходят к файлу /etc/ld.so.conf, а затем к путям /lib и /usr/lib), но, если "подопытный" процесс попытается загрузить библиотеку по абсолютному пути, он сможет вырваться из-под нашего контроля!
Але при слідуванні даним указанням в мене виникла проблема з написанням кодогенератора(генератора обгорток бібліотек). Хто може підказати ідею його написання чи вже існуючі схожі програми, буду дуже вдячним!