Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Защита ELF от LD_PRELOAD

#cpp #linux #elf


Имеется исполняемый ELF файл «glinkd». Мне необходимо дополнить реализацию некоторых
функций, посредством их перехвата. Попался под руку удобный инструмент LD_PRELOAD.
Он прекрасно отрабатывает на любых elf файлах, но к несчастью, необходимый для меня
файл патчить он отказался. Это выражается в том, что при подгрузки моей библиотеки
в «glinkd», попросту ничего не происходит, как будто на этом файле имеется какая то защита.

В гугле ничего про защиту от LD_PRELOAD я не нашел.

Как я патчу elf файлы:


testso.cpp:

#include 

void __attribute__ ((constructor)) module_load(void);
void __attribute__ ((destructor)) module_unload(void);

void module_load(void)
{
    printf("hello from .so!\n");
}

void module_unload(void)
{
}


Компилирую:

g++ -fPIC -c testso.cpp -o testso.o -m32 -std=c++0x
  g++ -shared -Wl,-soname,libtestso.so -o libtestso.so testso.o -m32 -std=c++0x
test_prog.cpp:

#include 

int main()
{
    printf("Hello from executable!\n");
}


Компилирую:

g++ -o test_prog test_prog.cpp -m32
Патчим test_prog:

root@ubuntu:/home/glinkd# LD_PRELOAD=/home/glinkd/libtestso.so ./test_prog
hello from .so!
Hello from executable!
root@ubuntu:/home/glinkd# 

Патчим glinkd:

root@ubuntu:/home/glinkd# LD_PRELOAD=/home/glinkd/libtestso.so ./glinkd
Usage: ./glinkd configurefile section_num
root@ubuntu:/home/glinkd#



Как видим, наша .so просто игнорируется. Есть идеи что это за защита, и как ее можно
снять?
    


Ответы

Ответ 1



Из комментария пользователя @Mike: Это невозможно. Чтобы LD_PRELOAD сработал, надо, чтобы его кто то задействовал, а его задействует динамический загрузчик. Но он работает только с динамически собранными исполняемыми файлами. Работа при статической компоновке возможна только самостоятельной загрузкой требуемого ELF в свое адресное пространство.

Комментариев нет:

Отправить комментарий