LINUX.ORG.RU

Сделать fake path


0

0

Есть программа, которая в процессе своего исполнения вызывает еще одну стороннюю программу, расположенную по четкому фиксированному пути. Но эта программа там отсутствует, но зато она расположена у меня в homedir.

Интересует, можно ли какими-нибудь средствами без правки hex-редактором бинарника, сделать для основной программы fake path вида: /usr/closer_program/bin/ -> /home/user/closer_program/bin/

?

Программы проприетарные. И городить огород с созданием среды chroot для основной настроенной программы, тоже желания не имею. Спасибо.

anonymous

Ответ на: комментарий от dreamer

Гуру, да? <_<

Сам знаю прекрасно про ``ln'', но админских прав не имею.

anonymous
()

Теоретически, имея в своём распоряжении такой мощный инструмент, как LD_PRELOAD, можно сделать и не такое. Практически, это надо писать на сях, а судя по тональности вопроса автор топика не потянет (могу ошибаться).

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

> Теоретически, имея в своём распоряжении такой мощный инструмент, как LD_PRELOAD, можно сделать и не такое.

О! Спасибо за название. Если не найду готового, буду пробовать сам писать. man ld.so уже начал читать :).

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

Суть в том, что надо будет подменить execve или чем там эта внешняя программка вызывается, на свою функцию, которая будет проверять имя файла, и если это неправильный файл, то заменять его на правильный. :) Ну и вызывать настоящий execve.

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

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

> Суть в том, что надо будет подменить execve или чем там эта внешняя программка вызывается, на свою функцию, которая будет проверять имя файла, и если это неправильный файл, то заменять его на правильный. :) Ну и вызывать настоящий execve.

Спасибо. Но в действительно там еще грабли вылезли. Этот путь возвращается функцией из плагина, который подгружается при запуске. Теперь мне смутно не понятно, как сделать replace этой функции через LD_PRELOAD. Ибо насколько я понимаю, конкретно эта функция из плагина дергается с помощью dlsym(), что, возможно, исключает подмену кода :-\.

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

fakeroot, fakechroot

Все уже укра^H придумано до нас.

anonymous
()

#define _GNU_SOURCE

#include <dlfcn.h>

#define LEVAYA_PROGA "/usr/bin/blablabla"
#define MOYA_PROGA "/usr/bin/my_blablabla"

static void init (void) __attribute__ ((constructor));

static int (*old_execve)() = 0;

static void init(void)
{
        old_execve = (int (*)()) dlsym(RTLD_NEXT, "execve");
}

int execve(const char *filename, char *const argv [], char *const envp[])
{
        if (strcmp("/bin/blablabla", "/bin/l") == 0) {
                return old_execve(MOYA_PROGA, argv, envp);
        }
        return old_execve(filename, argv, envp);
}

Вот как-то так. Если не работает - запости сюда
вывод strace и ltrace, что-нибудь придумаем.

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

> Вот как-то так. Если не работает - запости сюда вывод strace и ltrace, что-нибудь придумаем.

За исходник спасибо, я сам догадался как его писать ;). Но пообщавшись со знакомым системным unix-программистом, он мне рекоммендовал не делать этот костыль, а не полениться сделать хак плагина (правка путя).

Всем спасибо за помощь.

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

> Было бы интересно послушать аргументацию.

По сути, идея сводится к тому, что нет смысла подгружать (да и писать) стороннюю библиотеку с написанным хуком, ради того, что бы подменять всего-лишь один path. Собственно он прав -- путь в том плагине прописан явно. Почему бы явно его и не заменить?

Кстати. Документация рулит. А именно, товарищ(и) этого плагина не удосужились написать к ней хотя бы небольшого мануала. Экспериментальным путем был найден xml-конфиг (sic!) для этого плагина, в котором можно указывать альтернативный path to the dir ;).

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