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

Ага. Так как к вопросу почти не имеет отношения. Вопрос в том как заменить системные функции - похоже этого не дают так просто сделать.
А как ты пытался перехватить?
В смысле? Создавал разделяемую библиотеку с нужной функцией. Делал LD_PRELOAD=.
Ну попробуй придумать минимальный пример, который не работает, и запость. А мы посмотрим.
Это конечно цитата из мануала другой операционной системы, но возможно тебе поможет:
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.
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
У меня работает.
А -fPIC ты не забыл?
А -fPIC ты не забыл?
Нет, не забыл. Странно. Вообще глюки какие-то. ls при загрузке вдруг перестал выдавать эту ошибку. Зато например man продолжает показывать. Я теряюсь в догадках 

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

LD_LIBRARY_PATH=. не забыл ?
Не. Только /root
Да и вообще, делаю это из-под другого пользователя. Под root зайти не могу - сказал же что стер файл с паролями
.
Да и вообще, делаю это из-под другого пользователя. Под root зайти не могу - сказал же что стер файл с паролями
.Нет, не забыл.
Типа попробуй такой тест.
$ 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: .
Хммм... Странно это все. Попробовал войти в чистое окружение и проделать все шаги заново. Вроде работает. но вот такое ощущение что моя функция не всегда вызывается.
> но вот такое ощущение что моя функция не всегда вызывается.
возможно, что вызывается другая функция
не stat, а __xstat64 или типа того
возможно, что вызывается другая функция
не stat, а __xstat64 или типа того
Вопрос в том как заменить системные функцииВ том, что я тебе показал заменяются функции socket, read, write куда уж системнее?...

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

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

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

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