Перехват системного вызова непосредственно перед тем, как управление входит в общую библиотеку - PullRequest
5 голосов
/ 04 июня 2011

Я завернул ряд функций системного вызова, таких как write (), open () и т. Д., И LD-PRELOAD используется для переопределения исходных системных вызовов.Более того, я определил еще несколько функций и сделал это слишком большой библиотекой.

Я бы хотел перехватить все системные вызовы из разных процессов приложения в эти общие библиотеки, прежде чем они войдут в общую библиотеку.Как я могу это сделать?

Спасибо

Ответы [ 3 ]

4 голосов
/ 04 июня 2011

LD_PRELOAD не обязательно является хорошим способом вставки системных вызовов, потому что а) он позволяет только перехватывать библиотечные вызовы и б) он позволяет только перехватывать библиотечные вызовы. ;)

A) Хотя в общем случае системные вызовы заключаются в общий libC в вашей системе, никто не мешает вам самим вызывать системный вызов, например, настроить правильное содержимое регистра и затем выполнить INT 0x80 в системе x86 , Если программа, которая вас интересует, делает это, вы никогда не поймаете тех, кто использует libc-interposition на основе LD_PRELOAD.

B) Хотя в целом большинство программ используют общую библиотеку libC в вашей системе для выполнения системных вызовов, иногда приложения статически связаны, что означает, что код libC является частью приложения и не поступает из разделяемой библиотеки lib. В таких случаях LD_PRELOAD также не помогает.

В комментарии уже предлагалось использовать strace / ltrace - мой общий совет - взглянуть на ptrace (), который используют оба эти инструмента и который должен дать вам то, что вы хотите, без необходимости изменения ядра.

0 голосов
/ 04 июня 2011

Я почти уверен, что единственный способ сделать это - изменить таблицу системных вызовов. Системы HIDS (такие как Samhain) будут сообщать об этом как о вторжении, и разработчики ядра Linux не одобряют это. Детали реализации очень специфичны для ОС (то есть то, что работает во FreeBSD, не обязательно будет работать в Linux), но общие детали реализации будут такими же. Модуль ядра может быть лучшим способом использования более чистых, более стандартизированных API.

...