Использование LD_PRELOAD для функций уровня ядра

Можно ли переопределить одну из функций ядра Linux с помощью LD_PRELOAD?

Например, я хочу изменить функцию cookie_hash в Linux/net/ipv4/syncookie.c для прослушивающего сокета для моей программы fooserver. Могу ли я сделать это с помощью LD_PRELOAD, или для этого нужно перекомпилировать ядро?

Есть ли другие варианты?

Спасибо,


person Amir    schedule 27.09.2016    source источник
comment
Трюк LD_PRELOAD будет работать только для динамически подключаемых библиотек. Код, о котором вы говорите, скорее всего, статически связан. Или сидите в загружаемом модуле, если повезет. В этом случае можно заменить модуль.   -  person Eugene Sh.    schedule 28.09.2016
comment
@EugeneSh.: Вы не видите серьезных проблем с безопасностью, если пользователь может легко заменить функцию ядра?   -  person too honest for this site    schedule 28.09.2016
comment
За исключением вредоносных программ: зачем вам это?   -  person too honest for this site    schedule 28.09.2016
comment
Но тогда мои изменения будут применяться ко всем приложениям и сокетам прослушивания. В любом случае, я могу сделать это эксклюзивным для моей программы?   -  person Amir    schedule 28.09.2016
comment
@olaf Я должен провести небольшое исследование, чтобы узнать, смогу ли я найти лучший хэш.   -  person Amir    schedule 28.09.2016
comment
@Amir: И вы используете для этого свою производственную систему? Хорошая идея! И зачем использовать это в пространстве ядра? Просто запишите два варианта как пользовательский код и правильно выполните тест.   -  person too honest for this site    schedule 28.09.2016
comment
@Олаф Конечно. Разве что возможно только для рута.   -  person Eugene Sh.    schedule 28.09.2016
comment
@ Олаф, извини, я не понял: просто напиши два варианта как пользовательский код? Что ты имеешь в виду? Как я могу изменить хэш синкокки сокета прослушивания в пользовательском пространстве? Также интересно, во время бенчмаркинга, будет ли это справедливое сравнение или нет?   -  person Amir    schedule 28.09.2016
comment
Почему бы не использовать драйвер пользовательского пространства? Используйте необработанные сокеты и хорошо. Конечно, это может быть справедливо, если вы делаете это правильно.   -  person too honest for this site    schedule 28.09.2016
comment
О, я вижу. Если я хочу протестировать его в реальных условиях, мне нужно переопределить весь сокет прослушивания с моим новым хэшем syncookie для сервера в prd. Это слишком рискованно и хлопотно... в любом случае, спасибо за помощь :-)   -  person Amir    schedule 28.09.2016


Ответы (3)


Нет, невозможно использовать LD_PRELOAD для замены функции в ядре.

Вам нужно будет либо перекомпилировать ядро.

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

Если это то, что вы будете делать часто, вам нужно будет использовать второй компьютер или виртуальную машину, чтобы вам не пришлось постоянно перезагружать компьютер, на котором вы программируете.

person user253751    schedule 27.09.2016

Вы должны использовать kprobes или systemtap для переопределения функций ядра. Не нужно перекомпилировать.

person codegrep_admin    schedule 20.11.2016

Вы можете сделать что-то подобное в ядре Linux. Это нетривиальная операция, но вы должны сделать следующее:

  1. Найдите адрес функции, которую вы хотите заменить. Есть несколько способов получить адрес. Самый простой — это 'cat /proc/kallsyms | grep cookie_hash ".
  2. Из вашего модуля вы сохраняете содержимое адреса. Это оригинальная функция cookie_hash.
  3. В этот адрес вы помещаете адрес своей функции «my_cookie_hash».
  4. В конце вашей функции my_cookie_hash вы вызываете исходную функцию cookie_hash.

Однако есть много скрытых ловушек и потенциальных сбоев. Но в целом такой подход работает.

person Sebastian Mountaniol    schedule 01.06.2017