The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

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

24.12.2003 05:14

Переработанный вариант статьи Владимира Мешкова, опубликованной ранее в журанале "Системный администратор".

  1. Главная ссылка к новости (http://www.opennet.me/base/dev...)
Автор новости: LePetitPrince
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/3218-linux
Ключевые слова: linux
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (14) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, jp (?), 03:52, 25/12/2003 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Что-то после этого Тоссати и этой заи, мне как-то непосебе..
     
  • 1.2, Soldier (?), 09:52, 25/12/2003 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Из моего, правда небогатого, опыта по созданию модулей ядра:
    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

     
  • 1.3, Аноним (3), 10:59, 25/12/2003 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    2Soldier:
    Да Да, ты прав. Нужно подправить. Спасибо, а то это совсем из головы вылетело!
     
  • 1.4, Аноним (3), 11:52, 25/12/2003 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    и зачем огород городить?
    если можно собрать библиотечку с перехватом нужных вызовов и подгрузить ее ДО запуска программы через LD_PRELOAD
    так сделано например в installwatch
     
     
  • 2.5, Soldier (?), 12:02, 25/12/2003 [^] [^^] [^^^] [ответить]  
  • +/
    2 Аноним 4
    > и зачем огород городить?
    >если можно собрать библиотечку с перехватом нужных вызовов и подгрузить ее ДО >запуска программы через LD_PRELOAD
    >так сделано например в installwatch

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

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

     
     
  • 3.7, Аноним (-), 18:11, 25/12/2003 [^] [^^] [^^^] [ответить]  
  • +/
    >>если можно собрать библиотечку с перехватом нужных вызовов и подгрузить ее ДО запуска программы через LD_PRELOAD

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

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

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

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

     
  • 2.6, Аноним (3), 13:26, 25/12/2003 [^] [^^] [^^^] [ответить]  
  • +/
    Ты не путай перехват системных вызовов с библиотечными вызовами. Хотя даже вызов open() не являеться прямым системным вызовом, а всего лишь обертка из libc для настоящего системного вызова, все равно остаеться возможность написания программы с использованием прямых системных вызовов, тогда тебе не получиться перехватить его.

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

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

     

  • 1.8, JonnyPronks (?), 03:31, 28/12/2003 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Как же в 2.6 это компилируется?
     
     
  • 2.9, Bob (?), 15:59, 28/12/2003 [^] [^^] [^^^] [ответить]  
  • +/
    Судя по сообщениям на форуме www.thc.org, в ядре 2.6.0 таблица системных вызовов экспорту не подлежит, cледовательно, приведенные примеры перехвата системных вызовов при помощи модулей в ядре 2.6.0 работать не будут.
     
     
  • 3.10, JonnyPronks (?), 16:29, 28/12/2003 [^] [^^] [^^^] [ответить]  
  • +/
    в 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

     
     
  • 4.11, Bob (?), 14:30, 29/12/2003 [^] [^^] [^^^] [ответить]  
  • +/
    А если сменить расширение на .ko (hello.ko)?
     
     
  • 5.13, JonnyPronks (?), 17:10, 29/12/2003 [^] [^^] [^^^] [ответить]  
  • +/
    нет разницы!
     
  • 4.14, Soldier (?), 21:14, 30/12/2003 [^] [^^] [^^^] [ответить]  
  • +/
    >в 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 Но это уже отдельная история :)))

     
     
  • 5.15, JonnyPronks (?), 17:21, 05/01/2004 [^] [^^] [^^^] [ответить]  
  • +/
    У меня так не получилось, вот обновля ка я module-init-tools тоже посмотрим что скажет..
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2025 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру