модификация системных вызовов

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

модификация системных вызовов

Непрочитанное сообщение Olej » 18 сен 2015, 15:09

Краткое введение в предмет:
- все системные вызовы Linux ... это те, которые в разделе 2:

Код: Выделить всё

$ man man
...
В таблице ниже показаны номера справочных разделов и описание их содержимого.
       1   Исполняемые программы или команды оболочки (shell)
       2   Системные вызовы (функции, предоставляемые ядром)
       3   Библиотечные вызовы (функции, предоставляемые программными библиотеками)
       4   Специальные файлы (обычно находящиеся в каталоге /dev)
       5   Форматы файлов и соглашения, например о /etc/passwd
       6   Игры
       7   Разное (включает пакеты макросов и соглашения), например man(7), groff(7)
       8   Команды администрирования системы (обычно, запускаемые только суперпользователем)
       9   Процедуры ядра [нестандартный раздел]
- все системные вызовы Linux находятся и обслуживаются через стандартную C библиотеку libc.so ... причём не зависимо от того, на каком языке программирования написана вызывающая программа, т.е. наличие libc.so в Linux обязательно - это шлюз от пользовательского процесса в ядро Linux;
- перед выполнением все системные вызовы Linux проходят некоторую предобработку - 1-м параметром в вызов вставляется номер (индекс, селектор) вызова ... после чего выполняется команда int 80h (в старых версиях) или sysenter (в новых) - что по существу одно и то же;
- общее число, конкретные номера системных вызовов и их состав - различаются для разных аппаратных платформ, поддерживаемых Linux ... даже для i686 и X86_64 - это будут различные таблицы;
- все системные вызовы попадают в единое место - в таблицу-селектор системных вызовов sys_call_table, которая является таблицей (линейным массивом) косвенных адресов всех системных вызовов Linux - если нам нужен вызов с индексом (номером) 100, то нам нужно просто call sys_call_table[ 100 ];
- но имя (таблица) call sys_call_table в версиях ядра с 2.6, из каких-то очень специфических "соображений защищённости" команды Линуса Торвальдса - исключена из числа экспортируемых символов ядра;
(я очень сильно подозреваю, что соображения защищённости в данном смысле толковалось так: защищённость куска хлеба команды Торвальдса от сторонних разработчиков модулей ядра :lol: )

Но ... "не мытьём, так катаньем" и "голь на выдумки хитра" - техника модификация системных вызовов а). вполне реализуема + б). на порядок раздвигает спектр возможностей разработчиков модулей ядра.

Описанию деталей этой техники я постепенно наполню эту тему...

Краткая история:

1. эта техника описана в моём конспекте лекций Драйверы и модули ядра Linux...
- но описана она там начиная со страницы 344 ...а программисты практики, похоже, дальше страницы 150 не читают :-o
- а потом задают вопросы... :-(
- кроме того, там, в объёмном тексте, она описана разбросано, между несколькими сопутствующими темами...

2. разбираясь не так давно с проектом для одного из заказчиков (Implementing a Distributed Firewall), мне пришлось сильно расширить и детализировать ... познания ;-) относительно сетевых (сокетных, 17 штук) системных вызовов - это никак не отражено (пока?) в рукописи книги.

Вот это всё и сподвигло начать писать эту тему.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение Olej » 18 сен 2015, 17:08

Olej писал(а): Описанию деталей этой техники я постепенно наполню эту тему...
Отдельные фрагменты того, что должно получиться, рассыпаны уже фрагментарно по темам ранее:
Экспорт символов ядра и таблица системных вызовов
новости с /proc/kallsyms
куда делись сетевые syscall-ы ?
практикум по Linux Kernel

Только там это были вопросы, на которые искались ответы, а теперь нужно из этого выкроить нужное и изложить последовательно и внятно + отобрать (или доработать) оттуда минимум необходимых примеров.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение Olej » 18 сен 2015, 17:32

Olej писал(а): Но ... "не мытьём, так катаньем" и "голь на выдумки хитра"
Я пока разбирался с вопросом долго и отрабатывал в экспериментах такую технику (начиная с 2011 года) - переискал в Интернет и начитался много публикаций на этот предмет.
Вирусописатели и прочие пакостники ... пугающие самих себя страшным словом ха-а-а-а-акер :lol: - чего не выдумывали только для поиска sys_cal_table.
Даже динамически разглядывают дампы двоичных фрагментов памяти, занимаемых ядром, и проделывают сканирование участков памяти ядра :-o
Этот цирк можно вписывать в книгу рекордов Гинеса!

Товарищи вирусописатели и прочие пакостники! :lol: :roll:
Это всё делается гораздо проще!

Только секрет устойчивости Linux не в том. что вы не можете найти :lol: , а в том, что регламентация прав доступа не позволит (root права) не позволит сделать никакие пакости.
Одним словом ... "это вам не винда" :twisted:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение Olej » 20 сен 2015, 15:04

Olej писал(а): Описанию деталей этой техники я постепенно наполню эту тему...
Всё складывается так, что это будет цикл из нескольких, немногих, 3-4 статей с сопутствующими им примерами кодов.

Вот 1-я часть такого цикла ... в совершенно черновом варианте.

P.S. Добавлено позже:
Я приношу извинения тем (2-м), кто уже скачали прилагаемый текст. Сейчас я прилагаю другой, новый вариант. В нём нет существенных отличий от более раннего, просто в раннем тексте были оставлены (в конце) "хвосты" фрагментов текстов из других публикаций. Сейчас этот мусор был удалён.
Но я же предупредил, что это рабочий, совершенно черновой вариант?! ;-)
Вложения
find.tgz
(2.81 КБ) 298 скачиваний
Find_05.odt
(70.01 КБ) 292 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение Olej » 23 сен 2015, 14:21

Olej писал(а): Вот 1-я часть такого цикла ... в совершенно черновом варианте.
Этот же цикл статей (может в чуть изменённом варианте) пошёл на хабрахабр: Делаем доступным все символы ядра Linux. Часть 1

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение Olej » 25 сен 2015, 13:51

По технике встраивания в системные вызовы появилась (нашлась) относительно новая статья: Встраивание в ядро Linux: перехват системных вызовов
22 декабря 2014 в 16:15

Под термином «системный вызов» в программировании и вычислительной технике понимается обращение прикладной программы к ядру операционной системы (ОС) для выполнения какой-либо операции. Ввиду того что такое взаимодействие является основным, перехват системных вызовов представляется важнейшим этапом встраивания, т.к. позволяет осуществлять контроль ключевого компонента ядра ОС — интерфейса системных вызовов, что, в свою очередь, даёт возможность инспектировать запросы прикладного ПО к сервисам ядра.
К этому обязательно нужно будет вернуться.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение Olej » 25 сен 2015, 18:19

Olej писал(а): Вот 1-я часть такого цикла ... в совершенно черновом варианте.
2-я часть в таком же чёрном виде.
Вложения
Modi_04.odt
(67.13 КБ) 282 скачивания
modi.tgz
(5.38 КБ) 282 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение Olej » 25 сен 2015, 18:38

Olej писал(а):2-я часть в таком же чёрном виде.
В разных публикациях такие действия называют по-разному: встраивание, имплементация, подмена — они имеют свои нюансы, но в нашем обсуждении будут использоваться как синонимы.
Это из этой 2-й части, как легко понять.

По этому поводу есть вот такая статья (в копилку): Как сделать из ядра Linux Windows?
22 июля 2014 в 14:20
...
На примере ядра Linux будут рассмотрены методы и средства, используемые для модификации, расширения и дополнения его функциональных возможностей.
...
В комментариях на Хабрахабре расценили эту публикацию с рейтингом -18, что (-) довольно редкое явление там...
Как всегда, дегенераты! ;-) :-o

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение Olej » 26 сен 2015, 11:26

Olej писал(а):2-я часть в таком же чёрном виде.
Модификация системного вызова
Часть 2.
Редакция 04 от 26.09.2015
Одним из сложных элементов при модификации системного вызова является запись в readonly страницу RAM (которая контролируется аппаратно MMU).
Вот интересные публикации в эту тему:
WP: Safe or Not?
Кошерный способ модификации защищённых от записи областей ядра Linux

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение Olej » 26 сен 2015, 12:43

Olej писал(а):2-я часть в таком же чёрном виде.
Ну, и тот же материал, с самыми незначительными дополнениями, на Хабрахабр: Модификация системного вызова. Часть 2.

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя