Простой контроль целостности процесса под Linux

В очередной раз решил попробовать написать драйвер (aka модуль ядра), но на этот раз под Linux. Задача, выполняемая модулем, будет аналогична рассмотренной ранее в примере драйвера под Windows.
Я не буду приводить описание методов работы со списками, которые используются в коде, так как они довольно просты, хорошо документированы и не слишком отличаются по логике от тех, которые доступны в Windows. Также за бортом останется детальное описание базового прототипа модуля, который будет использован для тестирования реализации функций контроля целостности. Хорошую развернутую статью про основы разработки модулей ядра под Linux можно почитать тут.

Перейдем непосредственно к коду. Как и раньше, начну с формата, в котором хранятся контрольные суммы областей памяти процесса.

Как видите, на этот раз я оперирую не секциями, а регионами памяти процесса. Это позволяет упростить код и избавить себя от необходимости разбирать что-либо относящееся к формату ELF.
Основные функции контроля целостности процесса стали ещё более простыми (по сравнению с реализацией под Windows), рассмотрим их ниже.

Перейдем к паре оставшихся основых функций, которые оперируют со списком контрольных сумм и осуществляют обход памяти процесса.

Ещё пара скучных функций, которые осуществляют инициализацию двусвязного списка и служал чем-то вроде заготовки, чтобы в дальнейшем можно было легко сделать единообразное кроссплатформенное API.

Теперь воспользуемся статьей, ссылку на которую я приводил в самом начале, и напишем простой модуль-заготовку для тестирования вышеописанных функций.

Ещё нам понадобится небольшая тестовая программа, которая будет общаться с нашим модулем. С помощью неё и GDB мы проведем тестирование модуля. Исходный код:

Скомпилируем тестовую программу с помощью GCC

Модуль соберем с помощью простого мейкфайла:

Установим модуль в систему с помощью modprobe или скажем insmod (в успешной установке модуля можем убедиться с помощью lsmod).

Выполним команду, которую модуль вывел в системный лог (можно посмотреть с помощью dmesg), чтобы создать «специальный файл» для общения с нашим модулем. Запустим программу под GDB и поставим брейкпоинт в цикле.

Контрольные суммы посчитаны, всё нормально.

Теперь поменяем один байт в памяти процесса и продолжим выполнение программы.

Контрольная сумма не совпала и модуль ядра сообщил нам об этом.

Исходный код полностью: integrity-module-linux

Оставьте первый комментарий

Оставить комментарий

Ваш электронный адрес не будет опубликован.


*