LINUX.ORG.RU

перехват dlsym()


0

0

это можно организовать без ручного разбора импортов, hijacking и ты пы? я в курсе RTLD_NEXT, но в случае dlsym() получается, что надо её уже иметь откуда-то. если из самой libld, то и все остальные дёргают оттуда (libdl первее моей либы загружена). если грузить libdl позже — а я тогда где возьму dlsym()? %-)

заранее благодарю всех, кто захочет сказать «а зачем? ты поясни, зачем надо, и мы скажем, что оно не надо». надо. надо перехватывать некоторые функции в системной библиотеке, которая может быть загружена в процессе работы программы — через dlopen().

tnx.


Ну если тебе надо, то сиди и думай :))

p.s. капча haikers

anonymous
()

попробуй так:

1. либа в которой перехватывается и обрабатывается этот вызов (dlsym)
2. переменную окружения LD_PRELOAD установи в путь к этой либе

man ld

вроде должно работать

generatorglukoff ★★
()
Ответ на: комментарий от generatorglukoff

знаю я, что есть LD_PRELOAD. оно всё круто работает, пока не надо хватать саму dlsym(). вот тут-то начинается веселье — dlsym() используется, чтобы получить «оригинальную» точку входа (с RTLD_NEXT). и приходим к тому, что я сумбурно описал в вопросе: как получить точку входа на оригинальную dlsym(), если для этого нужно знать оригинальную точку входа на dlsym()? %-)

очень как-то неохота делать это через анус. хочется чего-то процессорно-независимого…

mirage
() автор топика
Ответ на: комментарий от anonymous

риторический вопрос: почему анонимы в большинстве своём такие тупые?

ты уроки-то сделал? быстро выдерни сетевой шнур и иди учиться. когда выучишься, убогое, тогда вякай.

домашнее задание: найти в винде штатный аналог dlsym() с флажком RTLD_NEXT. пока не найдёшь — молчать, не жрать, не трахаться. авось вымрешь. ты — лишний.

mirage
() автор топика
Ответ на: комментарий от mirage

Я немного не понял, зачем использовать RTLD_NEXT. Я бы попробовал в LD_PRELOAD переопределить dlsym. В переопределенной функции мы сможем получить "оригинальную" точку входа на dlsym. Для этого откроем явно libdl.so через dlopen. А все ваши функции будут дергать переопределенный вами dlsym. На практике не проверял, но по теории должно работать

Chumka ★★★
()
Ответ на: комментарий от Chumka

ага. щаз. смотрите: у меня определена dlsym(). я делаю dlopen() (пусть она не переопределена, хоть это и не так). теперь мне надо вызвать оригинальную dlsym(), чтобы получить адрес оригинальной dlsym() (не забываем — у меня dlsym() переопределена, так что…). %-)

понимаете, функции не мои. функции — чужой программы. которую поправить нельзя. программа где-то в процессе работы грузит libXYZ, и берёт из неё функцию ZYX(). логично, что сразу «перекрыть» я не могу — плевать программа хотела на мои перекрытия, если она грузит как LOCAL и пользуется dlsym(), так? потому: мне надо перекрыть сами оригинальные dlopen()/dlsym(). и вот тут грозно приходит капец: чтобы получить адрес оригинальной dlsym() для моего перехватчика (chaining), мне надо уже иметь адрес оригинальной dlsym().

я, конечно, могу сделать системо-зависимый хак, но это плохой вариант. мне надо, чтобы работало на куче версий линукса, при этом на x86, x86_64 и PPC.

в винде я делал тупой hijacking LoadLibraryW()/GetProcAddress() (т.е. берём хэндл kernel32.dll, находим адрес функции, патчим машкод). конечно, никто мне не мешает сделать то же самое и сейчас, но я уже там имел радость адаптации этой беды под x86_64. а тут ещё PPC появились. возможно, будут и ARM. не хочется (хоть, видно, и придётся) делать по дизасму на каждую архитектуру, хотелось бы как нибудь и на ёлку, и не оцарапаться… %-)

mirage
() автор топика

Я конечно не очень силён в программировании, но разве so-шки нельзя грузить строго по оперделённому адресу?

anonymous
()
Ответ на: комментарий от anonymous

а если «строго определённый адрес» уже занят? я же говорю: софтина не моя. в принципе — любая софтина. возможно, без исходников. что она там себе внутри делает — загадка. чем тут поможет такая возможность?

зыж штатно — нельзя, афаик. можно только «порекомендовать» системе, что «лучше бы сюда, но ты, конечно, умней, тебе видней…»

mirage
() автор топика
Ответ на: комментарий от mirage

А заменить libdl.so своей нельзя?

anonymous
()
Ответ на: комментарий от kmeaw

2анонимус: нельзя. 2kmeaw: это то же самое, что и тупо патчить код: для каждой системы надо смотреть, не навертели ли случайно авторы чего. не проблема мне распарзить ELF, если надо. неохота. хочу на ёлку не оцарапавшись. %-)

я понимаю, что проблема выглядит идиотской, и моё нежелание «сделать ручками» тоже. я могу ручками. я просто не хочу пропустить что-то, что меня от этого избавит. вдруг да есть такое? %-)

mirage
() автор топика
Ответ на: комментарий от mirage

А если написать написать маленькую прожку которая сначала грузит libmydl, потом системную libdl, настраивается а потом форком грузит нужную прогу? Либы ведь останутся в памяти? Я тот анонимус что слаб в програмировании, так что ногами не пинайте.

anonymous
()
Ответ на: комментарий от anonymous

а это выше уже предлагали — эмулятор dlopen()/dlsym(). в любом другом случае «маленькая прожка» должна быть слинкована с libdl. это раз.

два: форком никого загрузить нельзя. %-) форк — это дубликат текущего процесса. чтобы кого-то запустить ещё — форкаются, потом замещают рабочий процесс другим. в процессе замещения загруженые библиотеки, естественно, выгружают, ресурсы освобождают и ты пы.

в общем, ерунда получается. но так как просили не пинать, я не пнул, а попытался расписать, отчего оно ерунда. %-) надеюсь, получилось более-менее понятно. за остальным — в маны, как обычно. %-)

mirage
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.