В режиме ядра Linux, как выполнить команду пользовательского пространства

Я перехватываю execve в режиме ядра (изменяю запись system_call_table __NR_execve на мою функцию). Я хочу проверить ассемблерный код ELF. Если это вредно, я вернусь сразу, не выполняя его.

Я пишу модуль Linux. В режиме ядра Linux я хочу использовать objdump для дизассемблирования файла ELF. Я хочу перейти в пользовательский режим для выполнения objdump и вернуться в режим ядра. Это возможно? Спасибо.


person siyuan    schedule 24.10.2015    source источник
comment
Звучит странно. Для чего вам это нужно? Возможно, это можно сделать по-другому, не запуская пользовательское приложение из ядра. Поэтому, пожалуйста, объясните нам всю задачу, чтобы, возможно, мы могли придумать более подходящее и элегантное решение.   -  person Sam Protsenko    schedule 24.10.2015
comment
Сэм Проценко, я перехватываю execve в режиме ядра (изменяю запись system_call_table __NR_execve на мою функцию). Я хочу проверить ассемблерный код ELF. Если это вредно, я вернусь сразу, не выполняя его. У вас есть другая идея сделать это?   -  person siyuan    schedule 24.10.2015
comment
Было бы намного лучше, если бы вы могли сделать то же самое в пользовательском пространстве. Просто для меня это не похоже на задачу ядра. Но я могу ошибаться.   -  person Sam Protsenko    schedule 24.10.2015
comment
Как угнать execve в пространстве пользователя? LD_PRELOAD не работает.   -  person siyuan    schedule 24.10.2015


Ответы (1)


Возможно, вы можете разделить свой проект на две части: модуль ядра и приложение пользовательского пространства. Таким образом, вы можете перехватить execve() в ядре, затем сообщить своему приложению о срабатывании ловушки, затем выполнить дизассемблирование и проверку в своем приложении, отправить вычисленный результат обратно в модуль ядра, а затем либо продолжить, либо прервать выполнение execve().

Если вы все еще хотите запускать objdump из ядра, проверьте вызов_usermodhelper().

См. также это попутный вопрос.

person Sam Protsenko    schedule 24.10.2015
comment
Большое спасибо, Сэм Проценко. Это очень полезно. Я хочу использовать call_usermodhelper(). Я собираюсь написать сценарий пользовательского пространства (или программу на C) для проверки ассемблерного кода, а затем отправить результат (0 или 1) обратно в ядро. Итак, мой следующий вопрос: как я могу получить значение в режиме ядра? записать в файл? - person siyuan; 24.10.2015
comment
Вы можете просто запустить свое пользовательское приложение как демон и не использовать call_usermodhelper(). По поводу взаимодействия между ядром и пользовательским пространством: тут много вариантов. Возможно, проще всего использовать возможности драйвера символьного устройства для обмена некоторыми данными между ядром и пользовательским пространством. Другой возможный и простой вариант — создать несколько файлов sysfs в вашем модуле ядра и читать/записывать их из приложения в пользовательском пространстве. - person Sam Protsenko; 24.10.2015
comment
Сэм Проценко, не могли бы вы привести пример переноса данных из пространства пользователя в пространство ядра? Спасибо большое. - person siyuan; 25.10.2015
comment
Дело в том, что вариантов, как можно осуществить такой перенос, очень много. В идеале вы должны выбрать его для вашего конкретного случая. Если у вас нет большого опыта в разработке ядра -- я бы порекомендовал вам изучить API различных символьных устройств. Следующая конкретная функция может быть полезна: misc_register(), misc_deregister(), simple_read_from_buffer(), simple_write_to_buffer(). После того, как вы зарегистрировали устройство misc char и реализовали операции чтения/записи файлов в ядре, вы сможете читать/писать в соответствующий файл в каталоге /dev, чтобы общаться с вашим модулем ядра. - person Sam Protsenko; 25.10.2015
comment
Посмотрите здесь и здесь для примеров (я просто погуглил по misc_register simple_read_from_buffer и выбрал то, что мне больше всего понравилось). - person Sam Protsenko; 25.10.2015