Перехват библиотечных функций с помощью LD_PRELOAD

Julie16

OS Linux. glibc-2.3.5.
Кто-нибудь знает как перехватить функции типа open/stat/etc? Когда я пытаюсь перехватить одну из этих функций, при загрузке программ вылетает следующая фраза:

braindead ~/module/lib $ export LD_PRELOAD=libinterceptor.so
braindead ~/module/lib $ ls
ERROR: ld.so: object 'libinterceptor.so' from LD_PRELOAD cannot be preloaded: ignored.
Interceptor.C Interceptor.o libinterceptor.so Makefile.am
Interceptor.lo libinterceptor.la Makefile Makefile.in

Что делать? Отследить проблему до конца не получилось, так как dl написан немножко через жопу

rosali

Могу только посоветовать заведомо работающий пример... а вообще я в этом ничего не понимаю

Julie16

Ага. Так как к вопросу почти не имеет отношения. Вопрос в том как заменить системные функции - похоже этого не дают так просто сделать.

Marinavo_0507

А как ты пытался перехватить?

Julie16

В смысле? Создавал разделяемую библиотеку с нужной функцией. Делал LD_PRELOAD=.

Marinavo_0507

Ну попробуй придумать минимальный пример, который не работает, и запость. А мы посмотрим.

sergey_m

Это конечно цитата из мануала другой операционной системы, но возможно тебе поможет:

LD_PRELOAD A list of shared libraries, separated by colons and/or
white space, to be linked in before any other shared
libraries. If the directory is not specified then the
directories specified by LD_LIBRARY_PATH will be
searched first followed by the set of built-in stan-
dard directories. This is ignored for set-user-ID and
set-group-ID programs.

Julie16


braindead ~/module/lib $ cat Interceptor.C
extern "C"
{
int open(const char *pathname, int flags, int mode)
{
return -1;
}
}
braindead ~/module/lib $ export LD_PRELOAD=libinterceptor.so
braindead ~/module/lib $ ls
ERROR: ld.so: object 'libinterceptor.so' from LD_PRELOAD cannot be preloaded: ignored.
Interceptor.C Interceptor.o libinterceptor.so Makefile.am
Interceptor.lo libinterceptor.la Makefile Makefile.in

Marinavo_0507

У меня работает.
А -fPIC ты не забыл?

Julie16

Нет, не забыл. Странно. Вообще глюки какие-то. ls при загрузке вдруг перестал выдавать эту ошибку. Зато например man продолжает показывать. Я теряюсь в догадках

Marinavo_0507

Может ты вместе с /root ещё что нужное удалил?

ppplva

LD_LIBRARY_PATH=. не забыл ?

Julie16

Не. Только /root Да и вообще, делаю это из-под другого пользователя. Под root зайти не могу - сказал же что стер файл с паролями .

Julie16

Нет, не забыл.

Marinavo_0507

Типа попробуй такой тест.

$ cat i1.C
extern "C"
{
void *opendir(void *a)
{
return (void *) 0;
}
}
$ g++ -shared -fPIC -o i1.so i1.C
$ LD_PRELOAD=./i1.so ls
/bin/ls: .

Julie16

Хммм... Странно это все. Попробовал войти в чистое окружение и проделать все шаги заново. Вроде работает. но вот такое ощущение что моя функция не всегда вызывается.

Marinavo_0507

> но вот такое ощущение что моя функция не всегда вызывается.
возможно, что вызывается другая функция
не stat, а __xstat64 или типа того

rosali

Вопрос в том как заменить системные функции
В том, что я тебе показал заменяются функции socket, read, write куда уж системнее?...

Julie16

Ага. Я тоже так подумал. Похоже все же придется лезть в ядро

Marinavo_0507

> Похоже все же придется лезть в ядро
Тогда у тебя /root не ограничится, кранты всем файлам

Julie16

Слушай, ну чего ты прицепился? Это же стеб был... Ничего я не удалял. Крантов не будет. Все же я не совсем ламер.

Marinavo_0507

> Слушай, ну чего ты прицепился? Это же стеб был...
Подыграть хотел, хуле.

Julie16

Поздно. Поезд уехал.
Оставить комментарий
Имя или ник:
Комментарий: