Моя цель - подключить несколько функций glibc внутри определенной группы процессов, расположенных на определенном пути.Для этого есть несколько методов (gdb, strace и т. Д.).Но мне нужно, чтобы это было сделано автоматически и надежно на самой ранней стадии, чтобы я не пропустил ни одного звонка.Поэтому я решил пойти с LD_PRELOAD
методом.И мне нужно, чтобы это делалось автоматически без какого-либо вмешательства пользователя, поэтому введение LD_PRELOAD
в среду довольно хрупко и может быть отменено пользователем.Поэтому я решил указать свою библиотеку внутри /etc/ld.so.preload
- это прекрасно работает.
Внутри кода библиотеки ctor я проверяю, является ли процесс, в котором я нахожусь, тем процессом, который мне нужен, и выполняю необходимые перехваты, иначе этоno-op и библиотека просто мертвый вес.
__attribute__((constructor)) void my_lib_ctor()
{
if (is_relevant_process())
{
do_the_wiring();
}
}
Библиотека не экспортирует никаких символов, и все внутри скрыто по умолчанию (-fvisibility=hidden
флаг компилятора), поэтому никаких реальных зависимостей нетв мою библиотеку из любого процесса.Таким образом, в случае внедрения в несвязанный процесс его можно безопасно выгрузить.
Для процедуры обновления требуется выгрузка - если требуется обновить библиотеку, ее не следует загружать в долго выполняющиеся процессы - в противном случае они вылетятна замену библиотеки (что ожидается).Интересующие процессы недолговечны и запускаются пользователем, поэтому воздействие на них незначительно.
Проблема в том, что я не знаю, как безопасно выгружать его.Я думал о dlclose
, но вызов его из самой библиотеки приведет к тому, что он вернется из обратного вызова к коду библиотеки, который будет уже выгружен.
И если есть другие методы для автоматическии надежно перехватывать вызовы glibc на ранней стадии (до выполнения приложения main()
), не затрагивая интересующее его приложение, я буду рад, если вы дадите мне знать о них (небольшое изменение настроек ОС, например, предзагрузка,все в порядке).Спасибо!