как можно подменить вызов функции используя ptrace. Насколько мне известно с elf подгружается секция .got в которой хранятся адреса библиотечных функций. как её найти? и куда имеет смысл записать свой код. Стоит ли так делать?: скопировать себе старый код. вставить код c mmap увеличивающий размер памяти, вернуть старый код. добавить в новый выделенный кусок свой код.
я думаю проще всего заинжектить .so, и уже в нем сделать все необходимые перехваты... как инжектить .so можно прочитать на phrack... кстати вопрос в тему... есть ли какой-нить способ из .so-библиотеки узнать базовый адрес, по которому был замаппен elf-файл процесса? (кроме парсинга /proc/self/maps)... адреса функций можно по программному заголовку поискать...
andrewiv Гораздо проще сделать это через LD_PRELOAD. Rel Я сейчас не помню деталей, но эта ф-ия должна помочь.
для легитимных проектов да)) для других - слишком известная и палевная тема)) в рантайме это интереснее делать, но канеш ptrace тоже уже давно и широко известна)) да... я в принципе и сам могу по списку загрузщика прогуляться, в этом нет ничего сложного... я не так давно делал вызов функции из шареного объекта по хешу её имени, там примерно тоже самое... но как до этого списка добраться? я начинал парсинг с элф-заголовков по базовому адресу и дальше по структурам... на тот момент просто захардкодил базовый адрес... спасибо, посмотрю исходники из какой-нить glibc или dietlib через пару дней, пока нет доступа к линуксовой тачке)))
Rel Не совсем понял, в чем именно заключается проблема прогуляться по списку загрузчика? Опять же, я сейчас не помню всех деталей, но суть в том, что при загрузке библиотеки, вызвавший код получает что-то типа HANDLE, который по сути является адресом структуры, описывающей загруженный объект. Этот же адрес можно найти в GOT. Объекты связаны двунаправленным списком, по которому можно довольно легко гулять. Для glibc 2.9 структура находится в файле glibc-2.9\include\link.h, называется link_map. Ее 'light' версия, которую, вероятно, можно получить с помощью какого-то вызова, можно найти в файле glibc-2.9\elf\link.h. В обеих версиях есть необходимые для обхода цепочки члены: Код (Text): ElfW(Addr) l_addr; /* Base address shared object is loaded at. */ char *l_name; /* Absolute file name object was found in. */ ElfW(Dyn) *l_ld; /* Dynamic section of the shared object. */ struct link_map *l_next, *l_prev; /* Chain of loaded objects. */