Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Подмена функций


Автор: andrew_121 8.8.2009, 13:18
Здравствуйте.

Нужно подменить вызов таких функций как open(), lstat[64](), stat[64](), read(), write(), mkdir(), chdir(), getcwd() для определенного процесса.
Интересует мнение других. Как бы вы реализовали эту задачу.

Спасибо!

Автор: andrew_121 8.8.2009, 18:44
Вот что нашел.
http://www.insidepro.com/kk/043/043r.shtml
http://gazette.linux.ru.net/lg81/sandeep.html
http://gazette.linux.ru.net/lg83/sandeep.html
http://gazette.linux.ru.net/lg85/sandeep.html

По идее то что нужно.
Может есть еще какие-то варианты? Не считая модулей ядра.

Автор: bsa 9.8.2009, 10:39
кажется есть переменная среды LD_PRELOAD_LIBRARY (или что-то вроде того), которая заставляет ld.linux.so сначала загрузить указанную библиотеку перед той, которую требует программа. Так как линковка осуществляется последовательно, то можно создав библиотеку с нужными функциями, подменить на них стандартные вызовы у необходимых процессов.

Автор: andrew_121 9.8.2009, 10:55
bsa, Да, я так понял, это самый правильный вариант.
Пробую.

Автор: MAKCim 9.8.2009, 11:02
Цитата(bsa @  9.8.2009,  10:39 Найти цитируемый пост)
то можно создав библиотеку с нужными функциями, подменить на них стандартные вызовы у необходимых процессов. 

не прокатит, если нужно работать с существующим процессом
тут можно заюзать ptrace + PTRACE_SYSCALL (если функции, которые нужно подменить, соответсвуют системным вызовам)

Автор: andrew_121 9.8.2009, 11:43
Цитата(MAKCim @  9.8.2009,  11:02 Найти цитируемый пост)
не прокатит, если нужно работать с существующим процессом

Нет. Процесс я сам запускаю. В этом методе есть недостатки? Какой метод предпочитаемый?

Цитата(MAKCim @  9.8.2009,  11:02 Найти цитируемый пост)
(если функции, которые нужно подменить, соответсвуют системным вызовам) 

...не понял.

Добавлено через 4 минуты и 24 секунды
Что почитать порекомендуете?

Автор: MAKCim 10.8.2009, 12:36
Цитата(andrew_121 @  9.8.2009,  11:43 Найти цитируемый пост)
...не понял.

ну все вышеперечисленные тобой функции соответствуют системным вызовам
а если, к примеру, тебе нужно подменить функцию gethostbyname, то ptrace ты не сможешь заюзать, т. к gethostbyname - обычная функция libc


Цитата(andrew_121 @  9.8.2009,  11:43 Найти цитируемый пост)
Нет. Процесс я сам запускаю. В этом методе есть недостатки? Какой метод предпочитаемый?

первый просто реализуется, но не полностью надежный
второй труднее в реализации + ограничение, которое я озвучил

Автор: andrew_121 15.8.2009, 15:54
Цитата(MAKCim @  9.8.2009,  11:02 Найти цитируемый пост)
тут можно заюзать ptrace + PTRACE_SYSCALL

А можно микропримерчик smile 
к примеру, как для команды cd подменить вызов chdir?

Автор: andrew_121 19.8.2009, 09:25
Ну хоть ссылку на что-то подобное дайте smile Буду дико признателен.

Автор: bsa 29.8.2009, 17:25
cd может быть внутренней командой оболочки. Поэтому нужно подменять именно у оболочки.

Автор: andrew_121 29.8.2009, 18:11
Цитата(bsa @  29.8.2009,  17:25 Найти цитируемый пост)
cd может быть внутренней командой оболочки. Поэтому нужно подменять именно у оболочки. 

т.е. в Линуксе?

Автор: MAKCim 29.8.2009, 20:35
Цитата(bsa @  29.8.2009,  17:25 Найти цитируемый пост)
cd может быть внутренней командой оболочки. Поэтому нужно подменять именно у оболочки. 

cd реализуется через chdir

Автор: Loki 30.8.2009, 13:12
а зачем подменивать? что-бы спрятать что-то? или это система лицензирования такая?)

Автор: andrew_121 31.8.2009, 07:23
Loki, Есть бинарник, но нет сорцов. Нужно заставить его использовать другие имена файлов/каталогов.

Добавлено через 38 секунд
Нужно было.
Вопрос решен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)