Сегодня 24 марта, понедельник ГлавнаяНовостиО проектеЛичный кабинетПомощьКонтакты Сделать стартовойКарта сайтаНаписать администрации
Поиск по сайту
 
Ваше мнение
Какой рейтинг вас больше интересует?
 
 
 
 
 
Проголосовало: 7280
Кнопка
BlogRider.ru - Каталог блогов Рунета
получить код
Программирование в *nix
Программирование в *nix
Голосов: 0
Адрес блога: http://nix-blog-1.blogspot.com/
Добавлен: 2011-12-13 22:05:27
 

Перехват системных вызовов

2011-11-16 22:25:00 (читать в оригинале)

Система: FreeBSD 8.2-RELEASE

/* Файл test.c */

#include <unistd.h>

int
main(void)
{
write(1, "test1\n", 6);
return 0;
}

/* Файл newlib.c */

/* Фактически write это еще одна библиотечная функция, которая
надстроена над настоящим системным вызовом _write, "старая"
функция будет по-прежнему доступна через вызов _write
(в linux используется glibc, а вызов имеет имя __write) */
extern int _write(int fd, const char *buff, long len);

int
write(int fd, const char *buff, long len)
{
_write(fd, "test2\n", 6);
_write(fd, buff, len);
}

Собираем нашу библиотеку
$ gcc newlib.c -fPIC -c
newlib.c:10:2: warning: no newline at end of file
$ gcc newlib.o -shared -o newlib.so
Собираем исполняемый файл
$ gcc test.c
test.c:9:2: warning: no newline at end of file
Запуск файла без подмены функции
$ ./a.out
test1
Запуск файла с подменой функции
$ export LD_PRELOAD=`pwd`/newlib.so
$ ./a.out
test2
test1
Очищаем переменную
$ unset LD_PRELOAD
$ ./a.out
test1

За подробностями: man ld.so

Тэги: кодинг

 


Самый-самый блог
Блогер ЖЖ все стерпит
ЖЖ все стерпит
по сумме баллов (758) в категории «Истории»


Загрузка...Загрузка...
BlogRider.ru не имеет отношения к публикуемым в записях блогов материалам. Все записи
взяты из открытых общедоступных источников и являются собственностью их авторов.