Перехватывает загрузчик ELF в ядре Linux: файл fs/binfmt_elf.c через загружаемый модуль ядра
Я новичок в кодировании ядра, и в настоящее время я работаю с файлами ELF, которые были немного изменены в целях безопасности, для чего мне нужно взглянуть на некоторые из его пользовательских заголовков разделов и извлечь из них уникальный ключ шифрования кода для Процессор расшифровывает содержимое модифицированного ELF.
В настоящее время вышеуказанная логика была реализована в рамках load_elf_binary
функция в fs/binfmt_elf.c
файла в дереве исходного кода ядра, однако требуется всего около 250 строк изменения кода, для которых мне нужно перекомпилировать все ядро, поэтому я стремлюсь импровизировать эту функциональность, реализуя ее как загружаемый модуль ядра (LKM), чтобы каждый раз ELF загружается, он проверяет, является ли он модифицированным ELF или нет, и если это так, то он извлекает ключ из соответствующего раздела.
РЕДАКТИРОВАТЬ: Подводя итог, я рассматриваю создание загружаемого модуля ядра для чтения разделов ELF и выборки содержимого пользовательского раздела, который содержит ключ шифрования и соответствующие метаданные, и установки этих значений в регистрах ЦП.
1 ответ
Да, это возможно, но определенно не легко. Существует даже поддерживаемая функция ядра "kprobes", которая позволяет вставлять вызовы в ваш собственный код из указанных мест (см. Documentation/kprobes.txt
). Если вставка вызовов в ваш собственный код недостаточна, я думаю, вам нужно будет использовать те же механизмы, что и в kprobe: исправление нужного местоположения путем перезаписи инструкций с помощью jmp
с или call
в ваш собственный код.
Однажды я работал в компании, чей продукт безопасности устанавливал свои ловушки, исправляя во время выполнения ядро Windows. Это в значительной степени одно и то же, хотя по крайней мере с Windows в то время существовало ограниченное количество версий, которые должны были поддерживаться.
Так что это определенно возможно, но я бы не хотел это пробовать. Это будет очень хрупким; вы будете пытаться поразить движущуюся цель. Каждое исправление безопасности ядра или обновление версии может привести к поломке вашего кода.