URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 2999
[ Назад ]

Исходное сообщение
"OpenNews: Перехват системных вызовов в OS Linux"

Отправлено opennews , 25-Дек-03 03:52 
Переработанный вариант статьи Владимира Мешкова, опубликованной ранее в журанале "Системный администратор (http://www.samag.ru)".

URL: http://zaya.spb.ru/intercept_lnx.txt
Новость: http://www.opennet.me/opennews/art.shtml?num=3218


Содержание

Сообщения в этом обсуждении
"Перехват системных вызовов в OS Linux"
Отправлено jp , 25-Дек-03 03:52 
Что-то после этого Тоссати и этой заи, мне как-то непосебе..

"Перехват системных вызовов в OS Linux"
Отправлено Soldier , 25-Дек-03 09:52 
Из моего, правда небогатого, опыта по созданию модулей ядра:
gcc -c -DMODULE -I/usr/src/linux/include/ src-4.2.2.c
Может и не откомпилиться (например для ядра выше 2.4.18)

Надо
gcc -c -DMODULE -D__KERNEL__ -I/usr/src/linux/include/ src-4.2.2.c


"Перехват системных вызовов в OS Linux"
Отправлено Аноним , 25-Дек-03 10:59 
2Soldier:
Да Да, ты прав. Нужно подправить. Спасибо, а то это совсем из головы вылетело!

"Перехват системных вызовов в OS Linux"
Отправлено Аноним , 25-Дек-03 11:52 
и зачем огород городить?
если можно собрать библиотечку с перехватом нужных вызовов и подгрузить ее ДО запуска программы через LD_PRELOAD
так сделано например в installwatch

"Перехват системных вызовов в OS Linux"
Отправлено Soldier , 25-Дек-03 12:02 
2 Аноним 4
> и зачем огород городить?
>если можно собрать библиотечку с перехватом нужных вызовов и подгрузить ее ДО >запуска программы через LD_PRELOAD
>так сделано например в installwatch

А в чем принципиальная разница?  И почему вы считаете ваш "огород" менее "огородистым"?

Просто любопытно...


"Перехват системных вызовов в OS Linux"
Отправлено Аноним , 25-Дек-03 18:11 
>>если можно собрать библиотечку с перехватом нужных вызовов и подгрузить ее ДО запуска программы через LD_PRELOAD

>А в чем принципиальная разница?  И почему вы считаете ваш "огород" менее "огородистым"?

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

>остаеться возможность написания программы с использованием прямых системных вызовов, тогда тебе не получиться перехватить его

остается. Но в итоге получается код, строго заточенный под конкретную версию системы. В обычном случае этого не делается. Хотя случаи бывают всякие ;)


"Перехват системных вызовов в OS Linux"
Отправлено Аноним , 25-Дек-03 13:26 
Ты не путай перехват системных вызовов с библиотечными вызовами. Хотя даже вызов open() не являеться прямым системным вызовом, а всего лишь обертка из libc для настоящего системного вызова, все равно остаеться возможность написания программы с использованием прямых системных вызовов, тогда тебе не получиться перехватить его.

К примеру, у нас перехват вызовов по принципу LD_PRELOAD и мы что-то ужасное прячем от любопытных глаз. Но тут админ качает злую прогу, которая не юзает libc (не обязательно вообще не юзать, можно например весь движок написать на библиотечных функчиях, а вот функции поиска файла написать самому, без libc) и находит наш секрет.

Вот так вот.
И вообще, так все ногти об клавиатуру сломать можно, надоело.


"Перехват системных вызовов в OS Linux"
Отправлено JonnyPronks , 28-Дек-03 03:31 
Как же в 2.6 это компилируется?

"Перехват системных вызовов в OS Linux"
Отправлено Bob , 28-Дек-03 15:59 
Судя по сообщениям на форуме www.thc.org, в ядре 2.6.0 таблица системных вызовов экспорту не подлежит, cледовательно, приведенные примеры перехвата системных вызовов при помощи модулей в ядре 2.6.0 работать не будут.

"Перехват системных вызовов в OS Linux"
Отправлено JonnyPronks , 28-Дек-03 16:29 
в 2.6 изменилась инизиализация модуля и выглядит примерно так:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static int hello_init(void)
{
    printk("Hello, world\n");
    return 0;
}
static void hello_exit(void)
{
    printk( "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("Dual BSD/GPL");

но у меня что-то не компилируется даже такой простой модуль, если указывать нестандартную библиотечную директорию (-I параметр). Появляются ошибки типа:
In file included from /usr/src/linux/include/linux/jiffies.h:6,
                 from /usr/src/linux/include/linux/sched.h:12
если же не указывать директорию с headerami то компиляция проходит удачно, но при запуске млдуля появляется очередная ошибка:
insmod: error inserting 'hello.o': -1 Invalid module format


"Перехват системных вызовов в OS Linux"
Отправлено Bob , 29-Дек-03 14:30 
А если сменить расширение на .ko (hello.ko)?

"Перехват системных вызовов в OS Linux"
Отправлено JonnyPronks , 29-Дек-03 17:10 
нет разницы!

"Перехват системных вызовов в OS Linux"
Отправлено Soldier , 30-Дек-03 21:14 
>в 2.6 изменилась инизиализация модуля и выглядит примерно так:
>#include <linux/init.h>
>#include <linux/module.h>
>#include <linux/kernel.h>
>static int hello_init(void)
>{
>    printk("Hello, world\n");
>    return 0;
>}
>static void hello_exit(void)
>{
>    printk( "Goodbye, cruel world\n");
>}
>module_init(hello_init);
>module_exit(hello_exit);
>MODULE_LICENSE("Dual BSD/GPL");
>
>но у меня что-то не компилируется даже такой простой модуль, если указывать
>нестандартную библиотечную директорию (-I параметр). Появляются ошибки типа:
>In file included from /usr/src/linux/include/linux/jiffies.h:6,
>            
>     from /usr/src/linux/include/linux/sched.h:12
>если же не указывать директорию с headerami то компиляция проходит удачно, но
>при запуске млдуля появляется очередная ошибка:
>insmod: error inserting 'hello.o': -1 Invalid module format


А я его кажись победил...

//=========== hello.c =====================
#include <linux/module.h>

int init_module(void)   {
    printk("Hello World\n");
    return 0;
}

void cleanup_module(void) {
    printk("Bye\n");
}
//=========================

Компилировал так:

gcc -c -DMODULE -D__KERNEL__  -I/usr/src/linux/include -I/usr/src/linux/include/asm/mach-default -DKBUILD_MODNAME=hello -c hello.c


Модуль откомпилился и вставился. Правда пришлось посадить module-init-tools-3.0-pre3 вдобавок к modutils 2.4.15 Но это уже отдельная история :)))


"Перехват системных вызовов в OS Linux"
Отправлено JonnyPronks , 05-Янв-04 17:21 
У меня так не получилось, вот обновля ка я module-init-tools тоже посмотрим что скажет..