2014-12-07 4 views
0

Мне присвоено задание «Написать системный вызов в качестве модуля ядра». Теперь, насколько я понял из моего чтения в Интернете, невозможно реализовать системный вызов как модуль ядра, однако есть способы перехватить существующие системные вызовы. Правильно ли это? В этом блоге я нашел один такой пример: http://syprog.blogspot.in/2011/10/hijack-linux-system-calls-part-i.htmlНапишите системный вызов в качестве модуля ядра

ответ

2

В linux sys_call_table содержит указатели на функции для всех системных вызовов. Эта таблица была первоначально экспортирована обратно в дни 2.4, затем она была сделана статической, затем снова была экспортирована в некоторые из последних ядер. Давайте возьмем пример из двух случаев.

Дело 1. sys_call_table экспортировано.

Используйте следующую строку в своем модуле ядра.

sys_call_table [AVAILABLE_INDEX] = new_sys_call;

Новый системный вызов может быть реализован как.

asmlinkage new_sys_call (...) {}

Case - 2) sys_call_table не экспортируются.

Попробуйте получить sys_call_table выступление в System.map оглавлению

$ кошка System.map | Grep sys_call_table

Жесткий код значение в модуле.

Если это не доступно, нам необходимо определить адрес таблицы динамически. sys_call_table, скорее всего, будет в начале раздела текста ядра.

Вот шаги для вычисления базового адреса sys_call_table

  1. Найти две системные вызовы, которые размещены рядом друг с другом в таблице (из исходного кода). Например: sys_read, sys_open.

  2. Получить адрес этих вызовов sys.

  3. Поиск этих двух адресов с начала текстового раздела.

    (Compute начало текста раздела по, objdump -h vmlinux | Grep ".text")

  4. Когда вы нашли его, вычислить базу sys_call_table, основанную на их относительного смещения.

Смежные вопросы